目前我正在窗口中的文本框中绘制文本。我成功地获得了我需要绘制的文本并绘制了文本。没关系。
问题在于:当我在输入框中写下其他内容并再次绘制文本时(通过按钮按下),新文本将被绘制在前一个文本的顶部,这是预期的。
我是所有这一切的新手,在绘制新文字之前我无法找到清除上一个文字的方法。
这是我的代码:
void DrawMyText(HWND hwnd) {
int iTextLength = GetWindowTextLength(hDrawInput) + 1;
char cDrawText[1000] = "";
HDC wdc = GetWindowDC(hwnd);
RECT canvas;
canvas.left = 168;
canvas.top = 108;
canvas.right = 500;
canvas.bottom = 500;
GetWindowText(hDrawInput, cDrawText, iTextLength);
SetTextColor(wdc, 0x00FF0066);
SetBkMode(wdc,TRANSPARENT);
DrawText(wdc, cDrawText, -1, &canvas, DT_LEFT);
DeleteDC(wdc);
}
有关如何执行此操作的任何提示?如果需要,我很乐意提供任何其他信息。提前谢谢!
答案 0 :(得分:2)
DrawText更像是一个喷雾罐 - 它可以覆盖已经存在的任何东西。我建议切换到SetWindowText。不同之处在于DrawText更像是一个画布渲染调用,并没有考虑它所绘制的控件类型。 SetWindowText是一个显式的“将此窗口的文本设置为此特定值”,并且特定于基于文本的控件。更重要的是,它将用新的文本值替换当前文本。
如果您绝对必须使用DrawText(即您更喜欢上面的画布方法),那么您必须使用InvalidateRect()(使用文本区域的RECT)自己手动清除文本区域。或者,通过绘制与文本区域大小相等且与背景颜色相同的矩形。如果这还不够详细,请告诉我。
答案 1 :(得分:1)
如果其他一些窗口覆盖,然后揭开您绘制文本的地方它就会消失!窗户可以相互叠加的错觉被摧毁! Windows提供了一个解决此问题的方案,但您没有与该方案合作。
仅使用BeginPaint和EndPaint API调用来响应WM_PAINT消息绘制文本。在按钮上单击只需调用InvalidateRect,它要求Windows向您发送WM_PAINT。 BeginPaint在您绘画之前擦除您的窗口。因此,通过将您的绘图代码放在正确的位置 - WM_PAINT处理程序 - 您可以解决两个问题:它会删除任何旧文本,并在窗口被发现时重新绘制。