如何实施就地工具提示

原位工具提示用于显示已剪切对象的文本字符串。 有关图示,请参阅关于工具提示控件

普通工具提示和就地工具提示的区别在于定位。 默认情况下,当鼠标指针悬停在有工具提示的区域上时,工具提示会显示在该区域的旁边。 但是,工具提示也是窗口,可以通过调用 SetWindowPos 将其放置在选择的任意位置。 创建就地工具提示只需定位工具提示窗口,使其覆盖文本字符串即可。

需要了解的事项

技术

先决条件

  • C/C++
  • Windows 用户界面编程

说明

定位就地工具提示

在定位就地工具提示时需要跟踪三个矩形:

  1. 环绕完整标签文本的矩形。
  2. 环绕工具提示文本的矩形。 工具提示文本与完整的标签文本相同,大小和字体通常也相同。 因此,两个文本矩形的大小通常相同。
  3. 工具提示窗口的矩形。 此矩形比它所包围的工具提示文本矩形要大一些。

下图显示了三个矩形的示意图。 标签文本的隐藏部分以灰色背景表示。

diagram showing a long string, half of which has a gray background, then the same string within a larger tooltip window rectangle

要创建就地工具提示,必须定位工具提示文本矩形,使其与覆盖签文本矩形。 对齐两个矩形的步骤相对较为简单:

  1. 定义标签文本矩形。
  2. 定位工具提示窗口,让工具提示文本矩形覆盖标签文本矩形。

在实际操作中,通常只需对齐两个文本矩形的左上角即可。 如果尝试调整工具提示文本矩形的大小,使其与标签文本矩形完全匹配,则可能会导致工具提示出现显示问题。

这种简单方案的问题在于,无法直接定位工具提示文本矩形。 相反,必须将工具提示窗口矩形置于标签文本矩形的左上方,以便让两个文本矩形的边角重合。 换句话说,需要知道工具提示窗口矩形与其所包围的文本矩形之间的偏移量。 一般而言,并没有简单的方法可以确定该偏移量。

实施就地工具提示

以下代码片段说明了如何在 TTN_SHOW 处理程序中使用 TTM_ADJUSTRECT 消息来显示就地工具提示。 应用程序通过将专用 fMyStringIsTruncated 变量设置为 TRUE 来指示标签文本已被截断。 处理程序调用应用程序定义的函数 GetMyItemRect 以检索标签文本矩形。 此矩形会通过 TTM_ADJUSTRECT 传递给工具提示控件,而后者会返回相应的窗口矩形。 然后调用 SetWindowPos,将工具提示定位到标签上方。

case TTN_SHOW:
            
    if (fMyStringIsTruncated) 
    {
        RECT rc;
        
        GetMyItemRect(&rc);
        
        SendMessage(hwndToolTip, TTM_ADJUSTRECT, TRUE, (LPARAM)&rc);
        
        SetWindowPos(hwndToolTip, NULL, rc.left, rc.top, 0, 0, 
                     SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
    }

此示例不改变工具提示的大小,而只改变其位置。 两个文本矩形的左上角对齐,但尺寸不一定相同。 在实践中,差异通常很小,因此大多数情况下都建议采用此方法。 虽然原则上可以使用 SetWindowPos 来调整工具提示的大小和位置,但这样可能会产生不可预知的后果。

注解

通用控件版本 5.80 通过添加新信息 TTM_ADJUSTRECT 简化了就地工具提示的使用。 在发送此信息时,请输入希望工具提示覆盖的标签文本矩形的坐标,它会返回一个适当定位的工具提示窗口矩形的坐标。

使用工具提示控件