📄 01_9_12_13.asp.html
字号:
}</td></tr></table><table width=100% ><tr><td class=a14>
return -1;</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table>
<table width=100% >
<tr>
<td class=a14><b> 第三步:处理TTN_NEEDTEXT消息; </b></td>
</tr>
</table>
<table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 加入一个函数处理TTN_NEEDTEXT消息通知。当工具处理控制需要知道应该显示什么信息时,这条消息被发出。由于上一步中我们给TOOLINFO的lpszText赋值为LPSTR_TEXTCALLBACK,所以我们要处理这个消息VC的ClassWizard并不支持这条消息被映射,所以只有我们自己加入这条消息的映射机制加入到MESSAGE_MAP中去。我们不得不处理这个消息的两个版本,TTN_NEEDTEXTA和TTN_NEEDTEXTA。消息映射的代码如下所示:
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BEGIN_MESSAGE_MAP(CTreeCtrlX, CTreeCtrl)</td></tr></table><table width=100% ><tr><td class=a14>
//{{AFX_MSG_MAP(CTreeCtrlX)</td></tr></table><table width=100% ><tr><td class=a14>
…</td></tr></table><table width=100% ><tr><td class=a14>
//}}AFX_MSG_MAP</td></tr></table><table width=100% ><tr><td class=a14>
ON_NOTIFY_EX_RANGE</td></tr></table><table width=100% ><tr><td class=a14>
(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)</td></tr></table><table width=100% ><tr><td class=a14>
ON_NOTIFY_EX_RANGE</td></tr></table><table width=100% ><tr><td class=a14>
(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)</td></tr></table><table width=100% ><tr><td class=a14>
END_MESSAGE_MAP()</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
下面的代码是加到类声明中: </td></tr></table><table width=100% ><tr><td class=a14>
protected:</td></tr></table><table width=100% ><tr><td class=a14>
//{{AFX_MSG(CTreeCtrlX)</td></tr></table><table width=100% ><tr><td class=a14>
…</td></tr></table><table width=100% ><tr><td class=a14>
//}}AFX_MSG</td></tr></table><table width=100% ><tr><td class=a14>
afx_msg BOOL OnToolTipText</td></tr></table><table width=100% ><tr><td class=a14>
( UINT id, NMHDR * pNMHDR, LRESULT * pResult );</td></tr></table><table width=100% ><tr><td class=a14>
DECLARE_MESSAGE_MAP()</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 现在讨论这个函数本身的实现。为了适应不同的语言字符集,ANSI字符集和UNICODE字符集都必须被处理,处理过程会有些不同。此处对树形控件的本身产生的ToolTip消息不予处理,过滤掉上述消息的原则是树形控件本身产生的消息的ID是树形控件窗口的句柄,并且有TTF_IDISHWND标志。根据鼠标位置可以确定应该给出节点图标还是状态图标的工具提示。本文根据笔者画的图显示了一些无关紧要的提示,读者做这一步时应该加入一些有意义的提示。当然,本文假定控件包含节点图标和状态图标。如不包含,计算鼠标位置时要注意
不要计算错误。 </td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BOOL CTreeCtrlX::OnToolTipText</td></tr></table><table width=100% ><tr><td class=a14>
( UINT id, NMHDR * pNMHDR, LRESULT * pResult )</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
// 需要处理ANSI和UNICODE两种格式</td></tr></table><table width=100% ><tr><td class=a14>
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;</td></tr></table><table width=100% ><tr><td class=a14>
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;</td></tr></table><table width=100% ><tr><td class=a14>
CString strTipText;</td></tr></table><table width=100% ><tr><td class=a14>
UINT nID = pNMHDR- >idFrom;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
// 不必处理树自己发出的ToolTip消息</td></tr></table><table width=100% ><tr><td class=a14>
if( nID == (UINT)m_hWnd &&(( pNMHDR- >code == TTN_NEEDTEXTA && </td></tr></table><table width=100% ><tr><td class=a14>
pTTTA- >uFlags & TTF_IDISHWND ) ||</td></tr></table><table width=100% ><tr><td class=a14>
( pNMHDR- >code == TTN_NEEDTEXTW && </td></tr></table><table width=100% ><tr><td class=a14>
pTTTW- >uFlags & TTF_IDISHWND ) ) )</td></tr></table><table width=100% ><tr><td class=a14>
return FALSE;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
// 得到鼠标位置</td></tr></table><table width=100% ><tr><td class=a14>
const MSG* pMessage;</td></tr></table><table width=100% ><tr><td class=a14>
CPoint pt;</td></tr></table><table width=100% ><tr><td class=a14>
pMessage = GetCurrentMessage();</td></tr></table><table width=100% ><tr><td class=a14>
ASSERT ( pMessage );</td></tr></table><table width=100% ><tr><td class=a14>
pt = pMessage- >pt;</td></tr></table><table width=100% ><tr><td class=a14>
ScreenToClient( &pt );</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
UINT nFlags;</td></tr></table><table width=100% ><tr><td class=a14>
HTREEITEM hitem = HitTest( pt, &nFlags );</td></tr></table><table width=100% ><tr><td class=a14>
if( nFlags & TVHT_ONITEMICON )</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
int nImage, nSelImage;</td></tr></table><table width=100% ><tr><td class=a14>
GetItemImage( (HTREEITEM ) nID, nImage, nSelImage );</td></tr></table><table width=100% ><tr><td class=a14>
switch(nImage)</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
case 0:</td></tr></table><table width=100% ><tr><td class=a14>
strTipText = "叉";</td></tr></table><table width=100% ><tr><td class=a14>
break;</td></tr></table><table width=100% ><tr><td class=a14>
case 1:</td></tr></table><table width=100% ><tr><td class=a14>
strTipText = "加号";</td></tr></table><table width=100% ><tr><td class=a14>
break;</td></tr></table><table width=100% ><tr><td class=a14>
case 2:</td></tr></table><table width=100% ><tr><td class=a14>
strTipText = "菱形";</td></tr></table><table width=100% ><tr><td class=a14>
break;</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
else</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
if( (GetItemState( (HTREEITEM ) nID, </td></tr></table><table width=100% ><tr><td class=a14>
TVIS_STATEIMAGEMASK ) > >12 ) == 2 )</td></tr></table><table width=100% ><tr><td class=a14>
strTipText.Format( "此节点被选中" );</td></tr></table><table width=100% ><tr><td class=a14>
else</td></tr></table><table width=100% ><tr><td class=a14>
strTipText.Format( "此节点未被选中" );</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
#ifndef _UNICODE</td></tr></table><table width=100% ><tr><td class=a14>
if (pNMHDR- >code == TTN_NEEDTEXTA)</td></tr></table><table width=100% ><tr><td class=a14>
lstrcpyn(pTTTA- >szText, strTipText, 80);</td></tr></table><table width=100% ><tr><td class=a14>
else</td></tr></table><table width=100% ><tr><td class=a14>
_mbstowcsz(pTTTW- >szText, strTipText, 80);</td></tr></table><table width=100% ><tr><td class=a14>
#else</td></tr></table><table width=100% ><tr><td class=a14>
if (pNMHDR- >code == TTN_NEEDTEXTA)</td></tr></table><table width=100% ><tr><td class=a14>
_wcstombsz(pTTTA- >szText, strTipText, 80);</td></tr></table><table width=100% ><tr><td class=a14>
else</td></tr></table><table width=100% ><tr><td class=a14>
lstrcpyn(pTTTW- >szText, strTipText, 80);</td></tr></table><table width=100% ><tr><td class=a14>
#endif</td></tr></table><table width=100% ><tr><td class=a14>
*pResult = 0;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
return TRUE; // 消息处理完毕</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 本文程序在Win9x,VC6.0下调试通过。</td>
</tr>
</table><br>
<style>.a1{font-size:1}</style>
<table width=100% ><tr><td align=right>(网页编辑:<a href='mailto:liu_yang@ccw.com.cn'>风之翼</a>)</td></tr></table>
</td><td class=a1 bgcolor=#f46240> </td>
<td valign=top width=138 align=right><table width=98% ><tr><td>
<form action='/app/gsearch1.asp' name=pdn><table width=100% ><tr><td>应用与方案
频道全文检索</td></tr>
<tr><td><input type="text" name="textfile" size=15 value=频道内检索 onfocus="this.value=''">
<input border=0 src="../../../../../images/jian.gif" name="I1" type="image" align=absmiddle>
</td></tr>
</table>
</form>
<form name=srch action="/search/which.asp" method=post onsubmit="JavaScript:return chk()">
<table width=100% >
<tr><td><select size="1" name="func">
<option selected value="2">主题检索</option>
<option value="1">周报全文检索</option>
<option value="3">模糊词检索</option>
</select></td></tr>
<tr><td><input type="text" name="SrchStr" size=15 value="输入待检索的词"
onfocus="this.value=''">
<input src="../../../../../images/jian.gif" name="I1" type="image" align="absMiddle" border=0>
</td></tr>
</table>
<script language="JavaScript">
function chk()
{if (!document.srch.SrchStr.value){
alert("请输入需检索的词!");
document.srch.SrchStr.focus();
return false;
}
else{if (document.srch.SrchStr.value.length>30){
alert("检索的词请不要超过30个字符!");
document.srch.SrchStr.focus();
return false;
}
}
}
</script></form>
<table width=100% ><tr><td class=f colspan=2><b>相关文章</b></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_12.asp.html'>在CTreeCtrl中枚举系统中的所有窗口</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_11.asp.html'>VC++环境下菜单和工具栏的动态修改技术</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_10.asp.html'>VC++环境下浮动工具条的编程</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_9.asp.html'>用VC++在状态栏显示时钟</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_8.asp.html'>有关属性对话框(property sheet)的几个提示</a></td></tr>
</table>
</td></tr></table></td></tr></table><br>
<table align=center width=680><tr><td align=right>
<form name=mail method=post action='/pub/subMail.asp' onsubmit='JavaScript: return chkField(this)'>
<INPUT type='hidden' name='rec' value='23981'>
您的姓名:<INPUT type="text" name=myName size=10>
您朋友的E-mail:<INPUT type="text" name=friendMail size=10>
<INPUT type="submit" value="推荐给好友">
</form>
</td></tr>
<tr><td align=right>
<b>[<a href="javascript:window.close()">关闭窗口</a>]</b>
</td></tr>
</table>
<script language="javascript">
function chkField(fmObj)
{if (!fmObj.friendMail.value){
alert("请输入您朋友的E-mail!");
fmObj.friendMail.focus();
return false;
}
return true;
}
</script>
<table align=center width=680>
<tr><td><hr size=1 width=660 color=#f46240></td></tr>
</table><br>
<p align=center>Copyright(C) ccw.com.cn,All rights reserved</p>
<p align=center><b>中国计算机世界出版服务公司版权所有</b></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -