Winapi 获取hbitmap的指定部分。

Winapi 获取hbitmap的指定部分。,winapi,visual-c++,bitmap,Winapi,Visual C++,Bitmap,有一个HBITMAP可以成功显示。我想得到位图的一部分(由rect指定),下面的代码也是如此,但返回的位图总是黑色的。代码有问题吗?谢谢 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_ds

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

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;}

我找到了原因,改变了

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


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

源位图是DDB还是DIB?在源HDC中选择位图时,
SelectObject()
是否返回NULL?在销毁HDC之前,您也没有保存和还原源HDC的原始位图。将
BitBlt
放在
ASSERT
宏中会在发布版本中编译为无操作。问题不同:创建内存DC,其“显示表面正好是一个单色像素宽,一个单色像素高。”创建兼容位图将创建一个单色位图。您的解决方案有效,因为在调用
CreateCompatibleBitmap
之前,您在
l_srcDC
中选择了一个合适的(颜色)位图。
HBITMAP l_newBitmap = CreateCompatibleBitmap(l_srcDc, width, height);