



既然ToolTip使用在各种各样的场合,那它必然很灵活... 所以他使用起来一定有点麻烦.这个逻辑在这里貌似没错.
ToolTip不是始终显示的控件,所以如果写错代码... 往往找不到北:"这东西不见了... 但是.. 它在哪里?",虽然MSDN给出了几个常见用法,但显然是有点问题的它没有说清楚.
主要是TOOLINFO.uFlags的细节.
如果只是想为一个控件给出提示,最好使用TTF_SUBCLASS.当有鼠标悬停事件发生时,他能够延时自动显示.
如果是为一个控件给出可变的信息来表示状态,TTF_TRACK | TTF_ABSOLUTE是最佳的解决方案.不过此时要通过TTM_TRACKPOSITION消息和TTM_TRACKACTIVATE消息来控制显示与否.并且通过TTM_SETTOOLINFO消息来控制.
common comtrol 6里面有很多控件都有ToolTip的属性.有些窗体熟悉也可以配置ToolTip,这时候可以避免繁琐的ToolTip编写.
下面给出了BinPlayer的现在版本中声音控件的ToolTip实现代码:(上图第2个)这是一个测试代码,写得不太规范,也不太通用,但毕竟是可以运行的.有空再给出详细的ToolTip使用实例.
//定义这几个量,因为TOOLINFO这个结构会被一直使用,所以把它作为静态量.
static TOOLINFO ToolInfo;
//控制是否显示/隐藏
static bool IsToolInfoTrack = false;
//显示的点和字
static POINT pt;
static TCHAR ToolWords[4];
//创建ToolTip的函数
HWND CreateTrackingToolTip(TOOLINFO * s_toolItem, HWND hDlg, WCHAR* pText) {
// Create a ToolTip.
pText[0] = 0;
HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST,
TOOLTIPS_CLASS, NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
hDlg, NULL, hInst,NULL);
s_toolItem->cbSize = sizeof(TOOLINFO);
s_toolItem->uFlags = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
s_toolItem->hwnd = hDlg;
s_toolItem->hinst = hInst;
s_toolItem->lpszText = pText;
s_toolItem->uId = (UINT_PTR)hDlg;
GetClientRect (hDlg, &s_toolItem->rect);
// Associate the ToolTip with the tool window.
SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) s_toolItem);
return hwndTT;
}
//使用这个函数来创建ToolTip
CreateTrackingToolTip(& ToolInfo, hWnd, ToolWords);
//鼠标松开事件
SendMessage(BP_trie.ToolTip, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)&ToolInfo);
IsToolInfoTrack = false;
//鼠标按下且移动事件
//ThumbRect是被拖动滑块的RECT
pt.x = ThumbRect.left;
pt.y = ThumbRect.top - 18;
//Position是一个double,从0~1,表示拖动位置,在这里很安全
wsprintf(ToolInfo.lpszText, TEXT("%d\0"), (int)(Position * 100));
SendMessage(BP_trie.ToolTip, TTM_SETTOOLINFO, 0, (LPARAM)&ToolInfo);
//TTF_TRACK属性就意味着TTF_ABSOLUTE属性,比如映射到窗口的位置上.
ClientToScreen(hWnd, &pt);
SendMessage(BP_trie.ToolTip, TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(pt.x, pt.y));
if (!IsToolInfoTrack) {
SendMessage(BP_trie.ToolTip, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)&ToolInfo);
IsToolInfoTrack = true;
}
No comments:
Post a Comment