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