昨天在论坛上看到有人因为绘图出现错误而求助,感觉其中对于兼容DC和兼容位图的问题,很多人(包括我)都不是很清楚,经常犯错误(比如画出来的图只有黑白二色),于是把之前的一些总结共享出来。
兼容DC 和 兼容位图 概念和作用我就不再介绍了,网上一搜一大堆,主要将我用CPPUnit做单元测试的代码贴出来,大家就清楚了。
//总结:创建兼容位图时,★不能★使用才创建好的内存兼容DC
void CFTLGdiTester::test_CompatibleBitmap()
{
BOOL bRet = FALSE;
HBITMAP hDesktopBmp = NULL;
BITMAP bmpInfo = {0};
//创建和桌面DC的兼容位图 -- 支持32位真彩
hDesktopBmp = ::CreateCompatibleBitmap(m_hDesktopDC, 10,10); //此处等价于 ::CreateCompatibleBitmap(NULL, 10, 10);
::GetObject(hDesktopBmp, sizeof(bmpInfo), &bmpInfo);
CPPUNIT_ASSERT(40 == bmpInfo.bmWidthBytes
&& 1 == bmpInfo.bmPlanes
&& 32 == bmpInfo.bmBitsPixel);
//创建和桌面兼容的内存DC,并在其基础上创建兼容位图 -- 由于内存DC中没有选入位图,因此兼容位图只支持最基本的黑白两色
HDC hMemDcFromDesktop = ::CreateCompatibleDC(m_hDesktopDC);
HBITMAP hMemDCBmp = ::CreateCompatibleBitmap(hMemDcFromDesktop, 10,10);
::GetObject(hMemDCBmp, sizeof(bmpInfo), &bmpInfo);
CPPUNIT_ASSERT(2 == bmpInfo.bmWidthBytes
&& 1 == bmpInfo.bmPlanes
&& 1 == bmpInfo.bmBitsPixel);
::DeleteObject(hMemDCBmp);
//将创建好的32位兼容位图选入兼容内存DC,然后重新创建兼容位图 -- 此时兼容位图也能支持32位真彩
HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDcFromDesktop, hDesktopBmp);
hMemDCBmp = ::CreateCompatibleBitmap(hMemDcFromDesktop, 10,10);
API_VERIFY(0 != ::GetObject(hMemDCBmp, sizeof(bmpInfo), &bmpInfo));
CPPUNIT_ASSERT(40 == bmpInfo.bmWidthBytes
&& 1 == bmpInfo.bmPlanes
&& 32 == bmpInfo.bmBitsPixel);
API_VERIFY(::DeleteObject(hMemDCBmp));
API_VERIFY(::DeleteDC(hMemDcFromDesktop));
API_VERIFY(::DeleteObject(hDesktopBmp));
}