【问题标题】:C++ redraw with DrawTextC++ 使用 DrawText 重绘
【发布时间】:2013-12-19 02:43:53
【问题描述】:

目前我正在从窗口中的文本框中绘制文本。我成功地得到了我需要绘制的文本,它绘制了文本。没关系。

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

我对这一切都很陌生,在绘制新文本之前我找不到清除先前文本的方法。

这是我的代码:

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

关于如何做到这一点的任何提示?如果需要,我很乐意提供任何其他信息。提前致谢!

【问题讨论】:

    标签: c++ winforms drawtext


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。我绝对想使用其他任何东西,但我绝对必须使用 DrawText,这是大学作业。我想用背景颜色来绘制,但我想把它作为最后可能的选择。我在再次画画之前尝试了InvalidateRect(hwnd, &canvas, TRUE);,但它似乎什么也没做。我做错了吗?
    • 嗯。尝试使用 FillRect(wdc, &canvas, Brush) 代替 InvalidateRect(),其中画笔是您创建的简单画笔,用于清除背景(可能只是白色?)。 InvalidateRect() 应该强制重新绘制,但取决于你正在进行的其他任何事情,这很棘手。 FillRect 可能会给你更好的结果。显然,一定要在调用 DrawText 之前做 FillRect。
    • 我喜欢喷雾罐的比喻。 InvalidateRect 通常是正确的做法,但它需要您处理生成的绘制消息并在重绘背景后绘制文本。
    • @MikeD 好吧,它有效,感谢所有提供提示和解决方案的人!
    【解决方案2】:

    如果其他窗口覆盖然后又打开了您绘制文本的位置,它将消失!窗户可以相互叠放的错觉被打破了! Windows 提供了解决此问题的方案,但您不配合该方案。

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

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多