【问题标题】:GDI C/C++ - BITMAP into an existing HBITMAPGDI C/C++ - BITMAP 到现有的 HBITMAP
【发布时间】:2011-12-11 06:37:13
【问题描述】:

如何创建设备上下文兼容位图,然后将获得的句柄关联到 BITMAP 结构? 如果我写:

...
HBITMAP hbitmap = CreateCompatibleBitmap(hdc, width, height); // these three arguments are initialized somewhere else
hbitmap = CreateBitmapIndirect(bitmap); // argument already initialized and properly filled
...

创建一个与 hdc 兼容的 HBITMAP 句柄,然后初始化一个新的 HBITMAP(填充位图数据),但不保持其兼容性。是否有一个函数允许不从 BITMAP 创建 HBITMAP,而是用已经存在的 BITMAP 源填充初始化的 HBITMAP?

【问题讨论】:

  • 不清楚你在这里问什么。您无法更改现有的 HBITMAP,您所能做的就是创建一个具有所需特征的新 HBITMAP 并将位复制到其中。您还应该考虑使用与设备无关的位图。
  • 我不想更改现有的 HBITMAP,但我正在寻找一个函数,例如 'HBITMAP CreateCompatibleBitmapFromBitmap(HDC hDC, BITMAP *bitmap)'

标签: c++ bitmap gdi+ gdi hbitmap


【解决方案1】:

CopyImage函数

创建一个新图像(图标、光标或位图)并将指定图像的属性复制到新图像。如有必要,该函数会拉伸位以适应新图像的所需大小。

HANDLE WINAPI CopyImage(
  HANDLE hImage,
  UINT uType,
  int cxDesired,
  int cyDesired,
  UINT fuFlags
);

hImage 要复制的图像的句柄。

uType 要复制的图像类型。该参数可以是下列值之一。

  • IMAGE_BITMAP 0 复制位图。
  • IMAGE_ICON 1 复制一个图标。
  • IMAGE_CURSOR 2 复制光标。

cxDesired 图像的所需宽度,以像素为单位。如果该值为零,则返回的图像将具有与原始 hImage 相同的宽度。

cyDesired 图像的所需高度,以像素为单位。如果该值为零,则返回的图像将与原始 hImage 具有相同的高度。

fuFlags

【讨论】:

  • 谢谢,但它仍然不会将图像复制到设备兼容的 HANDLE(或兼容的 HBITMAP)中
  • @Stencil 我显然还是没能理解这个问题。如果您已经有两个兼容的 HANDLE,那么正如 Roman R. 所说,只需使用 BitBlt 从一个复制到另一个。 (如果它们不兼容,那么您仍然可以使用 StretchBlt。)
【解决方案2】:

CreateBitmapIndirect 在其输入中采用 BITMAP。你可以通过GetObjectHBITMAP获得它:

BITMAP Bitmap;
INT nResult = GetObject((HGDIOBJ) hBitmap, sizeof Bitmap, &Bitmap);

CreateBitmapIndirect 将能够从此结构创建位图。或者您可以使用CreateCompatibleBitmap 创建兼容的位图,从获得的Bitmap 提供宽度/高度。

【讨论】:

  • 感谢您的回答,但如果 HBITMAP 已经初始化,我必须用 BITMAP 填充 HBITMAP。 CreateCompatibleBitmap 不会从现有的 BITMAP 创建 HBITMAP。
  • 所以你创建了这个新的HBITMAP 然后BitBlt 来自原始位图的数据,你最终得到了一个完整的副本。这会好吗?您不能创建引用完全相同的基础数据的新位图对象,但使用BitBlt 制作图片副本非常简单。
猜你喜欢
  • 2010-09-26
  • 2011-06-02
  • 2012-09-08
  • 2012-12-12
  • 2018-12-25
  • 2014-08-29
  • 2013-02-23
  • 2012-11-13
相关资源
最近更新 更多