|
步驟一:
- 產生一 dialog-based 應用程式
- 在對話盒中加入下列控制項
- 按鈕
- checkbox
- listbox
- static control: 將 notify 屬性改為 true
編譯並測試執行程式
|
步驟二:
新增一個類別, 繼承 CToolTipCtrl, 增加一個成員函式如下
BOOL CMyToolTipCtrl::MyAddTool(UINT nID, LPCTSTR lpszText, CWnd *pwnd)
{
TOOLINFO ti;
memset( &ti, 0, sizeof( TOOLINFO ) );
ti.cbSize = sizeof( TOOLINFO );
ti.lpszText = ( LPSTR )lpszText ;
ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
ti.uId = ( UINT )pwnd -> GetDlgItem( nID ) -> m_hWnd;
ti.hwnd = pwnd -> GetSafeHwnd();
SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0,0);
return ( BOOL )SendMessage( TTM_ADDTOOL, 0, ( LPARAM )&ti );
}
其中 TTF_SUBCLASS 是讓 tooltip 視窗 subclass 所指定的控制項以便攔截滑鼠訊息, 所以在這種 作法裡可以不需要使用
RelayEvent(MSG*)
另外 SetWindowPos 則是將 tooltip 視窗設定在最上層
|
步驟三:
在整個應用程式中使用單一的 CToolTipCtrl 物件, 所以我們可以在主要的對話盒類別 CToolTip2Dlg
中加入一個 public 的 CMyToolTipCtrl 成員物件 m_tooltip (此物件設為 public 的原因是希望在 CAboutBox
中也可以使用此 tooltip 視窗)
在 CToolTip2Dlg 視窗以及裡面所有的控制項成功開啟後初始化這個控制項: 在 CToolTip2Dlg::OnInitDialog()
函式中加入 m_tooltip.Create(this), 讓主要的對話盒視窗成為 Tooltip 視窗的父視窗, 同時以 m_tooltip.Activate(TRUE)
啟動這個 tooltip 控制項
然後在同樣的地方替每一個控制項設定 tooltip 文字內容
m_tooltip.MyAddTool(IDC_STATIC1, "This is a static control");
m_tooltip.MyAddTool(IDC_CHECK1, "This is a checkbox control");
m_tooltip.MyAddTool(IDC_LIST1, "This is a listbox control");
m_tooltip.MyAddTool(IDC_BUTTON1, "This is a button control");
編譯, 執行
|
步驟四:
接下來替 "關於" 對話盒中的 "確定" 控制項設定 tooltip
文字內容
在 CAboutBox::OnInitDialog() 中加入
((CToolTip2Dlg*)AfxGetMainWnd())->m_tooltip.MyAddTool(IDOK,"Button Control", this);
編譯, 執行
應該可以看到 tooltip 了
|
步驟五:
由於 CAboutBox 關閉掉以後, tooltip 應該要把那個文字內容刪除, 以免佔用資源
我以我們在 CAboutBox::OnDestroy() 中加入
void CAboutDlg::OnDestroy()
{
(CToolTip2Dlg*)AfxGetMainWnd())->m_tooltip.DelTool(this, IDOK);
CDialog::OnDestroy();
}
編譯, 執行
請注意上述 DelTool 必須在呼叫 CDialog::OnDestroy() 之前, 否則在控制項被刪除掉了再去呼叫 DelTool
就會當場掛掉
|
|