【问题标题】:How to draw on given bitmap handle (C++ / Win32)?如何绘制给定的位图句柄(C++ / Win32)?
【发布时间】:2011-03-09 19:55:42
【问题描述】:

我正在编写一个获取位图句柄的非托管 Win32 C++ 函数,我需要在它上面绘图。

我的问题是,要绘制我需要获取设备上下文,但是当我执行 GetDC (NULL) 时,它会为我提供窗口的设备上下文! GetDC()的参数是窗口句柄(HWND),但我没有窗口;只是一个位图句柄。

如何在此位图上绘图?谢谢!

【问题讨论】:

    标签: c++ winapi bitmap handle draw


    【解决方案1】:

    除了 Pavel 的回答之外,“与屏幕兼容”也一直困扰着我,但由于 CreateCompatibleDC(NULL) 普遍用于此目的,我认为它是正确的。

    我认为“兼容”的东西只与 DDB 相关(DC 设置为在当前屏幕的正确 DDB 类型上写入),但不影响 DIB 上的读/写。

    因此,为了安全起见,如果您需要处理的位图不必临时显示在屏幕上,请始终使用 DIB 而不是 DDB,现在性能差异可以忽略不计。有关 DIB 和 DDB 的更多信息,请参阅here

    【讨论】:

      【解决方案2】:

      CreateCompatibleDC() 和 SelectObject() 把你的位图放进去。

      但是,并不是每个位图都可以选择到任何 DC 中。 您可能需要使用映射模式和内存 DC 的其他选项。

      【讨论】:

      • 但是 CreateCompatibleDC () 需要一个 HDC 作为参数。如果我有一个 HDC,我就不需要创建一个! (有什么我忽略的吗?)
      • CreateCompatibleDC 可以将 NULL 作为参数,将创建一个与应用程序屏幕兼容的内存 DC。然后,您可以 SelectObject 将您的位图放入其中,正如 Pavel 所说,您可以 CreateCompatibleBitmap() 然后将您的原始位图 BitBlt() 放入 DC。
      • 我正在尝试绘制 8bpp 位图。这当然与应用程序屏幕不兼容。这样的位图可以画吗?
      • 是的。还有其他 API 可以创建内存 DC。我认为它被称为 CreateDC。您不妨查看 win32 中的所有 DC API。
      • 嗯... CreateDC 需要我没有的参数,例如设备、驱动程序、端口和设备模式。有没有其他办法?
      【解决方案3】:

      在位图上绘制的基本 win32 范例是,您将位图选择到设备上下文中,之后,在该设备上下文上的所有绘制操作都存储在位图中。然后,您使用各种“blit”操作之一(例如 StretchBlt)将其传输到显示表面,这只是窗口客户区的设备上下文。

      其他人提供了更好的细节,这只是高级视图。

      【讨论】:

      • 感谢回复,但是我需要存储8bpp的图片,不兼容显示。这是问题的根源(不是双关语)。
      • @alankdkd:好吧,没有什么说您必须显示位图,但是您仍然可以使用 GDI 操作以这种方式在它们上绘图。如果您需要获取不寻常的像素组织,您可能需要查看 CreateDIBitmap() 或 CreateDIBSection()。
      【解决方案4】:

      嗯,这有点开箱即用.. 我猜.. 但我知道Graphics 可以return a HDCGraphicsBitmap 作为其ctor 的参数。 Bitmap 又可以是 created from a HBITMAP and a HPALETTE。这里唯一的问题是我不知道HPALETTE参数是否可以是NULL

      Graphics* g;
      Bitmap* bitmap;
      HBITMAP _bitmap;   // <- this one is yours
      
      bitmap = Bitmap::FromHBITMAP(_bitmap, NULL);
      g = new Graphics(bitmap);
      
      HDC hdc = g->GetHDC();
      
      // when done, call g->ReleaseHDC(hdc);
      

      但是,我强烈建议您也接收 HDC 作为函数的参数。我认为没有人会拥有 BITMAP 而没有 DC。
      如果您在寻找 HBITMAP 的 HDC 时遇到这些问题,其他人也会遇到这些问题。

      【讨论】:

      • 感谢您的建议,但这必须在非托管 Win32 中,(不幸的是)没有 Graphics 类。
      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      相关资源
      最近更新 更多