繁体   English   中英

winapi:从HDC到HBITMAP

[英]winapi: from HDC to an HBITMAP

我想做一些我认为很简单的事情,但是由于我是winapi的新手,所以发现了很多问题。 基本上,我有一个HDC(我是从已加载的位图进行BitBlitting),并在其上绘制一个矩形。 然后我想将HDC的BitBlt放到一个新的HBITMAP对象上,但是可惜现在还是无济于事。

这是我的代码,我已经尝试了几个小时

BITMAPINFO info;
Bitmap *tempbmp = Bitmap::FromFile(L"C:\\Users\\abelajc\\Pictures\\BackgroundImage.png", false);
HBITMAP loadedbackground;
tempbmp->GetHBITMAP(NULL, &loadedbackground);

HBRUSH hRed = CreateSolidBrush(RGB(255, 0, 0));

HDC pDC = GetDC(0);
HDC TmpDC = CreateCompatibleDC(pDC); //main DC on which we will paint on

HDC dcBmp = CreateCompatibleDC(TmpDC); //DC for the loadedbackground HBitmap
HGDIOBJ TmpObj2 = SelectObject(dcBmp , tempbmp); //Selecting Bitmap in DC
BitBlt(TmpDC, 0, 0, 512, 512, dcBmp, 0, 0, SRCCOPY);
SelectObject(dcBmp, TmpObj2); //Deselecting Bitmap from DC
DeleteDC(dcBmp);

RECT rectangle;
SetRect(&rectangle, 5, 5, 20, 20);
FillRect(TmpDC, &rectangle, hRed);

HDC hCompDC = CreateCompatibleDC(TmpDC);
HBITMAP hBmp = CreateCompatibleBitmap(TmpDC, 512, 512);
HBITMAP hOld = (HBITMAP)SelectObject(hCompDC, hBmp);
BitBlt(hCompDC, 0, 0, 512, 512, TmpDC, 0, 0, SRCCOPY);
SelectObject(hCompDC, hOld);
DeleteDC(hCompDC);

Bitmap *image = new Bitmap(hBmp, NULL);

我认为您只需要对GDI进行一些澄清。
DC正是其名称所隐含的含义:设备上下文。 这只是上下文,没有具体含义。 一些DC是实际图形设备的上下文,另一些DC(内存DC)是内存中虚拟图形表面的上下文。 使用CreateCompatibleDC创建的DC是内存DC,但是创建DC仅创建上下文,而不创建内存表面。 正如MSDN文档所说:

在应用程序可以使用内存DC进行绘制操作之前,它必须在DC中选择正确宽度和高度的位图。

您需要将HBITMAP与DC关联。 之后,您可以认为绘制到DC实质上是绘制到位图。 内存DC是位图的“窗口”。

一旦了解了这一点,您就会发现您的程序可以大大缩短。 如果您仍有问题,请随时发表评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM