C技巧:VC中對(duì)話框上顯示信息的方法

字號(hào):

VC實(shí)現(xiàn)對(duì)話框上信息的顯示
    利用 VC的AppWizard,可以很容易地實(shí)現(xiàn)工具條和菜單項(xiàng)的ToolTip,或在狀態(tài)條上顯示幫助信息,但要在對(duì)話框的控件上顯示ToolTip和在狀態(tài)條上顯示控件信息并不容易實(shí)現(xiàn)。現(xiàn)在,我們用VC中的WM_SETCURSOR 與TTN_NEEDTEXT消息就可達(dá)到目的。具體操作如下:
    一、利用 VC的 MFC AppWizard 生成一個(gè) SDI 或 MDI 的應(yīng)用程序
    二、編輯對(duì)話框控件的字符串資源
    例如:IDC_dbBUTTON1 = “This is 肖天鵬的第一自制按鈕天鵬\",
    其中字符串“This is肖天鵬的第一自制按鈕“將在鼠標(biāo)移到控件上時(shí)顯示在狀態(tài)條上,字符串“天鵬\"將作為 ToolTip 顯示。
    三、建立消息映射
    在對(duì)話框的頭文件 (*.H) 中
    加入以下代碼:
    protected:
    void SetStatusText(UINT nID=0);
    //{{AFX_MSG(CFileOp1)
    afx_msg void OnDestroy();
    afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
    //}}AFX_MSG
    afx_msg BOOL OnTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
    DECLARE_MESSAGE_MAP()
    在對(duì)話框的實(shí)現(xiàn)文件 (*.CPP) 中加入以下代碼:
    BEGIN_MESSAGE_MAP(CFileOp1, CDialog)
    //{{AFX_MSG_MAP(CFileOp1)
    ON_WM_DESTROY()
    ON_WM_SETCURSOR()
    //}}AFX_MSG_MAP
    ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnTipNotvify)
    END_MESSAGE_MAP()
    四、編輯消息處理函數(shù)
    BOOL CFileOp1::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
    {// TODO: Add your message handler code here and/or call default
    if(pWnd==this)
    SetStatusText();
    else
    {TOOLTIPTEXT m_psttt;
    m_psttt.hdr.hwndFrom=m_hWnd;
    m_psttt.hdr.idFrom=pWnd->GetDlgCtrlID();
    m_psttt.hdr.code=TTN_NEEDTEXT;
    m_psttt.uFlags= TTF_IDISHWND;
    SetStatusText(pWnd->GetDlgCtrlID());
    this->SendMessage(WM_NOTIFY,m_psttt.hdr.idFrom,(LPARAM)&m_psttt); }
    return CDialog::OnSetCursor(pWnd, nHitTest, message);}
    void CFileOp1::OnDestroy()
    {SetStatusText();
    CDialog::OnDestroy();}
    void CFileOp1::SetStatusText(UINT nID)
    {if(nID==0)
    nID=AFX_IDS_IDLEMESSAGE;
    CWnd *pWnd=AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
    if(pWnd)
    {AfxGetMainWnd()->SendMessage(WM_SETMESS
    AGESTRING ,nID);
    pWnd->SendMessage(WM_IDLEUPDATECMDUI);
    pWnd->UpdateWindow();}}
    BOOL CFileOp1::OnTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
    { TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    UINT nID =pNMHDR->idFrom;
    if (pTTT->uFlags & TTF_IDISHWND)
    { nID = ::GetDlgCtrlID((HWND)nID);
    if (nID)
    { TCHAR szFullText[256];
    CString StrTipText;
    AfxLoadString(nID,szFullText);
    AfxExtractSubString(StrTipText,szFullText,1,′ ′);
    if(!StrTipText.IsEmpty())
    strcpy(pTTT->lpszText,StrTipText);
    pTTT->hinst = AfxGetResourceHandle();
    return(TRUE); } }
    return(FALSE);}
    五、將該對(duì)話框作為一個(gè) SDI 或 MDI應(yīng)用程序的主框架的子窗口,生成這樣一個(gè)對(duì)話框后,當(dāng)你把鼠標(biāo)移到某個(gè)控件 ( 必須有相應(yīng)的字符串資源 )上時(shí),就會(huì)出現(xiàn)該控件的 ToolTip和狀態(tài)條信息。