VC++ ToolTip的簡單使用


    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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM