首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >winapi:从HDC到HBITMAP

winapi:从HDC到HBITMAP
EN

Stack Overflow用户
提问于 2015-06-23 08:24:50
回答 1查看 2.1K关注 0票数 1

我想做一些我认为相当简单的事情,但由于我对维纳皮并不熟悉,所以我发现了很多问题。基本上,我有一个HDC (我是一个加载的位图中的BitBlitting ),我在上面画一个矩形。然后,我想把这个HDC放到一个新的HBITMAP对象上,但是现在却没有用。

这是我几个小时来一直在努力工作的代码

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-23 08:59:49

我想你只需要澄清一下GDI。

DC正是它的名称所暗示的:设备上下文。这只是一个背景,没有具体的内容。有些DC是真实图形设备的上下文,另一些(内存DC)是内存中虚拟图形表面的上下文。使用CreateCompatibleDC创建的DC是内存DC,但是创建DC只创建上下文,而不是内存面。正如MSDN文档所述:

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

你需要把HBITMAP和DC联系起来。在这样做之后,您可以考虑到DC的绘图实际上是绘制到位图。内存DC是位图的“窗口”。

一旦你明白了这一点,你就会发现你的程序可以大大缩短。如果你仍然有问题,可以发表意见。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30997547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档