【问题标题】:Get the specified part of an hbitmap.获取 hbitmap 的指定部分。
【发布时间】: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


【解决方案1】:

找到原因,改

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

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

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

【讨论】:

  • 问题是不同的:CreateCompatibleDC 创建了一个内存 DC,其 “显示表面正好是一个 单色 像素宽和一个单色像素高。” 创建一个兼容的位图将创建一个单色 位图。您的解决方案有效,因为在调用CreateCompatibleBitmap 之前,您在l_srcDC 中选择了适当的(颜色)位图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多