首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除TextOut?

如何清除TextOut?
EN

Stack Overflow用户
提问于 2019-10-07 04:27:07
回答 2查看 321关注 0票数 0

如何删除或隐藏当前文本输出以添加新文本?目前,当他添加另一个文本输出时,文本与文本重叠。我试过使用InvalidateRect(hWnd, NULL, TRUE);,但我看不出有什么不同。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2019-10-07 04:59:03

您对TextOut的调用在您的WM_PAINT处理程序中。这意味着文本将始终绘制在每个WM_PAINT上,这使得您对InvalidateRect的调用实际上毫无用处。

解决这个问题的一种方法是使用一个布尔值(drawText)来指示是否要绘制文本。然后在您的函数中清除文本:

代码语言:javascript
复制
drawText = FALSE;
InvalidateRect(hWnd, NULL, TRUE);

在你的WndProc

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2019-10-09 14:58:23

在本例中,InvalidateRect调用将触发一条WM_PAINT消息,导致再次调用TextOut()。@mnistic的答案是一个很好的解决方案。但我认为你真的应该把TextOut方法放到真正的事件处理(比如OnButtonClickEvent)中,而不是放到WM_PAINT中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58260966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档