绘画后WM_PAINT不会显示

时间:2011-10-03 18:00:47

标签: c windows api bitmap paint

所以我正在绘制一个位图,继承我的代码:

hdcMem = CreateCompatibleDC(hdc);

SelectObject(hdcMem, g_hBitmap);
GetObject(g_hBitmap, sizeof(bm), &bm);

BitBlt(hdc, 196 - (bm.bmWidth/2), 90, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

DeleteDC(hdcMem);

有时,当我使用此代码绘制它时,不会显示位图。虽然如果我最小化/不最小化窗口,则显示位图。我很确定我的代码没有问题所以我还应该做些什么吗?

修改 的:
事实证明,这不仅仅是位图,如果我使用TextOut绘制文本,有时它会在最小化/未最小化之前显示。我不认为最小化/不最小化会发送另一条WM_PAINT消息,因此我不认为当我这样做时,它会导致它被正确重新绘制。

哦,其余的控件正常绘制,只是WM_PAINT中的东西没有被绘制。

更新
以下是造成问题的代码,98%的时间也可以使用。


// This is a global variable
bool GlobalVar = false;

// This is a different thread started with _beginthread
void ThreadExample()
{
    GlobalVar = true;
    InvalidateRect(hMainWnd, NULL, TRUE);
    _endthread();
}

case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);

    if (GlobalVar == true)
    {
        SetBkMode(hdc, TRANSPARENT);
        SetTextColor(hdc, 0x0000ff);

        OrigFont = SelectObject(hdc, g_hLargeFont);

        GetTextExtentPoint32(hdc, ErrorMsg, lstrlen(ErrorMsg), &sz);
        TextOut(hdc, 196 - (sz.cx/2), 100, ErrorMsg, lstrlen(ErrorMsg));

        SelectObject(hdc, OrigFont);
    }

    EndPaint(hWnd, &ps);
    break;

EDIT2:
另一个重要细节可能是,在我的实际应用中,此代码位于if语句中,用于检查全局变量,如果真的那么涂料。并且此变量是从不同的线程设置的,在设置变量后我调用InvalidateRect(hMainWnd, NULL, TRUE);
更新了我的示例代码来表示这一点。

1 个答案:

答案 0 :(得分:2)

对于此代码段(您实际上应该发布更多详细信息),立即不合适的是您删除了临时DC,并且仍然选择了全局位图句柄。您需要再次SelectObject取消选择您的位图。

你通常这样做:

HGDIOBJ hPreviousBitmap = SelectObject(hdcMem, g_hBitmap);
// ...
SelectObject(hdcMem, hPreviousBitmap);

此外,错误检查永远不会伤害。可能其中一个API调用失败了,这一点很重要,因为它可以更好地解决这个问题。