如何清除文本输出?

How can I clear TextOut?

本文关键字:文本 输出 清除 何清除      更新时间:2023-10-16

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

您对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;

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

另一种技术是使用背景颜色重新绘制文本,如下所示:

HDC hdc = ::GetDC(this->m_hWnd);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, clrBackground);
TextOut(hdc, 5, 5, text.c_str(), _tcslen(_T(text.c_str())));
UpdateTextSomewhere(&text);
SetTextColor(hdc, clrText);
TextOut(hdc, 5, 5, text.c_str(), _tcslen(_T(text.c_str())));
::ReleaseDC(this->m_hWnd, hdc);

clrX属于COLORREF型。它们可以在表单构造函数中设置,也可以OnInitDialog例如clrText = RGB(0, 0, 0);.

仅当表单背景为单一纯色时,此技术才有效。