兼容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));
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值