C++ 如何在给定的位图句柄(C+;+;/Win32)上绘制?

C++ 如何在给定的位图句柄(C+;+;/Win32)上绘制?,c++,winapi,bitmap,handle,draw,C++,Winapi,Bitmap,Handle,Draw,我正在编写一个非托管的Win32 C++函数,它得到一个位图的句柄,我需要画它。< /P> 我的问题是,为了绘制,我需要获取一个设备上下文,但是当我获取GetDC(NULL)时,它会为窗口提供一个设备上下文!GetDC()的参数是一个窗口句柄(HWND),但我没有窗口;只是一个位图句柄 如何在这个位图上绘制?谢谢 CreateCompatibleDC()并选择Object()将位图插入其中 但是,并非每个位图都可以选择到任何DC中。 您可能需要使用映射模式和内存DC的其他选项。除了Pavel的答

我正在编写一个非托管的Win32 C++函数,它得到一个位图的句柄,我需要画它。< /P> 我的问题是,为了绘制,我需要获取一个设备上下文,但是当我获取GetDC(NULL)时,它会为窗口提供一个设备上下文!GetDC()的参数是一个窗口句柄(HWND),但我没有窗口;只是一个位图句柄

如何在这个位图上绘制?谢谢

CreateCompatibleDC()并选择Object()将位图插入其中

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

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

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


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

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


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

好吧,这有点不合时宜。。我想。。但我知道
图形
可以,而且
图形
可以将
位图
作为其参数。可以依次创建
位图
。这里唯一的问题是我不知道
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);
Graphics*g;
位图*位图;
HBITMAP _位图;//GetHDC();
//完成后,调用g->ReleaseHDC(hdc);
但是,我希望您也能收到HDC作为函数的参数。。我不认为任何人都会有位图而没有DC。

如果您在查找HBITMAP的HDC时遇到这些问题,其他人也会遇到这些问题。

但是CreateCompatibleDC()将HDC作为参数。如果我有一个HDC,我就不需要创建一个!(有什么我忽略的吗?
CreateCompatibleDC
可以将NULL作为参数,并将创建与应用程序屏幕兼容的内存DC。然后你可以选择Object你的位图,就像Pavel说的,你可以创建CompatibleBitmap(),然后BitBlt()你的原始位图进入DC。这当然与应用程序屏幕不兼容。可以在这样的位图上绘制吗?可以。还有其他API可以创建内存DC。我想它叫CreateDC。您可能希望查看win32.Hmm中的所有DC API。。。CreateDC需要我没有的参数,比如设备、驱动程序、端口和设备模式。还有其他方法吗?谢谢你的建议,但这必须在非托管Win32中进行,很遗憾,它没有图形类。谢谢你的回复,但我需要存储8bpp图像,这些图像与显示器不兼容。这就是问题的根源(不是双关语)。@alankdkd:没有人说你必须显示位图,但你仍然可以使用GDI操作以这种方式绘制位图。如果需要获得不寻常的像素组织,您可能需要查看CreateDIBitmap()或CreateDIBSection()。