4

WM_PAINTの前後の画面への変更を追跡し、それらをWM_PAINTの1行にコピーできるように、オフスクリーンバッファーを使用しようとしています。グラフィックを設定する必要があるコードは次のとおりです。

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);

何らかの理由で、画面に何も描画されていません。私はそれを理解しようと頭を悩ませています。正しい方向へのポインタをいただければ幸いです。

4

1 に答える 1

5

最初にメモリデバイスコンテキストと互換性のあるビットマップを作成してから、そのビットマップをメモリ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... 

シャットダウン時にカスタムハンドルを破棄する前に、古いビットマップハンドルを選択したままにして元に戻すことをお勧めします。それをどのように管理するかは完全にあなた次第です。

于 2012-12-31T08:48:38.130 に答える