我想在资源的对话框或屏幕上输出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图像文件已导入到Resources中,并将其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);
}
答案 0 :(得分:0)
如评论中所述,请勿在{{1}}中使用GetDC
。
对于OnPaint()
,使用情况为::SelectObject
::SelectObject(hmemdc, bitmap.GetSafeHandle())
是WinAPI函数,它不知道如何处理::SelectObject
指针,因此CBitmap
将失败。
::SelectObject(hmemdc, &bitmap)
不是必需的,因为DeleteObject(bitmap)
会自动清除。
在MFC中,这是一种更好的方法:
CBitmap
在内存DC中选择位图时,请保留对前一位图(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);
}
)的引用,然后取消选择该位图oldbmp
,以便可以安全删除dc.SelectObject(oldbmp)
。