Mfc 动态加载CBitmap

Mfc 动态加载CBitmap,mfc,visual-c++,Mfc,Visual C++,我有一个位图图像,我想动态加载。但我无法加载它 CBitmap bmp; bmp.LoadBitmap("c:\\aeimg"); 它似乎不起作用。 谁能帮帮我吗 谢谢。要从文件加载位图,您需要使用带有LR\u LOADFROMFILE标志的LoadImage。您也可以尝试以下方法: CImage image; image.Load(_T("C:\\image.png")); CBitmap bitmap; bitmap.Attach(image.Detach()); 上次我尝试/检查时,

我有一个位图图像,我想动态加载。但我无法加载它

CBitmap bmp;

bmp.LoadBitmap("c:\\aeimg");
它似乎不起作用。 谁能帮帮我吗


谢谢。

要从文件加载位图,您需要使用带有
LR\u LOADFROMFILE
标志的
LoadImage

您也可以尝试以下方法:

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

上次我尝试/检查时,CImage无法使用png。请看一看CxImage-。

它可能很简单,因为您忘记了避开反斜杠。 而不是

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


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

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

无法指定位图文件的路径

例如

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

现在,请执行以下操作:

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

它肯定会加载位图。

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

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

使用到目前为止提到的解决方案时,使用CBitmap的成员变量,每次将CImage加载到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());
}

它支持bmp、jpg、gif和png。我必须查找它,从文件加载的角度来看,您是正确的。我的记忆来自于无法从资源中加载PNG,因为CImage::LoadFromResource()使用::LoadImage(),而load()使用GDI+。
#include <atlimage.h>
:
CImage img;
img.Load (_T("C:\\image.bmp"));
CBitmap bitmap;
bitmap.Attach(img.Detach());
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"c:\\image.bmp", 
                                      IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (hBitmap != NULL) 
   bitmap.Attach(hBitmap);
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();
    }

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