2014-01-05 55 views
0

有一个可以成功显示的HBITMAP。我想获得位图的一部分(由rect指定),下面的代码也是如此,但返回的位图始终为黑色。代码有问题吗?谢谢。获取hbitmap的指定部分。

HBITMAP GetSelectedBitmap(HBITMAP p_bitmap, int x, int y, int width, int height){ 

    HDC l_srcDc = ::CreateCompatibleDC(NULL); 
    ::SelectObject(l_srcDc, p_bitmap); 

    HDC l_dstDc = ::CreateCompatibleDC(l_srcDc); 

    HBITMAP l_newBitmap = CreateCompatibleBitmap(l_dstDc, width, height); 
    HBITMAP l_oldBitmap = (HBITMAP)::SelectObject(l_dstDc, l_newBitmap); 
    ASSERT(0 != ::BitBlt(l_dstDc, 0, 0, width, height, l_srcDc, x, y, SRCCOPY)); 
    HBITMAP l_clippedBitmap = (HBITMAP)::SelectObject(l_dstDc, l_oldBitmap); 
    ::DeleteDC(l_srcDc); 
    ::DeleteDC(l_dstDc); 
    return l_clippedBitmap;} 
+1

源位图是DDB还是DIB?当选择位图到源HDC时,SelectObject()是否返回NULL?在销毁HDC之前,您也不保存和恢复源HDC的原始位图。 –

+1

将'BitBlt'放入'ASSERT'宏中将在发布版本中编译为无操作。 – IInspectable

回答

0

我找到了原因,改变

HBITMAP l_newBitmap = CreateCompatibleBitmap(l_dstDc, width, height); 

HBITMAP l_newBitmap = CreateCompatibleBitmap(l_srcDc, width, height); 

解决问题。这意味着CreateCompatibleBitmap应该使用源DC。

+0

问题是另一个:['CreateCompatibleDC'](http://msdn.microsoft.com/en-us/library/windows/desktop/dd183489.aspx)创建一个内存DC,其*“显示表面是完全正确的一个**单色**像素宽和一个单色像素高。“*创建兼容的位图将创建一个**单色**位图。由于在调用'CreateCompatibleBitmap'之前,您在'l_srcDC'中选择了一个合适的(彩色)位图,因此您的解决方案可以正常工作。 – IInspectable