1

チェックボックスをオンにすると、画面の広い領域にグリッドが表示されるプログラムを作成しようとしています。BitBlt を使用して WM_PAINT でこれを実行しようとしていますが、表示関数は正しいブール値で確実に呼び出されます。ただし、ウィンドウに変更はありません。私は愚かなことをしていますか、それともこれを達成する実用的な方法はありませんか? これが達成できない場合、グリッドを含む別の画像セットを指定せずに同様の結果を得る方法はありますか?

void DisplayRoom(HWND hwnd, char TileList[][100], POINT pMaxDisplay, POINT pMinDisplay, HBITMAP ahbmTileset[], bool bDisplayBars)
{
HBITMAP hbmSprite, hbmMask;
BITMAP bm;
PAINTSTRUCT ps;
HINSTANCE hinNULL = GetModuleHandle(NULL);
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld;
POINT Position;
hbmSprite = LoadBitmap(hinNULL, MAKEINTRESOURCE(IDB_CLEAR_GROUND));
hbmOld = (HBITMAP)SelectObject(hdcMem, hbmSprite);
GetObject(hbmSprite, sizeof(bm), &bm);
for (int iii = pMinDisplay.x; iii < pMaxDisplay.x; iii++)
    for (int jjj = pMinDisplay.y; jjj < pMaxDisplay.y; jjj++)
    {
        switch(TileList[iii][jjj])
        {
        case 'g':
            hbmSprite = ahbmTileset[0];
            break;
        case 'd':
            hbmSprite = ahbmTileset[1];
            break;
        case 'i':
            hbmSprite = ahbmTileset[2];
            break;
        case 'l':
            hbmSprite = ahbmTileset[3];
            break;
        }
                    assert(hbmSprite != NULL);
        SelectObject(hdcMem, hbmSprite);
        BitBlt(hdc, (iii - pMinDisplay.x) * 34 + 90, (jjj - pMinDisplay.y) * 34 + 60, 34, 34, hdcMem, 0, 0, SRCCOPY);
    }
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
if (bDisplayBars)
{
    HDC hdc = BeginPaint(hwnd, &ps);
    HDC hdcMem = CreateCompatibleDC(hdc);
    hbmSprite = LoadBitmap(hinNULL, MAKEINTRESOURCE(IDB_GRID));
            assert(hbmSprite != NULL);
    hbmMask = CreateBitmapMask(hbmSprite, RGB(0,0,0));
    for (int iii = pMinDisplay.x; iii < pMaxDisplay.x; iii++)
        for (int jjj = pMinDisplay.y; jjj < pMaxDisplay.y; jjj++)
        {
            SelectObject(hdcMem, hbmMask);
            BitBlt(hdc, (iii - pMinDisplay.x) * 34 + 90, (jjj - pMinDisplay.y) * 34 + 60, 34, 34, hdcMem, 0, 0, SRCAND);
            SelectObject(hdcMem, hbmSprite);
            BitBlt(hdc, (iii - pMinDisplay.x) * 34 + 90, (jjj - pMinDisplay.y) * 34 + 60, 34, 34, hdcMem, 0, 0, SRCPAINT);
        }
    DeleteDC (hdcMem);
    EndPaint(hwnd, &ps);
}
}

以下にダイアログの手順を示します。

BOOL CALLBACK CreateRoom(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
static char achTileDetails[100][100];
static POINT pDimensions, pMonsterLocations, pMinDisplay, pMaxDisplay;
static HBITMAP ahbmTileset[4];
static bool bShowBars;
switch(Message)
{
case WM_INITDIALOG:
    SetFocus(hwnd);
    for (int iii = 0; iii < 100; iii++)
        for(int jjj = 0; jjj < 100; jjj++)
            achTileDetails[iii][jjj] = 'g';
    pDimensions.x = 20;
    pDimensions.y = 10;
    pMinDisplay.x = 0;
    pMinDisplay.y = 0;
    pMaxDisplay.x = 20;
    pMaxDisplay.y = 10;
    for (int iii = 0; iii < 4; iii++)
        ahbmTileset[iii] = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_CLEAR_GROUND + iii));
    return TRUE;
case WM_PAINT:
    DisplayRoom(hwnd, achTileDetails, pMaxDisplay, pMinDisplay, ahbmTileset, bShowBars);
    break;
case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDCANCEL:
        EndDialog(hwnd, IDCANCEL);
        break;
    case IDC_DISPLAY_GRID:
        switch(HIWORD(wParam))
        {
        case BN_CLICKED:
            bShowBars = SendMessage(GetDlgItem(hwnd, IDC_DISPLAY_GRID), BM_GETCHECK, 0, 0);
            InvalidateRect(hwnd, NULL, TRUE);
            UpdateWindow(hwnd);
            break;
        }
        break;
    }
    break;
case WM_LBUTTONDOWN:

    break;
default:
    return FALSE;
}
}
4

1 に答える 1

3

私が見ることができる主な問題は、あなたが電話をかけていることBeginPaintですEndPaintBeginPaint塗装が完了する前と、すべての塗装が完了した後に一度だけ行う必要がありますEndPaint

他にも問題がある可能性があります。この問題を正確に解決するのは困難です。

于 2013-04-15T09:39:08.580 に答える