WM_PAINT не появляется после покраски - PullRequest
1 голос
/ 03 октября 2011

Итак, я рисую растровое изображение, вот мой код:

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

Иногда, когда я рисую его с помощью этого кода, растровое изображение не отображается.Хотя, если я сверну / сверну окно, отобразится растровое изображение.Я почти уверен, что с моим кодом нет проблем, так что я должен что-то делать?

EDIT :
Оказывается, это не просто растровые изображения, если я рисую текст с помощью 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 Ответ

2 голосов
/ 03 октября 2011

Что сразу же не очень хорошо с этим фрагментом кода (на самом деле вы должны были бы публиковать больше деталей), так это то, что вы удаляете временный DC с глобальным дескриптором растрового изображения, все еще выделенным в нем. Вам нужно сделать SelectObject еще раз, чтобы отменить выбор вашего растрового изображения.

Обычно вы делаете это так:

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

Кроме того, проверка ошибок никогда не повредит. Возможно, один из вызовов API завершился неудачно, и важно, какой именно, поскольку он проливает больше света на проблему.

...