5

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

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

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

4

4 回答 4

2

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

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

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

于 2010-06-29T21:40:18.050 回答
1

CreateCompatibleDC() 和 SelectObject() 将您的位图放入其中。

然而,并不是每个位图都可以被选入任何 DC。您可能必须使用内存 DC 的映射模式和其他选项。

于 2010-06-29T20:11:22.303 回答
0

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

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

于 2010-06-29T21:54:32.857 回答
0

好吧,这有点开箱即用..我猜..但我知道它Graphics可以返回一个 HDC,并将GraphicsaBitmap作为其ctor的参数。ABitmap反过来可以从 HBITMAP 和 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 时遇到这些问题,其他人也会遇到这些问题。

于 2010-06-29T22:23:37.637 回答