兼容DC和兼容位图

昨天在论坛上看到有人因为绘图出现错误而求助,感觉其中对于兼容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));
}

扫描二维码关注公众号,回复: 1809296 查看本文章

猜你喜欢

转载自blog.csdn.net/fishjam/article/details/7400627