CDockablePane上面的工具条CMFCToolBar,怎么加ToolTips(信息提示)或者Prompt(状态栏提示)?
原本想加Prompt(状态栏提示)的,但是没法实现。就改用ToolTips(信息提示),但也不行!于是搜索,偶然发现MSDN上有这么一个函数:OnUserToolTip,猜测应该可以实现我所要的效果,于是,重载CMFCToolBar,如下:
class CViewClientToolBar : public CMFCToolBar
{
virtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler)
{
CMFCToolBar::OnUpdateCmdUI((CFrameWnd*) GetOwner(), bDisableIfNoHndler);
}
virtual BOOL AllowShowOnList() const { return FALSE; }
virtual BOOL OnUserToolTip(
CMFCToolBarButton* pButton,
CString& strTTText
) const
{
strTTText=_T("dsadsa"); //只是测试,换成自己的就可以了,pButton是工具条上面的按钮,可以取得按钮的ID
return TRUE;
}
};
试验后发现,信息提示窗口不但显示了 strTTText=_T("dsadsa")信息,还显示了Prompt信息(在资源视图的属性里面改)
前面说到一种方法,但是这个方法有缺陷,原因是,这个信息提示确实可以显示,但是同时显示了Prompt信息,而Prompt信息却不能动态改变,以下解决:
CMainFrame中重载GetMessageString,
virtual void GetMessageString(UINT nID, CString& rMessage) const;
实现:
void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
{
//动态修改菜单、工具条的状态栏提示信息
switch(nID)
{
case ID_BUTTON_REFRESH:
rMessage=_T("resdas"); //换成自己的
break;
default:
CMDIFrameWndEx::GetMessageString(nID, rMessage);
}
}
这样就可以了。
前面虽然可以显示信息提示,但是,还是不能显示状态栏提示,以下实现:
class CViewClientToolBar : public CMFCToolBar
{
virtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler)
{
CMFCToolBar::OnUpdateCmdUI((CFrameWnd*) GetOwner(), bDisableIfNoHndler);
}
virtual BOOL AllowShowOnList() const { return FALSE; }
virtual BOOL OnUserToolTip(
CMFCToolBarButton* pButton,
CString& strTTText
) const;
public:
CViewClientToolBar();
protected:
int m_tips_id;
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnMouseLeave();
};
///
BEGIN_MESSAGE_MAP(CViewClientToolBar, CMFCToolBar)
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()
END_MESSAGE_MAP()
CViewClientToolBar::CViewClientToolBar()
{
m_tips_id=-1;
}
BOOL CViewClientToolBar::OnUserToolTip(
CMFCToolBarButton* pButton,
CString& strTTText
) const
{
switch(pButton->m_nID)
{
case ID_BUTTON_REFRESH:
strTTText=g_LoadLanguageString(IDS_STRING_CONSOLE_MENU_REFRESH);
break;
}
return TRUE;
}
void CViewClientToolBar::OnMouseMove(UINT nFlags, CPoint point)
{
int id=HitTest(point);
if (id!=m_tips_id)
{
m_tips_id=id;
CString strTTText;
CMFCToolBarButton * pButton=GetButton(id);
if (pButton!=NULL)
{
switch(pButton->m_nID)
{
case ID_BUTTON_REFRESH:
strTTText=g_LoadLanguageString(IDS_STRING_CONSOLE_MENU_REFRESH);
break;
}
}
AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)strTTText.GetBuffer(0));
}
CMFCToolBar::OnMouseMove(nFlags, point);
}
void CViewClientToolBar::OnMouseLeave()
{
m_tips_id=-1;
AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE, 0);
CMFCToolBar::OnMouseLeave(0, 0);
}
完美解决!