如何清除文本输出?
How can I clear 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;
}
您对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);
.
仅当表单背景为单一纯色时,此技术才有效。
相关文章:
- 如何让控制台输出覆盖控制台而不是纯文本输出?
- 如何清除文本输出?
- C++ 如何居中文本输出
- 如何将光标移动到 cin.clear() 和 cin.ignore() 之后的文本输出末尾?
- 期望文本输出而不是数字
- 如何将文本输出到另一个已打开C 的控制台
- 将文本输出到文本框C 中
- 将格式化文本输出到屏幕
- 用C++排列文本输出
- 使用 std::ostream 方法将格式化文本输出到 std::string 对象
- 文本输出() - "invalid null pointer"
- 将文本输出到C++ Winform
- C++不会创建要将文本输出到的文件
- 是否有一种简洁的方法可以将文本输出到调试窗格
- 将.txt文件中的文本输出到c++控制台中
- 使用 ofstream 进行缓冲文本输出以获得性能
- 文本输出发送到文件,稍后在程序中使用.如何使用缓冲区
- 是否有用于80列格式文本输出的库/方法
- 将文本输出到窗口控制台.c++
- C++ (VC) 文本输出用 0d 0d 0a 而不是 0d 0a 换行 - 如何修复