【发布时间】:2014-01-05 10:25:29
【问题描述】:
有一个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;}
【问题讨论】:
-
源位图是 DDB 还是 DIB?将位图选择到源 HDC 时,
SelectObject()是否返回 NULL?在销毁 HDC 之前,您也没有保存和恢复源 HDC 的原始位图。 -
将
BitBlt放在ASSERT宏中将编译为Release Build 中的无操作。
标签: winapi visual-c++ bitmap