【问题标题】:Invalidate or clip text使文本无效或剪辑文本
【发布时间】:2010-11-15 21:15:54
【问题描述】:

我正在尝试监视鼠标在窗口客户区的位置。例如:

WM_MOUSEMOVE:
{
   std::ostringstring oss;

   xPos = LOWORD(lParam);
   yPos = HIWORD(lParam);

   oss << xPos << ", " << yPos;

   TextOut(hDC, 100, 100, oss.str().c_str(), oss.str().size());
}

在绘制新文本之前,我是否需要测量字体的高度和宽度才能擦除该区域?我不明白我是否需要剪辑来重绘该区域,或者只是使 rect 无效就足以正确绘制文本。

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    每次绘制文本时,使用GetTextExtentPoint32 测量书写区域的大小,并将其保存在某处。然后,当您尝试绘制新内容时,可以将基于该值的矩形传递给 InvalidateRect 以指示您希望擦除,然后通过 UpdateWindow 使擦除立即发生。

    【讨论】:

    • 是否可以在 WM_PAINT 中进行绘制操作以使文本自行重绘?因为如果我将 TextOut 放在 WM_PAINT 中,它只会使写入的旧区域无效。
    • @cnd 实际上最好将TextOut 放在 WM_PAINT 中,因为 Windows 将调节您必须处理的 WM_PAINT 消息的数量。您需要使较大的矩形无效,以确保新值显示时不会被截断,或者可能会使整个控件无效。
    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多