摘要: 本文介紹了工具提示的原理及用法,並給出其在對話框和框架窗口中的兩種不同的實現方法。
關鍵詞: 工具提示 對話框 框架窗口 Visual C++
1.前言
工具提示是一個小的彈出窗口,在窗口中顯示一行文本用以描述工具的用途或其他信息。工具提示在多數情況下是隱藏的,只有當鼠標的光標放在工具上並停留大約500毫秒時才出現在光標附近,而當用戶按下鼠標或光標離開工具時又重新隱藏起來。工具提示是Windows 95提供的一個新的特性,它使程序的用戶界面更為美觀,使用更為方便。Visual C++ 4.0為此提供了一個控件類CToolTipCtrl,由它來管理工具提示控件。
2.工具提示的原理及編程實現
工具提示控件要顯示提示文本時,會發出TTN_NEEDTEXT消息以獲取該文本,因此通過處理該消息我們可以為各個不同的工具提供它們所需的提示。但是,對於基於對話框的程序(從CDialog類派生)和基於框架窗口的程序(從CFrameWnd派生),它們對TTN_NEEDTEXT消息的處理是不同的。對於從CFrameWnd派生的窗口,它具有一個缺省的消息處理方法可以自動顯示與工具相聯系的提示文本;而對於從CDialog派生的窗口,這一缺省消息處理器並沒有被調用,因此需要我們自己提供消息處理方法來處理這個消息。下面將根據這兩種不同的情況來討論。
2.1在對話框中顯示工具提示
為了在對話框中顯示工具提示,可以按照以下步驟進行:
(1)調用CWnd::EnableToolTips(BOOL bEnable),傳人參數為TRUE,使該窗口支持工具提示的顯示。
(2)加入消息映射項如下:
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTip)
其中,TTN_NEEDTEXT為消息名,0表示工具提示控件的標識符,它始終是0,OnToolTip為TTN_NEEDTEXT消息的處理函數名。
(3)在對話框類的聲明中加入如下處理函數的原型說明:
afx_msg BOOL OnToolTip(UINT id,NMHDR *pNMHDR,LRESULT *pResult);
其中,id是發出消息的工具標識符,在本函數中不用,因為可以通過NMHDR這一結構獲得。NMHDR結構包含了有關通知消息的信息,其定義如下:
typedef struct tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
在該結構中,hwndFrom為發出消息的控件句柄,idFrom為控件標識符,code為通知消息的代碼,可以通過強制類型轉換將NMHDR結構轉換為TOOLTIPTEXT結構,後者用於為控件提供工具提示.
pResult為指向LRESULT的一個指針,表示消息處理的結果代碼,在本消息處理函數中該參數可被忽略。
(4)OnToolTip函數的具體實現。
假設按鈕的標識符為IDOK,下面的代碼為它提供一個工具提示。
BOOL CMyDialog::OnToolTip(UINT id,NMHDR *pNMHDR,LRESULT *pResult) { TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *) pNMHDR;
UINT nID=pNMHDR->idFrom; //獲得控件ID
if(pTTT->uFlags&TTF_IDISHWND) //如果idFrom實際上是窗口句柄
nID=::GetDlgCtrlID((HWND)nID); //重新獲得控件ID
if(nID==NULL)
return FALSE;
switch(nID)
{ case IDOK: //如果是標識符為IDOK的按鈕
pTTT->lpszText="OK"; //設置提示文本
break;
}
return TRUE;
}
2.2在框架窗口中顯示工具提示
對於框架窗口,情況稍微復雜一些,需要分幾種情況來討論。
首先,在文件MainFrm.cpp中定義一個全局的工具提示對象:
CToolTipCtrl m_ToolTip;
然後,在CMainFrame::OnCreate方法中創建工具提示控件:
if(!m_ToolTip.Create(this,TTS_ALWAYSTIP))
{ TRACE0("Failed to create tool tip control ");
return -1;
}
上面的風格位TTS_ALWAYSTIP表示,不論控件所屬的主窗口是否活動,工具提示始終有效。
最後,在CMainFrame::PreTranslateMessage()方法中加入如下代碼:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
m_ToolTip.RelayEvent(pMsg);
return CFrameWnd::PreTranslateMessage(pMsg);
}
這樣,就可以將鼠標移動的消息傳給工具提示控件,並作出相應的處理。
2.2.1為窗口標題條提供工具提示
為了給標題條提供工具提示,可以在CMainFrame::OnCreate()方法中加入如下語句:
CString title;
GetWindowText(title);
m_ToolTip.AddTool(this,(LPCTSTR)title);
這樣,當鼠標移到窗口的標題條或菜單條上時,將會出現工具提示,內容是該窗口的標題。
2.2.2為工具條提供工具提示
工具條一般位於菜單條的下面,由多個小的位圖按鈕組成,通常作為菜單命令的快捷方式來使用,它上面的位圖一般非常直觀,如果和工具提示一起使用則更便於用戶的使用。為工具條創建工具提示的步驟如下:
(1)用Visual C++ 4.0中的工具條編輯器創建工具條時,在每個按鈕的屬性對話框中分別加入狀態行文本和工具按鈕的提示文本。例如創建一個打開文件的工具條按鈕時,在提示欄中輸入Opens an existing document Open,那麼,當鼠標放在該按鈕上時,將出現“Open”的工具提示,並且在狀態行中出現Opens an existing document的文字。
(2)在CMainFrame類中加入一個工具條對象:
CToolBar m_wndToolBar;
然後在CMainFrame::OnCreate方法中用如下方式創建工具條控件: if(!m_wndToolBar.Create(this,WS_VISIBLE|CBRS_FLYBY| CBRS_TOOLTIPS|CBRS_TOP)||!m_wndToolBar.LoadToolBar(IDR_TOOLB AR1))
{ TRACE0("Failed to create tool bar ");
return -1;
}
2.2.3為狀態條提供工具提示
狀態條位於窗口的下方,它可由多個小窗格構成,分別用於顯示不同的內容,如當前時間和某些功能鍵的狀態等。為狀態條創建工具提示需要用到CToolTipCtrl類的AddTool()方法和Activate()方法。
首先,創建狀態條對象:
CStatusBar m_wndStatusBar;
m_wndStatusBar.Create(this);
然後,將工具條對象加入到m_ToolTip的工具列表中,並使工具提示有效:
m_ToolTip.AddTool(&m_wndStatusBar,”Status Bar”);
m_Too
[1] [2] 下一頁