Как я могу очистить TextOut? - PullRequest
0 голосов
/ 06 октября 2019

Как я могу удалить или скрыть текущий текст для добавления нового текста? в настоящее время, когда он добавляет еще один текст, текст перекрывает текст. Я пытался использовать InvalidateRect(hWnd, NULL, TRUE);, но не вижу никакой разницы.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
                TextOut(hdc, 5, 5, text.c_str(), _tcslen(_T(text.c_str())));
                EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }

    return 0;
}

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Ваш вызов TextOut находится в вашем WM_PAINT обработчике. Это означает, что текст всегда будет отображаться на каждом WM_PAINT, что делает ваш вызов на InvalidateRect практически бесполезным.

Один из способов исправить это - использовать логическое значение (drawText), указывающее,Вы хотите нарисовать текст или нет. Затем в вашей функции очистить текст:

drawText = FALSE;
InvalidateRect(hWnd, NULL, TRUE);

А в вашем WndProc:

case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);
        if(drawText)
            TextOut(hdc, 5, 5, text.c_str(), _tcslen(_T(text.c_str())));
        EndPaint(hWnd, &ps);
    }
    break;
0 голосов
/ 09 октября 2019

В вашем случае вызов InvalidateRect вызовет сообщение WM_PAINT, в результате чего TextOut () будет вызван снова. Ответ @mnistic - хорошее решение. Но я думаю, что вы действительно должны поместить метод TextOut в реальную обработку событий (например, OnButtonClickEvent) вместо того, чтобы помещать его в WM_PAINT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...