开发者

Load a CBitmap dynamically

I have a Bitmap image that i want to load dynamically. 开发者_Go百科But I am unable to load it.

CBitmap bmp;

bmp.LoadBitmap("c:\\aeimg");

it does not seem to be working. Can someone please help me.

Thanks.


You can also try something like this:

CImage image;
image.Load(_T("C:\\image.png"));
CBitmap bitmap;
bitmap.Attach(image.Detach());


According to CBitmap documentation: LoadBitmap() function takes resource identifier of the bitmap or resource id of the bitmap.

You can't specify the path of the bitmap file.

E.g.

MyProject.rc
------------
MYBMP      BITMAP  "res\myimage.bmp"

and make sure that resource.h does not have any entry of MYBMP otherwise during preprocessing its replaced by id and ultimately LoadBitmap() will fail since application can't locate the resource as FindResource() fails.

Now do this :

CBitmap bmp;
bmp.LoadBitmap(L"MYBMP");

It will definitely load the bitmap.


To load a bitmap from a file, you want to use LoadImage with the LR_LOADFROMFILE flag.


CBitmap doesn't support directly reading from a .bmp file. You can instead make use of CImage class as suggested in other answers. You'll need to include atlimage.h in your code to make CImage work:

#include <atlimage.h>
:
CImage img;
img.Load (_T("C:\\image.bmp"));
CBitmap bitmap;
bitmap.Attach(img.Detach());

Another way is to load the image using LoadImage Win32 API and then attaching CBitmap to that:

HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"c:\\image.bmp", 
                                      IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (hBitmap != NULL) 
   bitmap.Attach(hBitmap);


CImage doesn't work with png last time I tried / checked. Have a look at CxImage - http://www.codeproject.com/KB/graphics/cximage.aspx .


It could be as simple as you forgetting to escape the backslash. Instead of

bmp.LoadBitmap("c:\aeimg");

use

bmp.LoadBitmap("c:\\aeimg");

Otherwise you're passing an invalid path to the LoadBitmap method.


CString filename;
TCHAR szFilter[] = _T("Bitmap (*.bmp)|*.bmp|PNG (*.png)|*.png||");

CFileDialog selDlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT | OFN_EXTENSIONDIFFERENT, szFilter, this);


if (selDlg.DoModal() == IDOK)
{
    filename = selDlg.GetPathName();

    CImage image;

    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);


    if (hBitmap)
    {
    // Delete the current bitmap
    if (m_bmpBitmap.DeleteObject())
        m_bmpBitmap.Detach();   // If there was a bitmap, detach it

    // Attach the currently loaded bitmap to the bitmap object
    m_bmpBitmap.Attach(hBitmap);

    Invalidate();
    }

}


When using the solutions mentioned to date, with a member variable of CBitmap I kept getting memory leaking every time I loaded the CImage onto the CBitmap. I solved this with the following code:

CString _fileName(/*Path to image*/);
CImage _image;          
HRESULT hr = _image.Load(_fileName);
if (SUCCEEDED(hr)) {
    if (m_Display.m_bmpImage.DeleteObject())
        m_Display.m_bmpImage.Detach();              
    m_bmpImage.Attach(_image->Detach());
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜