以前寫過一篇文章,是用 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