【发布时间】:2011-05-26 10:58:16
【问题描述】:
我维护一个显示工具提示的 Win32 桌面应用程序。到目前为止,这在许多 XP 和 Windows 7 安装上运行良好。
我们现在收到一些客户的报告,称他们没有看到我们的工具提示。查看一个矩形工具提示(没有TTS_BALLOON 属性。但是使用TTS_BALLOON 创建的工具提示不可见。客户发送的日志文件报告CreateWindowEx 返回一个有效的窗口句柄以及坐标和包含的字符串是正确的。
相关机器运行 Windows XP 并定期更新。
有没有人遇到过类似的行为?
我们如何解决这个问题?
源代码:
gHintInfo.hwnd = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | TTS_BALLOON,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL,
(HINSTANCE)xvt_vobj_get_attr(TASK_WIN, ATTR_WIN_INSTANCE),
NULL);
Trace(1, "\n### DrawHint %d, hwnd = %08x, Text =\n%s\n###\n\n", __LINE__, gHintInfo.hwnd, tx);
if (gHintInfo.hwnd != NULL)
{
TOOLINFO ti;
ti.cbSize = sizeof (ti);
ti.uFlags = TTF_TRANSPARENT | TTF_ABSOLUTE;
ti.hwnd = hwndParent;
ti.uId = 0;
ti.hinst = NULL;
ti.lpszText = (char *) tx;
GetClientRect (hwndParent, &ti.rect);
dbgrct(ti.rect);
dbgpnt(gHintInfo.LastHintLoc);
SendMessage(gHintInfo.hwnd, TTM_TRACKPOSITION,0, MAKELONG(gHintInfo.LastHintLoc.v, gHintInfo.LastHintLoc.h));
SendMessage (gHintInfo.hwnd, TTM_ADDTOOL, 0, (long) &ti);
SendMessage (gHintInfo.hwnd, TTM_SETDELAYTIME, TTDT_AUTOMATIC, -1);
SendMessage (gHintInfo.hwnd, TTM_SETMAXTIPWIDTH, 0, 500);
SendMessage (gHintInfo.hwnd, TTM_TRACKACTIVATE, TRUE, (long) &ti);
}
此代码在不显示工具提示的机器上创建的日志输出是:
### DrawHint 474, hwnd = 00090112, Text =
Some text with
multiple lines
###
ti.rect left = 0, top = 0, right = 1280, bottom = 978
gHintInfo.LastHintLoc h = 295, v = 539
(我们将 ti.rect 设置为整个屏幕的坐标,因为 windows 将工具提示的大小调整为包含文本。)
编辑: 我们实际上向我们的软件添加了一个配置属性,它只是添加或删除 TTS_BALLOON 属性。这解决了相关机器上的问题。
【问题讨论】:
-
我必须承认我不记得了,但是如果您不使用 Luna(Playskool 任务栏/标题按钮),XP 是否会显示气泡式工具提示?
-
确实,我会问他们使用的是什么操作系统(可能是 Win 2k?)以及他们是在运行视觉样式还是在 Windows Classic 中。
-
@David:已经在帖子里了:“相关机器运行Windows XP,并定期更新。”
-
@RED SOFT ADAIR Windows Classic 怎么样?
-
@罗伯特。是的,Win32 API 使用本文提供的代码支持气球/气泡样式提示。它们显示为一个圆形矩形,在相关点上有一个圆锥。
标签: visual-studio winapi windows-xp tooltip