使用DrawText重绘C ++

时间:2013-12-19 02:43:54

标签: c++ winforms drawtext

目前我正在窗口中的文本框中绘制文本。我成功地获得了我需要绘制的文本并绘制​​了文本。没关系。

问题在于:当我在输入框中写下其他内容并再次绘制文本时(通过按钮按下),新文本将被绘制在前一个文本的顶部,这是预期的。

我是所有这一切的新手,在绘制新文字之前我无法找到清除上一个文字的方法。

这是我的代码:

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);
}

有关如何执行此操作的任何提示?如果需要,我很乐意提供任何其他信息。提前谢谢!

2 个答案:

答案 0 :(得分:2)

DrawText更像是一个喷雾罐 - 它可以覆盖已经存在的任何东西。我建议切换到SetWindowText。不同之处在于DrawText更像是一个画布渲染调用,并没有考虑它所绘制的控件类型。 SetWindowText是一个显式的“将此窗口的文本设置为此特定值”,并且特定于基于文本的控件。更重要的是,它将用新的文本值替换当前文本。

如果您绝对必须使用DrawText(即您更喜欢上面的画布方法),那么您必须使用InvalidateRect()(使用文本区域的RECT)自己手动清除文本区域。或者,通过绘制与文本区域大小相等且与背景颜色相同的矩形。如果这还不够详细,请告诉我。

答案 1 :(得分:1)

如果其他一些窗口覆盖,然后揭开您绘制文本的地方它就会消失!窗户可以相互叠加的错觉被摧毁! Windows提供了一个解决此问题的方案,但您没有与该方案合作。

仅使用BeginPaint和EndPaint API调用来响应WM_PAINT消息绘制文本。在按钮上单击只需调用InvalidateRect,它要求Windows向您发送WM_PAINT。 BeginPaint在您绘画之前擦除您的窗口。因此,通过将您的绘图代码放在正确的位置 - WM_PAINT处理程序 - 您可以解决两个问题:它会删除任何旧文本,并在窗口被发现时重新绘制。