摘抄自宁静的乡村: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;