typedef struct tagTOOLINFO{
UINT cbSize;
UINT uFlags;
HWND hwnd;
UINT uId;
RECT rect;
HINSTANCE hinst;
LPTSTR lpszText;
}
說明
TOOLINFO結構用於創建工具提示控制項
參數
cbSize:TOOLINFO結構的大小.必須填充, 如果這個區域不被正確填充Windows並不會報錯,但你會得到不可預料的奇怪結果.
uFlags:指定焦點域的屬性,可以是如下標誌的聯合:
TTF_IDISHWND "ID is hWnd".如果你指定了這個標誌,就意味著你要使用覆蓋整個客戶區的"工具" (上面第一種"工具"). 如果你使用了這個標誌,你必須用你要使用的視窗句柄填充uId成員,如果你不指定這個成員,就意味著你要使用第二種"工具"、客戶區視窗的一方形區域.在這種情況下,你就必須以方形區域的大小填充rect成員.
TTF_CENTERTIP 通常工具提示視窗顯示在滑鼠的右下方,如果你指定了這個標誌,不管滑鼠的位置如何,工具提示總顯示在焦點域總的中下方.
TTF_RTLREADING .如果你的程式不是為阿拉伯或者希伯來語系統設計的,你完全可以不理它,它使得提示文本以從右至左的順序顯示,在其它系統中無效.
TTF_SUBCLASS 如果你使用了這個標誌,工具提示控制項將子類化"工具"所在視窗以便截取傳送給它的的滑鼠訊息,這個標誌非常有用,否則你將不得不做更多的工作來向工具提示控制項轉發訊息.
包含"工具"的視窗句柄,如果你指定了TTF_IDISHWND標誌,Windows將忽略該值,而使用uId成員的值作為視窗句柄.你需要填充這個域域如果:
你不使用 TTF_IDISHWND標誌 (換句話說,你使用局部"工具")
你在 lpszText 成員中指定了LPSTR_TEXTCALLBACK .這個值告訴工具提示控制項當需要顯示提示視窗時,必須向包含"工具"的視窗查詢應該顯示什麼. 這是一種實時的控制項文本更新.如果你需要動態改變提示文本,你應當在 lpszText成員中指定LPSTR_TEXTCALLBACK值,控制項就會向hWnd指定的視窗傳送TTN_NEEDTEXT 訊息.
這個域的值可能有兩種含義,依 uFlags 是否包含TTF_IDISHWND.
如果TTF_IDISHWND標誌沒有被指定就代表應用程式定義的"工具"ID,由於這意味著你使用僅覆蓋客戶區一部分的"工具",邏輯的推出一個客戶區可能存在多個同樣的焦點域(不存在交迭),Hwnd成員的一個視窗句柄就不夠了,應用程式定義ID以區分他們因此而顯得必要,只要唯一ID可以是任何值.
如果TTF_IDISHWND標誌被指定就表示整個客戶區都作為焦點域的視窗句柄,你或許會奇怪為什麼不用上面提到的hWnd成員的值來儲存視窗句柄.答案是:如果lpszText指定為LPSTR_TEXTCALLBACK,Hwnd 可能已經被填充了.還有提供提示文本的視窗和包含"工具"的視窗可能不是同一個!(你可以設計一個提供兩種服務的視窗程式,但太嚴格了,在這點上,微軟為我們提供了更大的自由)
指定"工具"大小的rect結構.這個結構定義了一個以hWnd指定視窗客戶區左上角為基點的方形大小,簡言之,如果你想指定客戶區的一部分作為"工具"就得填充這個結構,如果你指定了TTF_IDISHWND標誌 ,控制項就會忽略這個值.(你已經選擇整個客戶區作為"工具")
hInst:如果lpszText指定了字元串資源的標識,包含將作為工具提文本字元串資源的實例句柄.聽起來有點費解,閱讀一下lpszText的說明就可以明白這個域是乾什麼用的了.若lpszText不包含字元串資源標識,控制項會忽略這個域.
lpszText:這個域可以有如下幾個值:
如果指定為LPSTR_TEXTCALLBACK, 工具提示控制項就會向HWnd視窗傳送TTN_NEEDTEXT訊息以獲得將要顯示的字元串.提示文本的動態更新方法:每次顯示提示視窗都改變提示文本.
如果在這個域中指定字元串資源標識,當控制項要在提示視窗中顯示提示文本時,就搜尋hInst成員標識的實例的字元串資源列表.由於字元串資源列表標識總是16位值,這個域的高位元組將永遠為0,這種方法在你想移植程式時非常有用,由於字元串資源以腳本形式定義,你不必修改原始碼.只需要修改字元串列表提示文本就會相應改變,而不必擔心引進bugs.
如果這個域的值不是LPSTR_TEXTCALLBACK並且高位元組不為零, 控制項截取這個值作為提示文本的指針,這是最簡單的方法但也最不穩定.通過檢查高位元組區分字元串資源標識.
理論
工具提示是當滑鼠在某特定區域上停留時顯示的一個矩形視窗.工具提示視窗包含一些編程者想要顯示的文本.在這點上,工具提示同狀態欄的作用是一樣的,所不同的是工具提示當單擊或者遠離指定區域的時候就會消逝,你可能熟悉與工具列相關聯的工具提示,那些"提示"是工具列控制項提供的便利.如果你想要在其它視窗、控制項中顯示工具提示的話,就不得不自己創建他們.
工具提示是當滑鼠在某特定區域上停留時顯示的一個矩形視窗.工具提示視窗包含一些編程者想要顯示的文本.在這點上,工具提示同狀態欄的作用是一樣的,所不同的是工具提示當單擊或者遠離指定區域的時候就會消逝,你可能熟悉與工具列相關聯的工具提示,那些"提示"是工具列控制項提供的便利.如果你想要在其它視窗、控制項中顯示工具提示的話,就不得不自己創建他們.
既然已經了解了什麼是工具提示,就讓我們來看看如何創建他們.大致步驟如下:
用CreateWindowEx函式創建工具提示控制項. 定義一個工具提示控制項將要監視滑鼠移動的區域. 將區域傳遞給工具提示控制項 將傳遞區域的滑鼠訊息轉送給工具提示控制項.(這步或許更早,具體依據轉播訊息的方法) 下面我們就來詳細的討論每一步.
工具提示控制項的創建工具提示控制項是一種通用控制項.同樣,要在原始碼某處調用InitCommonControls以便MASM能夠將你的程式和comctl32.dll連線. 用CreateWindowEx創建工具提示控制項,典型代碼如下:
.data
TooltipClassName db "Tooltips_class32",0
.code
.....
invoke InitCommonControls
invoke CreateWindowEx, NULL, addr TooltipClassName, NULL, TIS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL注意視窗風格:TIS_ALWAYSTIP指定了工具提示不管包含指定區域的視窗狀態如何,當滑鼠移過指定區域的時候,工具提示總是顯示.簡單的說就是,即使視窗處於非激活狀態,滑鼠移過工具提示指定區域的時候,工具提示也會出現.
你不必在CreateWindowEx中包括WS_POPUP 和 WS_EX_TOOLWINDOW風格,因為工具提示處理過程會自動加上,你也不必指定工具提示視窗的坐標和寬高,控制項會依據要顯示的文字自動調節.四個參數,均使用CW_USEDEFAULT ,其餘的參數都不太重要.