Win32 - 为什么屏幕上没有任何东西?

时间:2012-12-31 08:41:23

标签: 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);

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

1 个答案:

答案 0 :(得分:4)

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

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... 

您需要保留选中的旧位图句柄,然后在关闭时销毁自定义位图。你如何管理完全取决于你。