CToolTipCtrl: second method

 

步驟一:

    1. 產生一 dialog-based 應用程式
    2. 在對話盒中加入下列控制項
      • 按鈕
      • 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 就會當場掛掉