动态加载CBitmap

时间:2010-01-19 05:05:43

标签: mfc visual-c++

我有一个想要动态加载的Bitmap图像。但是我无法加载它。

CBitmap bmp;

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

它似乎没有起作用。 有人可以帮助我。

感谢。

8 个答案:

答案 0 :(得分:13)

你也可以尝试这样的事情:

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

答案 1 :(得分:3)

根据CBitmap文档:LoadBitmap()函数获取位图的资源标识符或位图的资源ID。

您无法指定位图文件的路径。

E.g。

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

并确保resource.h没有MYBMP的任何条目,否则在预处理期间它被id替换,最终LoadBitmap()将失败,因为应用程序无法找到资源FindResource()失败。

现在这样做:

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

肯定会加载位图。

答案 2 :(得分:1)

要从文件加载位图,您希望LoadImage使用LR_LOADFROMFILE标记。

答案 3 :(得分:1)

CBitmap不支持直接从.bmp文件中读取。您可以使用其他答案中建议的CImage类。您需要在代码中加入atlimage.h才能使CImage正常工作:

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

另一种方法是使用LoadImage Win32 API加载图片,然后将CBitmap附加到该图片:

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

答案 4 :(得分:0)

CImage上次尝试/检查时无法使用png。看看CxImage - http://www.codeproject.com/KB/graphics/cximage.aspx

答案 5 :(得分:0)

这可能就像你忘记逃避反斜杠一样简单。 而不是

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

使用

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

否则,您将无效路径传递给LoadBitmap方法。

答案 6 :(得分:0)

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();
    }

}

答案 7 :(得分:0)

使用迄今为止提到的解决方案时,每次将CImage加载到CBitmap时,我都会使用CBitmap的成员变量来保持内存泄漏。我用以下代码解决了这个问题:

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());
}