程序运行时,可能在不同条件或环境下,控件会实现不同的功能。
前面我们分享的实例是鼠标移动到控件上显示出控件的功能。
当前例程实现如何在程序运行时改变工控的提示文本。其方法主要是重载下面函数:
virtual afx_msg BOOL OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult );
并增加消息处理:
ON_NOTIFY_EX_RANGE( TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE( TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
重载方法代码如下:
BOOL CToolTipView::OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult )
{
ASSERT ( pNMHDR->code == TTN_NEEDTEXTA || TTN_NEEDTEXTW );
TOOLTIPTEXTA* pTTTA = ( TOOLTIPTEXTA *)pNMHDR;
TOOLTIPTEXTW* pTTTW = ( TOOLTIPTEXTW *)pNMHDR;
CString strTipText;
CString strMessage;
if( GetToolText(pNMHDR->idFrom, strTipText, strMessage))
{
#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
// change status bar message here, need a pointer to CMainFrame
// SetMessageText(strMessage);
// ok we handled the message, return TRUE
return TRUE;
}
// we did NOT handle the message, pass it on, this is important, don't miss it!
return CToolTipView::OnToolTipText(nID,pNMHDR,pResult);
}
下面是改变文本的函数:
BOOL CToolTipView::GetToolText( UINT nID, CString& strTipText, CString& /*strMessage*/)
{
CString strFullString;
switch( nID )
{
case ID_FILE_NEW: // have to handle all toolbar tool tip messages here
case ID_FILE_OPEN:
case ID_FILE_SAVE:
case ID_EDIT_CUT:
case ID_EDIT_COPY:
case ID_EDIT_PASTE:
case ID_FILE_PRINT:
case ID_APP_ABOUT:
if (strFullString.LoadString(nID))
AfxExtractSubString ( strTipText, strFullString, 1,'\n');
break;
// demonstrates how to change the tool tip for a specific button
case ID_CHANGE_TOOL_TIP:
// local CString containg the new text, which you can set anytime at runtime
// and will be displayed here when the user puts the mouse on the button.
strTipText = m_strNewToolTipText;
// if the user tried to enter a zero legth string, it could
// cause confusion, so put the default sring back in
if ( strTipText.GetLength() == 0 ) // then put back the default string
{
if (strFullString.LoadString (ID_CHANGE_TOOL_TIP))
AfxExtractSubString ( strTipText, strFullString, 1,'\n' );
}
break;
}
return TRUE;
}
效果如下图:
上位机MFC程序运行时动态修改控件提示文本
点击工具栏的上按钮CT,弹出对话框可修改按钮新的提示文本。
例程源代码下载地址:
|