感悟:1 加断点调试,单步执行是解决问题的利器,能自己找出问题。2 多动脑筋,先弄明白原理。
1.工具提示的原理及编程实现
工具提示控件要显示提示文本时,会发出TTN_NEEDTEXT消息以获取该文本,因此通过处理该消息我们可以为各个不同的工具提供它们所需的提示。但是,对于基于对话框的程序(从CDialog类派生)和基于框架窗口的程序(从CFrameWnd派生),它们对TTN_NEEDTEXT消息的处理是不同的。对于从CFrameWnd派生的窗口,它具有一个缺省的消息处理方法可以自动显示与工具相联系的提示文本;而对于从CDialog派生的窗口,这一缺省消息处理器并没有被调用,因此需要我们自己提供消息处理方法来处理这个消息。
2 在对话框中显示工具提示
为了在对话框中显示工具提示,可以按照以下步骤进行:
(1)调用CWnd::EnableToolTips(BOOL bEnable),传入参数为TRUE,使该窗口支持工具提示的显示。
(2)加入消息映射项如下:
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipNotify)
其中,TTN_NEEDTEXT为消息名,0表示工具提示控件的标识符,它始终是0,OnToolTipNotify为TTN_NEEDTEXT消息的处理函数名。
(3)在对话框类头文件中声明加入如下处理函数的原型说明:
afx_msg BOOL OnToolTipNotify(UINT id,NMHDR *pNMHDR,LRESULT *pResult);
(4)编写实现代码:
BOOL bResult = TRUE;
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT nID =pNMHDR->idFrom;//获取发送消息的control的ID。Identifier of the control sending a message.
//方法一:通过工具栏上的按钮的ID找到按钮
if(nID))//此时该nID是工具栏的ID值,>0.
{
switch(nID))//此时该nID是工具栏的ID值,>0.
{
case ID_FILE_OPEN:
pTTT->lpszText=_T("打开");
break;
case ID_FILE_SAVE:
pTTT->lpszText=_T("保存");
break;
case ID_PUYIDAOSHU:
pTTT->lpszText=_T("谱仪道数设置");
break;
}
}
//方法二:通过索引值来找到按钮。
/* if(nID)//此时该nID是发送消息的控件的ID值,>0.
{
nID = m_ToolBar.CommandToIndex(nID);// 此时左边的nID是索引值,右边的nID是工具栏ID值。根据鼠标放在那个按钮的ID来获取按钮索引(索引值从0开始依次排序)。
switch(nID)//此时的nID表示索引值
{
case 0://第一个按钮的索引值为0
pTTT->lpszText = _T("打开"); //设置提示信息文本
// pTTT->hinst = AfxGetResourceHandle();//此时lpszText is the address of the tool tip text,hinst is NULL。
break;
case 1:
pTTT->lpszText = _T("保存");
pTTT->hinst = AfxGetResourceHandle();
break;
case 3://前面有条分割线,故索引值跳过了2
pTTT->lpszText = _T("谱仪道数设置");
pTTT->hinst = AfxGetResourceHandle();
break;
}
} */
return bResult;
}