創建步驟
既然已經了解了什麼是工具提示,就讓我們來看看如何創建他們.大致步驟如下:
用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 ,其餘的參數都不太重要.
指定工具工具提示控制項創建了但還沒有顯示,我們想要當滑鼠指針在某個區域之上時顯示工具提示視窗.現在需要指定這個區域.我們稱這樣的區域為"工具",“工具”就是工具提示控制項監視滑鼠指針是否移過的位於視窗客戶區的一個方形區域.如果滑鼠指針移過"工具",工具提示視窗就顯示."工具"可覆蓋整個客戶區或者僅僅是它的一部分.因此我們把"工具"分成兩種類型,一種是作為一個視窗,另一種則是某視窗客戶區的一部分.兩種各有所用.覆蓋整個客戶區的"工具"通常用於按鈕、編輯控制項等,你不必指定焦點域的坐標和大小:它被假定為視窗的整個客戶區.僅覆蓋視窗客戶區一部分的"工具"在你想把視窗客戶區分成幾個部分但又不想使用子視窗時特別有用,但需要指定左上角的坐標和寬高.
使用如下的TOOLINFO 結構定義"工具":
TOOLINFOSTRUCT
cbSize DWORD ?
uFlags DWORD ?
hWnd DWORD ?
uId DWORD ?
rect RECT <>
hInst DWORD ?
lpszText DWORD ?
lParam LPARAM ?
TOOLINFOENDS
總言之,你需要將TOOLINFO結構傳遞給工具提示控制項之前填充填充好,它描述了你期望的"工具"屬性. 向工具提示控制項註冊"工具"填充完TOOLINFO結構後, 必須將其傳遞給控制項 . 一個工具提示控制項可以控制很多"工具",因此不必為一個視窗創建很多控制項,為了註冊"工具",向控制項傳送TTM_ADDTOOL訊息 wParam不使用,lParam必須包含要註冊的TOOLINFO結構的指針
.data?
ti TOOLINFO <>
.......
.code
.......
<fill the TOOLINFO structure>
.......
invoke SendMessage, hwndTooltip, TTM_ADDTOOL, NULL, addr ti成功返回 TRUE,否則返回 FALSE.
傳送 TTM_DELTOOL訊息取消註冊.
向工具提示控制項轉發滑鼠訊息以上步驟完畢之後,控制項知道了應當監視那一塊區域和應該在提示視窗顯示什麼.唯一缺乏的就是激發機制. 想想看:"工具"指定的其它視窗的客戶區的區域.控制項如何截取傳送向該視窗的訊息呢?實際中需要截取訊息以便了解滑鼠停留了多長時間,當指定時間流逝以後,控制項顯示提示視窗.有兩種方法: 一種需要包含"工具"視窗的合作,另一種則不需要.
包含"工具"的視窗必須向控制項傳送 TTM_RELAYEVENT 以轉發訊息. lParam是指向要轉發訊息MSG的指針 控制項僅處理如下滑鼠訊息 : WM_LBUTTONDOWN WM_MOUSEMOVE WM_LBUTTONUP WM_RBUTTONDOWN WM_MBUTTONDOWN WM_RBUTTONUP WM_MBUTTONUP 其它訊息全被忽略,因此包含"工具"的視窗的處理過程必須包含像這樣的選擇: WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
.......
if uMsg==WM_CREATE
.............
elseif uMsg==WM_LBUTTONDOWN || uMsg==WM_MOUSEMOVE || uMsg==WM_LBUTTONUP || uMsg==WM_RBUTTONDOWN || uMsg==WM_MBUTTONDOWN || uMsg==WM_RBUTTONUP || uMsg==WM_MBUTTONUP
invoke SendMessage, hwndTooltip, TTM_RELAYEVENT, NULL, addr msg
..........
.你可以在TOOLINFO結構的uFlags成員指定 TTF_SUBCLASS標誌。此標誌告訴控制項子類化包含"工具"的視窗以便無需視窗的協作便可捕獲滑鼠訊息。由於除了控制項自己處理截獲的滑鼠訊息和指定TTF_SUBCLASS標誌之外不用編寫多餘的代碼,因此很易於使用。 就是這些了,到這步為止,控制項已經全功能了.還有幾個你應當知道的相關訊息.
TTM_ACTIVATE.如果你想動態的允許或者禁止工具提示控制項,這個小訊息就是為你而備.wParam值為TRUE,允許控制項.若為FALSE,禁止控制項.控制項初始創建的時候無需傳送訊息激活他,便被自動設為允許狀態. TTM_GETTOOLINFO and TTM_SETTOOLINFO. 如果你想在把TOOLINFO結構傳遞給控制項之後獲得或者改變其值,使用此訊息.你需要用正確的uId and hWnd值指定要改變的"工具".如果你只想改變rect成員的值,使用TTM_NEWTOOLRECT 訊息,如果僅想改變提示文本,使用TTM_UPDATETIPTEXT訊息. TTM_SETDELAYTIME. 使用此訊息指定控制項顯示提示文本時的時間延遲.
ASP .NET Wijmo的工具提示控制項:
用與上下文相關的工具提示給最終用戶提供一個更好的UX。ComponentOne為ASP .NET Wijmo出品的工具提示控制項可以將HTML內容載入並顯示在Web應用程式中。也可以對工具提示的外觀具有完全的控制權。