Click to See Complete Forum and Search --> : Best way to dynamically change the tooltip text of a toolbar?


fille
October 13th, 1999, 06:29 AM
What's the easiest way to dynamically change the tooltip text (and the information displayed on the statusbar) of a toolbar created with MFC >=4.0?

Oleg Lobach
October 13th, 1999, 06:58 AM
Hi,
By default MFC uses string resources with the same ID as the toolbar buttons for status
messages and tooltip text.
To alter statusbar messages :
Override the GetMessageString function of the CMDIFrameWnd like this:

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

switch(nID) {
case ID_1:
sMessage = _T("New hint 1");
break;
case ID_2:
sMessage = _T(""New hint 2"");
break;
default:
CFrameWnd::GetMessageString(nID, sMessage);
}
}




To override the default tooltip text handling two messages must be intercepted in the
CxxFrame, 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_1:
strTipText = _T("Tip 1");
return TRUE;
case ID_2:
strTipText = _T("Tip 2");
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 );
}





Hope this helps,
Oleg.

fille
October 13th, 1999, 02:55 PM
Thanks alot, it was just what I needed! I wasn't even close to getting it right. Thanks again.