1、在基於對話框的MFC應用程序中使用Tooltip,首先在Dlg類的頭文件中定義一個變量:
CToolTipCtrl m_iToolTips;
2、在Dlg類的OnInitDialog中添加代碼:
EnableToolTips(TRUE); m_iToolTips.Create(this); m_iToolTips.Activate(TRUE); m_iToolTips.SetDelayTime(150); m_iToolTips.AddTool(GetDlgItem(IDC_BTN_SELECT), _T("選擇ocx/dll控件")); m_iToolTips.AddTool(GetDlgItem(IDC_EDIT_OCX_PATH), _T("ocx/dll控件路徑")); m_iToolTips.AddTool(GetDlgItem(IDC_BTN_REGISTER), _T("注冊")); m_iToolTips.AddTool(GetDlgItem(IDC_BTN_UNREGISTER), _T("反注冊")); m_iToolTips.AddTool(GetDlgItem(IDC_BTN_ISREGISTED), _T("是否注冊")); m_iToolTips.SetTipBkColor(RGB(255,255,255)); //背景色為白色 m_iToolTips.SetTipTextColor(RGB(0,0,0)); //字體顏色為黑色
3、重載PreTranslateMessage函數
BOOL CControlRegisterDlg::PreTranslateMessage( MSG* pMsg ) { switch(pMsg->message) { case WM_MOUSEMOVE: m_iToolTips.RelayEvent(pMsg); break; default: break; } return CDialog::PreTranslateMessage(pMsg); }
4、編譯運行

ToolTip是Win32中一個通用控件,MFC中為其生成了一個類CToolTipCtrl。
CToolTipCtrl是用來顯示單行文本的彈出框,可以給繼承自CFrameWnd(提供了一個缺省的TTN_NEEDTEXT消息處理函數)的Windows控件添加一些提示信息。要使用它,包含3個步驟:
-
- Enabling Tool Tips
- Handling TTN_NEEDTEXT Notification for Tool Tips
- The TOOLTIPTEXT Structure
也就是說:
第一步需要先打開這個功能(Tool Tips)。EnableToolTips
第二步需要處理TTN_NEEDTEXT消息,並不是必須的。
第三步是利用TOOLTIPTEXT結構體提供的信息,設置提示內容。AddTool
CToolTipCtrl控件提供的功能只限於文本顯示相關操作,對於復雜的ToolTip功能該控件可能滿足不了要求,所以需要自定義ToolTips控件。
相關實現可參考:https://www.codeproject.com/Articles/18382/Custom-ToolTips-for-MFC-Projects
補充:上述基本使用對於模態對話框正常,但是對於非模態對話框,PreTranslateMessage函數並沒有被調用,那么非模態對話框如何響應PreTranslateMessage函數呢?使用鈎子函數來實現:
C++ Code
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
class
CMyApp :
public
CWinApp { public : BOOL InitInstance(); int ExitInstance(); static LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam); HHOOK m_hHook; }; LRESULT CALLBACK CMyApp::GetMessageProc( int nCode, WPARAM wParam, LPARAM lParam) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); LPMSG lpMsg = (LPMSG)lParam; if (AfxGetApp()->PreTranslateMessage(lpMsg)) { lpMsg->message = WM_NULL; lpMsg->lParam = 0L; lpMsg->wParam = 0 ; } // Passes the hook information to the next hook procedure in the current hook chain. return ::CallNextHookEx(theApp.m_hHook, nCode, wParam, lParam); } BOOL CMyApp::InitInstance() { BOOL bInit = CWinApp::InitInstance(); if (bInit) { m_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, AfxGetInstanceHandle(), GetCurrentThreadId()); ASSERT(m_hHook); } return bInit; } int CMyApp::ExitInstance() { UnhookWindowsHookEx(m_hHook); return CWinApp::ExitInstance(); } |
