複製鏈接
請複製以下鏈接發送給好友

TOOLINFO

鎖定
TOOLINFO結構用於創建工具提示控件
外文名
TOOLINFO添加概述
類    型
結構
屬    性
結構體原型

TOOLINFO結構體原型

結構體原型:
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 如果你使用了這個標誌,工具提示控件將子類化"工具"所在窗口以便截取發送給它的的鼠標消息,這個標誌非常有用,否則你將不得不做更多的工作來向工具提示控件轉發消息.
hWnd
包含"工具"的窗口句柄,如果你指定了TTF_IDISHWND標誌,Windows將忽略該值,而使用uId成員的值作為窗口句柄.你需要填充這個域域如果:
你不使用 TTF_IDISHWND標誌 (換句話説,你使用局部"工具")
你在 lpszText 成員中指定了LPSTR_TEXTCALLBACK .這個值告訴工具提示控件當需要顯示提示窗口時,必須向包含"工具"的窗口查詢應該顯示什麼. 這是一種實時的控件文本更新.如果你需要動態改變提示文本,你應當在 lpszText成員中指定LPSTR_TEXTCALLBACK值,控件就會向hWnd指定的窗口發送TTN_NEEDTEXT 消息.
uId
這個域的值可能有兩種含義,依 uFlags 是否包含TTF_IDISHWND.
如果TTF_IDISHWND標誌沒有被指定就代表應用程序定義的"工具"ID,由於這意味着你使用僅覆蓋客户區一部分的"工具",邏輯的推出一個客户區可能存在多個同樣的焦點域(不存在交迭),Hwnd成員的一個窗口句柄就不夠了,應用程序定義ID以區分他們因此而顯得必要,只要唯一ID可以是任何值.
如果TTF_IDISHWND標誌被指定就表示整個客户區都作為焦點域的窗口句柄,你或許會奇怪為什麼不用上面提到的hWnd成員的值來儲存窗口句柄.答案是:如果lpszText指定為LPSTR_TEXTCALLBACK,Hwnd 可能已經被填充了.還有提供提示文本的窗口和包含"工具"的窗口可能不是同一個!(你可以設計一個提供兩種服務的窗口程序,但太嚴格了,在這點上,微軟為我們提供了更大的自由)
rect
指定"工具"大小的rect結構.這個結構定義了一個以hWnd指定窗口客户區左上角為基點的方形大小,簡言之,如果你想指定客户區的一部分作為"工具"就得填充這個結構,如果你指定了TTF_IDISHWND標誌 ,控件就會忽略這個值.(你已經選擇整個客户區作為"工具")
hInst
如果lpszText指定了字符串資源的標識,包含將作為工具提文本字符串資源的實例句柄.聽起來有點費解,閲讀一下lpszText的説明就可以明白這個域是幹什麼用的了.若lpszText不包含字符串資源標識,控件會忽略這個域.
lpszText
這個域可以有如下幾個值:
如果指定為LPSTR_TEXTCALLBACK, 工具提示控件就會向HWnd窗口發送TTN_NEEDTEXT消息以獲得將要顯示的字符串.提示文本的動態更新方法:每次顯示提示窗口都改變提示文本.
如果在這個域中指定字符串資源標識,當控件要在提示窗口中顯示提示文本時,就搜索hInst成員標識的實例的字符串資源列表.由於字符串資源列表標識總是16位值,這個域的高字節將永遠為0,這種方法在你想移植程序時非常有用,由於字符串資源以腳本形式定義,你不必修改源代碼.只需要修改字符串列表提示文本就會相應改變,而不必擔心引進bugs.
如果這個域的值不是LPSTR_TEXTCALLBACK並且高字節不為零, 控件截取這個值作為提示文本的指針,這是最簡單的方法但也最不穩定.通過檢查高字節區分字符串資源標識.

TOOLINFO理論

工具提示是當鼠標在某特定區域上停留時顯示的一個矩形窗口.工具提示窗口包含一些編程者想要顯示的文本.在這點上,工具提示同狀態欄的作用是一樣的,所不同的是工具提示當單擊或者遠離指定區域的時候就會消逝,你可能熟悉與工具欄相關聯的工具提示,那些"提示"是工具欄控件提供的便利.如果你想要在其它窗口、控件中顯示工具提示的話,就不得不自己創建他們.
既然已經瞭解了什麼是工具提示,就讓我們來看看如何創建他們.大致步驟如下:
用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_POPUPWS_EX_TOOLWINDOW風格,因為工具提示處理過程會自動加上,你也不必指定工具提示窗口的座標和寬高,控件會依據要顯示的文字自動調節.四個參數,均使用CW_USEDEFAULT ,其餘的參數都不太重要.