winapi: from HDC to an 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是位图的"窗口"。
一旦你明白了这一点,你就会发现你的程序可以大大缩短。如果您仍有问题,请随时发表评论。
相关文章:
- 在Windows上用C++裁剪HBITMAP
- 将 win32 hbitmap 转换为 winrt softwarebitmap
- N-API include an .so or dll
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何理解"abstract-declarator containing an ellipsis shall only be used in a parameter-declaration"
- 如何持续重复使用 HBITMAP 和 HDC?
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- C++线程"Call to non-static member function without an object argument"
- Atom gpp编译器给出"'C:UsersadminUser' is not recognized as an internal or..."错误
- 尝试在类中编译内核,出现错误"__init__() got an unexpected keyword argument 'kernel'"
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针
- HBITMAP 能否包含 alpha 通道信息?
- 如何修复" State Error (active) E0513 a value of type "const wchar_t *" cannot be assigned to an entity o
- C++ libtins "An invalid handle was specified"
- "terminate called after throwing an instance of std::invalid_argument' what(): stoi ?"
- Hash for a std::pair, for use in an unordered_map
- Divide et impera sum of the elements of an array bug
- 为什么"an inherited constructor is not a candidate for initialization from an expression of the same or
- winapi: from HDC to an HBITMAP