MFC 给自定义工具栏添加提示信息

时间:2021-06-17 00:16:55
 
MFC 给自定义工具栏添加提示信息
2010-01-30 11:09

摘抄自宁静的乡村:http://hi.baidu.com/gxichun/blog/item/a391432330c615599822ed16.html

一款软件要达到更加完美,友好的界面是必不可少的,用户使用起来容易上手,不需要太多的培训。除了设计合理的操作外,还应给客户明了的帮助提示,下面我们就谈谈如何在MFC应用程序中实现当鼠标悬停到自定义工具栏的某个按钮上方时便显示相应的文本提示标签这一功。

为了便于说明,我提前创建了一个MFC的SDI应用程序。

1、在mainFram.h中添加窗口处理过程函数声明:

// 生成的消息映射函数
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnButtonLarge();
afx_msg void OnButtonSmall();
afx_msg void OnButtonRect();
afx_msg void OnButtonCircle();
afx_msg void OnButtonLine();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnShowProgressBar();
afx_msg BOOL   OnToolTipText(UINT,   NMHDR*   pNMHDR,   LRESULT*   pResult) ;

DECLARE_MESSAGE_MAP()

2、在mainFrame.cpp中添加消息映射和处理过程函数的实现:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(ID_BUTTON32771, OnButtonLarge)
ON_COMMAND(ID_BUTTON32773, OnButtonSmall)
ON_COMMAND(ID_BTN_RECT, OnButtonRect)
ON_COMMAND(ID_BTN_CIRCLE, OnButtonCircle)
ON_COMMAND(ID_BTN_LINE, OnButtonLine)
ON_WM_TIMER()
ON_MESSAGE(UM_PROGRESS, OnProgress)
ON_COMMAND(ID_BTN_PROCESS,OnShowProgressBar)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)  
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)

END_MESSAGE_MAP()

//函数实现部分

BOOL   CMainFrame::OnToolTipText(UINT,   NMHDR*   pNMHDR,   LRESULT*   pResult)  
{  
ASSERT(pNMHDR->code   ==   TTN_NEEDTEXTA   ||   pNMHDR->code   ==   TTN_NEEDTEXTW);  

//   if   (GetRoutingFrame()   !=   NULL)   return   FALSE;  

//   UNICODE消息  
TOOLTIPTEXTA*   pTTTA   =   (TOOLTIPTEXTA*)pNMHDR;  
TOOLTIPTEXTW*   pTTTW   =   (TOOLTIPTEXTW*)pNMHDR;  
//TCHAR   szFullText[512];  
CString   strTipText;  
UINT   nID   =   pNMHDR->idFrom;  

if   (pNMHDR->code   ==   TTN_NEEDTEXTA   &&   (pTTTA->uFlags   &   TTF_IDISHWND)   ||  
   pNMHDR->code   ==   TTN_NEEDTEXTW   &&   (pTTTW->uFlags   &   TTF_IDISHWND))  
{  
   //   idFrom为工具条的HWND    
   nID   =   ::GetDlgCtrlID((HWND)nID);  
}  

if   (nID   !=   0)   //不为分隔符  
{  
   //AfxLoadString(nID,   szFullText);  
   //strTipText=szFullText;   
//添加自己想要的提示语
   strTipText.LoadString(nID);  
   strTipText   =   strTipText.Mid(strTipText.Find('\n',0)+1);  

#ifndef   _UNICODE  
   if   (pNMHDR->code   ==   TTN_NEEDTEXTA)  
   {  
    lstrcpyn(pTTTA->szText,   strTipText,   sizeof(pTTTA->szText));  
   }  
   else  
   {  
    _mbstowcsz(pTTTW->szText,   strTipText,   sizeof(pTTTW->szText));  
   }  
#else  
   if   (pNMHDR->code   ==   TTN_NEEDTEXTA)  
   {  
    _wcstombsz(pTTTA->szText,   strTipText,sizeof(pTTTA->szText));  
   }  
   else  
   {  
    lstrcpyn(pTTTW->szText,   strTipText,   sizeof(pTTTW->szText));  
   }  
#endif  

   *pResult   =   0;  

   //   使工具条提示窗口在最上面  
   ::SetWindowPos(pNMHDR->hwndFrom,   HWND_TOP,   0,   0,   0,   0,SWP_NOACTIVATE|  
    SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);    
   return   TRUE;  
}  
//return   TRUE;