MFC - 无法从资源输出 BMP 图像
Posted
技术标签:
【中文标题】MFC - 无法从资源输出 BMP 图像【英文标题】:MFC - Cannot output the BMP image from Resources 【发布时间】:2016-11-30 15:42:22 【问题描述】:我想从资源中将 BMP 图像输出到对话框或屏幕上。
代码如下:
void CMainDlg::OnPaint()
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CDC *pDC;
pDC = this->GetDC();
HDC hDC = pDC->m_hDC;
HDC hmemdc = CreateCompatibleDC(hDC);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
BitBlt(hDC,0,0,BitMap.bmWidth,BitMap.bmHeight,hmemdc,0,0,SRCCOPY);
DeleteDC(hmemdc);
DeleteObject(bitmap);
我确定 BMP 图像文件已导入到资源中,并将其 ID 命名为“IDB_BITMAP1”。
但它不输出任何东西。
有什么问题?
编辑:
修改后:
void CMainDlg::OnPaint()
CBitmap bitmap;
bitmap.LoadBitmap(IDB_COVER);
CPaintDC dc(this);
HDC hDC = dc.m_hDC;
HDC hmemdc = CreateCompatibleDC(hDC);
SelectObject(hmemdc,&bitmap);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
BitBlt(hDC,0,0,BitMap.bmWidth,BitMap.bmHeight,hmemdc,0,0,SRCCOPY);
DeleteDC(hmemdc);
DeleteObject(bitmap);
【问题讨论】:
基本 GDI 知识。您需要将 bmp 选择到 mem-dc 中,此外,您可能不会调用 GetDC() 进行绘画(响应 WM_PAINT 消息),而是调用 BeginPaint()/EndPaint()(或在 MFC 中使用 CPaintDC)。 @Constantine Georgiou 我已经尝试过你的建议,修改后的代码就像上面一样,但它仍然没有输出任何东西。它有什么问题? 【参考方案1】:如 cmets 中所述,请勿在 OnPaint()
中使用 GetDC
。
对于::SelectObject
,用法为::SelectObject(hmemdc, bitmap.GetSafeHandle())
::SelectObject
是WinAPI函数,它不知道如何处理CBitmap
指针,所以::SelectObject(hmemdc, &bitmap)
会失败。
DeleteObject(bitmap)
不是必需的,因为CBitmap
会自动清理。
在 MFC 中,这是一种更好的方法:
void CMainDlg::OnPaint()
CPaintDC dc(this);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_COVER);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap *oldbmp = memdc.SelectObject(&bitmap);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
dc.BitBlt(0, 0, BitMap.bmWidth, BitMap.bmHeight, &memdc, 0, 0, SRCCOPY);
dc.SelectObject(oldbmp);
在内存 DC 中选择位图时,保留对前一个位图 (oldbmp
) 的引用,然后使用 dc.SelectObject(oldbmp)
取消选择该位图,以便可以安全地删除 bitmap
。
【讨论】:
以上是关于MFC - 无法从资源输出 BMP 图像的主要内容,如果未能解决你的问题,请参考以下文章
使用 MFC 在 MS Visual C++ 2008 中处理 .bmp 图像时出现颜色问题