首页 > 解决方案 > 如何清除 TextOut?

问题描述

如何删除或隐藏当前文本以添加新文本?目前,当他添加另一个文本输出时,文本与文本重叠。我尝试使用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;
}

标签: c++winapi

解决方案


您的呼叫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;

推荐阅读