超级菜鸟求救:如何给一个工具栏(CToolBar)的按钮加上ToolTips和状态栏说明功能.

时间:2021-03-05 00:21:48

1.如何给一个工具栏(CToolBar)的按钮加上ToolTips和状态栏说明功能.
2.在程序运行中,如何动态改变它们的内容.

7 个解决方案

#1


1,在Toolbar的prompt 里加看看about button就知道怎么加了。
2,MFC提供CToolTipCtrl类,用addtool动态改变。看看其他资料吧。我已经忘的差不多了

#2


在Toolbar button 属性对话框中的prompt中\n前面的是状态栏中的说明,\n后面的是ToolTips

#3


By default MFC uses string resources with the same ID as the toolbar buttons for status messages and tooltip text. 

Sometimes you might want to change some of these messages or texts in runtime. This requires a little work. The following explanations are written for MDI. 

The easiest first; custom statusbar messages: 

For this you must override the GetMessageString function of the CMDIFrameWnd. The following is an example: 


void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
{
// load appropriate string
if(!m_bCustomMessage) {
CFrameWnd::GetMessageString(nID, rMessage);
return;
}

switch(nID) {
case ID_LOOK_UP:
rMessage = _T("Look out");
break;
case ID_LOOK_DOWN:
rMessage = _T("Look down");
break;
default:
CFrameWnd::GetMessageString(nID, rMessage);
}
}

Instead of hardcoding the messages, other string resources than the default can be loaded and assigned. This above functionality works also for menus. 

Now for something slightly more difficult; custom tooltip text. I had to dig a little for this. To override the default tooltip text handling two messages must be intercepted in the CMDIChildFrame, namely TTN_NEEDTEXTW and TTN_NEEDTEXTA. One of these (depending on unicode/not unicode) is sent when tooltip text is needed for a toolbar button. 


BEGIN_MESSAGE_MAP(CMyChildFrame, CMDIChildWnd)
//{{AFX_MSG_MAP(CNetbasChildFrame)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyChildFrame message handlers
BOOL CMyChildFrame::GetToolText( UINT nID, CString& strTipText )
{
switch(nID) {
case ID_LOOK_UP:
strTipText = _T("Tip out");
return TRUE;
case ID_LOOK_DOWN:
strTipText = _T("Tip down");
return TRUE;
}
return FALSE;
}

#define _countof(array) (sizeof(array)/sizeof(array[0]))

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

TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

CString strTipText;
if ( GetToolText( pNMHDR->idFrom, strTipText ) )
{
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, _countof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText, strTipText, _countof(pTTTW->szText));
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText, strTipText, _countof(pTTTA->szText));
else
lstrcpyn(pTTTW->szText, strTipText, _countof(pTTTW->szText));
#endif
return TRUE;
}

return CMDIChildWnd::OnToolTipText( nID, pNMHDR, pResult );
}

Here I have implemented a helper function that checks if we want to override the given button. In that case we assign a tooltip text. Otherwise we let the message pass through. 

#4


同意Tele!

#5


同意Tele! 

#6


可以去www.vchelp.net查找一下开发文档,好像有的

#7


第一个问题同意Tele
第二问题CToolBar中SetButtonText不可以么?

#1


1,在Toolbar的prompt 里加看看about button就知道怎么加了。
2,MFC提供CToolTipCtrl类,用addtool动态改变。看看其他资料吧。我已经忘的差不多了

#2


在Toolbar button 属性对话框中的prompt中\n前面的是状态栏中的说明,\n后面的是ToolTips

#3


By default MFC uses string resources with the same ID as the toolbar buttons for status messages and tooltip text. 

Sometimes you might want to change some of these messages or texts in runtime. This requires a little work. The following explanations are written for MDI. 

The easiest first; custom statusbar messages: 

For this you must override the GetMessageString function of the CMDIFrameWnd. The following is an example: 


void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
{
// load appropriate string
if(!m_bCustomMessage) {
CFrameWnd::GetMessageString(nID, rMessage);
return;
}

switch(nID) {
case ID_LOOK_UP:
rMessage = _T("Look out");
break;
case ID_LOOK_DOWN:
rMessage = _T("Look down");
break;
default:
CFrameWnd::GetMessageString(nID, rMessage);
}
}

Instead of hardcoding the messages, other string resources than the default can be loaded and assigned. This above functionality works also for menus. 

Now for something slightly more difficult; custom tooltip text. I had to dig a little for this. To override the default tooltip text handling two messages must be intercepted in the CMDIChildFrame, namely TTN_NEEDTEXTW and TTN_NEEDTEXTA. One of these (depending on unicode/not unicode) is sent when tooltip text is needed for a toolbar button. 


BEGIN_MESSAGE_MAP(CMyChildFrame, CMDIChildWnd)
//{{AFX_MSG_MAP(CNetbasChildFrame)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyChildFrame message handlers
BOOL CMyChildFrame::GetToolText( UINT nID, CString& strTipText )
{
switch(nID) {
case ID_LOOK_UP:
strTipText = _T("Tip out");
return TRUE;
case ID_LOOK_DOWN:
strTipText = _T("Tip down");
return TRUE;
}
return FALSE;
}

#define _countof(array) (sizeof(array)/sizeof(array[0]))

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

TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

CString strTipText;
if ( GetToolText( pNMHDR->idFrom, strTipText ) )
{
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, _countof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText, strTipText, _countof(pTTTW->szText));
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText, strTipText, _countof(pTTTA->szText));
else
lstrcpyn(pTTTW->szText, strTipText, _countof(pTTTW->szText));
#endif
return TRUE;
}

return CMDIChildWnd::OnToolTipText( nID, pNMHDR, pResult );
}

Here I have implemented a helper function that checks if we want to override the given button. In that case we assign a tooltip text. Otherwise we let the message pass through. 

#4


同意Tele!

#5


同意Tele! 

#6


可以去www.vchelp.net查找一下开发文档,好像有的

#7


第一个问题同意Tele
第二问题CToolBar中SetButtonText不可以么?