c++ - Win32 - 为什么没有任何东西被绘制到屏幕上?

标签 c++ winapi

我正在尝试使用屏幕外缓冲区,以便我可以跟踪 WM_PAINT 之前/之后屏幕的变化,并通过 WM_PAINT 中的一行复制它们。这是我必须设置图形的一些代码:

hdc = GetDC(hWnd);
hdcmem = CreateCompatibleDC(hdc);
hbcmem = CreateCompatibleDC(hdcmem);

// Load bitmaps
bg = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BACKGROUND));
side = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SIDEINFO));
mainCont = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GAME_CONT));
if(bg == NULL || side == NULL || mainCont == NULL)
            ThrowError("A bitmap failed to load.");

// Background
hdcold = (HBITMAP)SelectObject(hbcmem, bg);
BitBlt(hdcmem, 0, 0, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237, 0, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237 * 2, 0, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 0, 196, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237, 196, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237 * 2, 196, 237, 196, hbcmem, 0, 0, SRCCOPY);

// Side Info
hdcold = (HBITMAP)SelectObject(hbcmem, side);
BitBlt(hdcmem, 339, 26, 154, 300, hbcmem, 0, 0, SRCCOPY);

// Main Game Container
hdcold = (HBITMAP)SelectObject(hbcmem, mainCont);
BitBlt(hdcmem, 26, 26, 300, 300, hbcmem, 0, 0, SRCCOPY);

hdc、hdcmem、hbcmem、hdcold、bg、side 和 mainCont 是先前声明的。它们的范围包括这个文件中的所有内容(包括这个代码和 WM_PAINT 中的代码)。

这是 WM_PAINT 中的代码:

PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);

BitBlt(hdc, 0, 0, 518, 401, hdcmem, 0, 0, SRCCOPY);

EndPaint(hWnd, &ps);

出于某种原因,屏幕上没有绘制任何内容。我正在绞尽脑汁想弄明白。非常感谢指向正确方向的指针。

最佳答案

首先为您的内存设备上下文创建一个兼容的位图,然后将该位图选择到内存 dc,它应该可以工作!

hdc = GetDC(hWnd); // used only to create compatibles.
hdcmem = CreateCompatibleDC(hdc);
hbcmem = CreateCompatibleDC(hdc);

// Create client-area-sized compatible bitmap.
RECT rc;
GetClientRect(hWnd, &rc);
HBITMAP hbm_memdc = CreateComptibleBitmap(hdc, rc.right, rc.bottom);
HBITMAP hbm_memdc_old = (HBITMAP)SelectObject(hdcmem, hbm_memdc)

ReleaseDC(hdc); // this no longer needed

// now start rendering into hdcmem... 

在关闭时销毁您的自定义位图句柄之前,您需要将旧的位图句柄选中并放回去。如何管理完全取决于您。

关于c++ - Win32 - 为什么没有任何东西被绘制到屏幕上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14099434/

相关文章:

c++ - 如何在 VSCode 上设置数据断点(即观察点)

windows - 如何从程序集正确调用 Windows API 方法

c++ - 每个显示器 DPI 感知 : black window glitch with NVIDIA Optimus

c++ - 尝试在 Windows 上重新启动打印机后台处理程序时,“net start spooler”失败并显示退出代码 2

c - ntdll.dll 中的 Winsock getaddrinfo 未处理的异常/崩溃

c++ - 使用 C++ 驱动程序在 mongoDB 中使用 $elemMatch 投影查找查询

c++ - 如何在自定义函数中使用 C++ Builder OPENARRAY

C++ Friend 语法/语义问题

c# - 是否有开放源代码项目在无异常(exception)的情况下实现相同的功能?

winapi - 我应该释放复制到剪贴板的内存吗?