MFC-无法从资源输出BMP图像
MFC - Cannot output the BMP image from Resources
我想从资源中输出一个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);
}
如注释中所述,请勿在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
。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- C++,我正在尝试创建一个有效的.bmp输出文件
- MFC-无法从资源输出BMP图像