以前写过一篇文章,是用 C# 的自绘制窗口做了一个 Balloon Tip 。这里由于讲的还是 BalloonTip ,所以作为前文的后续。不同的是,这一次是用 windows sdk 的 API 函数直接创建一个 ToolTip 窗口,然后我们就得到了 ToolTip 的窗口句柄,然后可以把 ToolTip 定位到屏幕任意的位置自然就是很简单的事。还是借用上次演示MSN式浮出通知窗口的例子,只是加入了 ToolTip 的相关代码。效果如下:
代码比较简单,详见附件中的tooltip.h , tooltip.c。
创建tooltip窗口用的是 CreateWindow, 窗口类名是“Tooltips_Class32”。 第一个参数 isBalloon 指定创建 ToolTip 的形状,如果为 TRUE 则创建的是“balloon”型的 ToolTip,也就是类似卡通画里的会话气泡,则显示时的位置坐标(x,y)是气泡的箭头指向点的坐标。否则创建的是普通的矩形ToolTip,显示时的位置坐标(x,y)是ToolTip窗口的某个端点(例如左上角)的坐标。
Code_CreateToolTip
//创建ToolTip窗口
HWND CreateToopTip(BOOL isBalloon, int maxWidth)
{
if (!m_hWndToolTip)
{
m_hWndToolTip = CreateWindow(
"Tooltips_Class32", //TOOLTIPS_CLASS,
NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | (isBalloon? TTS_BALLOON : 0) ,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL,
NULL, //m_hInst,
NULL);
if (m_hWndToolTip)
{
// set the version so we can have non buggy mouse event forwarding
//SendMessage(m_hWndToolTip, CCM_SETVERSION, COMCTL32_VERSION, 0);
SendMessage(m_hWndToolTip, TTM_SETMAXTIPWIDTH, 0, (LPARAM)maxWidth);
}
}
return m_hWndToolTip;
}
显示ToolTip时,设置标题,文本,指向位置,是通过给窗口发送属于 ToolTip 的以 “TTM_” 为前缀的消息来完成的。然后我们通过一个定时器设置ToolTip在屏幕上显示的时间。
Code_ShowToolTip
//弹出tooltip
void ShowToolTip(HWND hWnd, char* content, char* title, int x, int y, int icon, int mSeconds)
{
//获取前景窗口
HWND m_curForeWnd = GetForegroundWindow();
if(!m_hWndToolTip)
{
//默认情况下是balloontip
CreateToopTip(TRUE, 300);
}
if (m_hWndToolTip)
{
TOOLINFO ti = {0};
ti.cbSize = sizeof(ti);
ti.uFlags = /*TTF_IDISHWND |*/ TTF_TRACK | TTF_TRANSPARENT /*| TTF_CENTERTIP*/;
ti.hwnd = hWnd;
ti.uId = 0;
//ti.lpszText = NULL;
SendMessage(m_hWndToolTip, TTM_ADDTOOL, 0, (LPARAM)(LPTOOLINFO)&ti);
//隐藏tooltip
SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)0);
//设置文本
ti.lpszText = content;
SendMessage(m_hWndToolTip, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti);
//设置标题和icon
SendMessage(m_hWndToolTip, TTM_SETTITLEA, icon, (LPARAM)title);
//设置指向位置
SendMessage(m_hWndToolTip, TTM_TRACKPOSITION, 0, MAKELONG(x, y));
//set z-order
SetWindowPos(m_hWndToolTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
//显示tooltip
SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)&ti);
//安装timeout定时器
KillTimer(hWnd, TIMERID_TOOLTIP);
if(mSeconds > 0)
{
SetTimer(hWnd, TIMERID_TOOLTIP, mSeconds, (TIMERPROC)ToolTipTimerProc);
}
}
//复原前景窗口
SetForegroundWindow(m_curForeWnd);
}
最后是源代码下载链接(和前文下载链接一致):
http://files.cnblogs.com/hoodlum1980/NotifyWndDemo2.rar