【发布时间】:2011-03-09 19:55:42
【问题描述】:
我正在编写一个获取位图句柄的非托管 Win32 C++ 函数,我需要在它上面绘图。
我的问题是,要绘制我需要获取设备上下文,但是当我执行 GetDC (NULL) 时,它会为我提供窗口的设备上下文! GetDC()的参数是窗口句柄(HWND),但我没有窗口;只是一个位图句柄。
如何在此位图上绘图?谢谢!
【问题讨论】:
标签: c++ winapi bitmap handle draw
我正在编写一个获取位图句柄的非托管 Win32 C++ 函数,我需要在它上面绘图。
我的问题是,要绘制我需要获取设备上下文,但是当我执行 GetDC (NULL) 时,它会为我提供窗口的设备上下文! GetDC()的参数是窗口句柄(HWND),但我没有窗口;只是一个位图句柄。
如何在此位图上绘图?谢谢!
【问题讨论】:
标签: c++ winapi bitmap handle draw
除了 Pavel 的回答之外,“与屏幕兼容”也一直困扰着我,但由于 CreateCompatibleDC(NULL) 普遍用于此目的,我认为它是正确的。
我认为“兼容”的东西只与 DDB 相关(DC 设置为在当前屏幕的正确 DDB 类型上写入),但不影响 DIB 上的读/写。
因此,为了安全起见,如果您需要处理的位图不必临时显示在屏幕上,请始终使用 DIB 而不是 DDB,现在性能差异可以忽略不计。有关 DIB 和 DDB 的更多信息,请参阅here。
【讨论】:
CreateCompatibleDC() 和 SelectObject() 把你的位图放进去。
但是,并不是每个位图都可以选择到任何 DC 中。 您可能需要使用映射模式和内存 DC 的其他选项。
【讨论】:
CreateCompatibleDC 可以将 NULL 作为参数,将创建一个与应用程序屏幕兼容的内存 DC。然后,您可以 SelectObject 将您的位图放入其中,正如 Pavel 所说,您可以 CreateCompatibleBitmap() 然后将您的原始位图 BitBlt() 放入 DC。
在位图上绘制的基本 win32 范例是,您将位图选择到设备上下文中,之后,在该设备上下文上的所有绘制操作都存储在位图中。然后,您使用各种“blit”操作之一(例如 StretchBlt)将其传输到显示表面,这只是窗口客户区的设备上下文。
其他人提供了更好的细节,这只是高级视图。
【讨论】:
嗯,这有点开箱即用.. 我猜.. 但我知道Graphics 可以return a HDC 和Graphics 将Bitmap 作为其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 时遇到这些问题,其他人也会遇到这些问题。
【讨论】: