Jea*_*ela 1 c++ winapi gdi bitmap
我想做一些我认为相当简单的事情,但由于我是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);
Run Code Online (Sandbox Code Playgroud)
我想你只需要对GDI做一些澄清.
DC正是其名称所暗示的:设备上下文.这只是一个背景,没有具体的.一些DC是真实图形设备的上下文,一些其他DC(存储器DC)是存储器中的虚拟图形表面的上下文.您创建的DC CreateCompatibleDC是内存DC,但创建DC只会创建上下文,而不是内存表面.正如MSDN文档所说:
在应用程序可以使用内存DC进行绘制操作之前,它必须在DC中选择正确宽度和高度的位图.
您需要将HBITMAP与DC关联.执行此操作后,您可以认为绘制到DC实际上是绘制到位图.内存DC是位图的"窗口".
一旦你理解了这一点,你就会发现你的程序可以大大缩短.如果您仍有问题,请随时发表评论.