如何实施就地工具提示
原位工具提示用于显示已剪切对象的文本字符串。 有关图示,请参阅关于工具提示控件。
普通工具提示和就地工具提示的区别在于定位。 默认情况下,当鼠标指针悬停在有工具提示的区域上时,工具提示会显示在该区域的旁边。 但是,工具提示也是窗口,可以通过调用 SetWindowPos 将其放置在选择的任意位置。 创建就地工具提示只需定位工具提示窗口,使其覆盖文本字符串即可。
需要了解的事项
技术
先决条件
- C/C++
- Windows 用户界面编程
说明
定位就地工具提示
在定位就地工具提示时需要跟踪三个矩形:
- 环绕完整标签文本的矩形。
- 环绕工具提示文本的矩形。 工具提示文本与完整的标签文本相同,大小和字体通常也相同。 因此,两个文本矩形的大小通常相同。
- 工具提示窗口的矩形。 此矩形比它所包围的工具提示文本矩形要大一些。
下图显示了三个矩形的示意图。 标签文本的隐藏部分以灰色背景表示。
要创建就地工具提示,必须定位工具提示文本矩形,使其与覆盖签文本矩形。 对齐两个矩形的步骤相对较为简单:
- 定义标签文本矩形。
- 定位工具提示窗口,让工具提示文本矩形覆盖标签文本矩形。
在实际操作中,通常只需对齐两个文本矩形的左上角即可。 如果尝试调整工具提示文本矩形的大小,使其与标签文本矩形完全匹配,则可能会导致工具提示出现显示问题。
这种简单方案的问题在于,无法直接定位工具提示文本矩形。 相反,必须将工具提示窗口矩形置于标签文本矩形的左上方,以便让两个文本矩形的边角重合。 换句话说,需要知道工具提示窗口矩形与其所包围的文本矩形之间的偏移量。 一般而言,并没有简单的方法可以确定该偏移量。
实施就地工具提示
以下代码片段说明了如何在 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 简化了就地工具提示的使用。 在发送此信息时,请输入希望工具提示覆盖的标签文本矩形的坐标,它会返回一个适当定位的工具提示窗口矩形的坐标。
相关主题