📄 0517004.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>
<body>
<div align="justify">
<table border="0" width="100%" class="font" height="57">
<tr>
<td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">VC知识库(五)</font>
</td>
<td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">www.vckbase.com</font>
</td>
</tr>
<tr>
<td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="17" class="header" valign="top" align="center" colspan="2">
<font color="#AOAO99">为TreeCtrl中的项增加ToolTip</font>
</td>
</tr>
<tr>
<td width="100%" height="17" class="info" align="center" colspan="2">
<font color="#AOAO99">文洋译</font>
</td>
</tr>
<tr>
<td width="100%" height="22" class="font" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="5" class="font" colspan="2">
<p><strong><font color="#000000">要点:通过OnToolHitTest来增加ToolTip,<tt>CTreeCtrl::HitTest(...)的使用</tt>,TTN_NEEDTEXT消息的处理。</font></strong></p>
<h4>定义一个新类,有CTreeCtrl派生</h4>
<h4>Step 1:打开ToolTip 功能</h4>
<pre><tt><font COLOR="#990000" size="3">void CTreeCtrlX::PreSubclassWindow()
{
CTreeCtrl::PreSubclassWindow();
EnableToolTips(TRUE);
}</font></tt></pre>
<p> </p>
<h4>Step 2: OnToolHitTest() 的重载</h4>
<p><font color="#000000" size="3"><tt>首先通过HitTest决定是否增加ToolTip,如果需要则返回非零。</tt></font></p>
<p><tt><font size="3"><font color="#000000">在本例中ToolTip使用了</font><font COLOR="#990000">LPSTR_TEXTCALLBACK,而没有立即设定显示字符串。</font></font></tt></p>
<p><font color="#000000" size="3"><tt>在本例只在鼠标指向每项的图片时才显示ToolTip</tt></font></p>
<p><font color="#000000" size="3"><tt><nFlags & TVHT_ONITEMICON ||nFlags &
TVHT_ONITEMSTATEICON></tt></font></p>
<pre><font COLOR="#990000" size="3"><tt>int CTreeCtrlX::OnToolHitTest(CPoint point, TOOLINFO * pTI) const
{
RECT rect;
UINT nFlags;
HTREEITEM hitem = HitTest( point, &nFlags );
if( nFlags & TVHT_ONITEMICON )
{
CImageList *pImg = GetImageList( TVSIL_NORMAL );
IMAGEINFO imageinfo;
pImg->GetImageInfo( 0, &imageinfo );
GetItemRect( hitem, &rect, TRUE );
rect.right = rect.left - 2;
rect.left -= (imageinfo.rcImage.right + 2);
pTI->hwnd = m_hWnd;
pTI->uId = (UINT)hitem;
pTI->lpszText = LPSTR_TEXTCALLBACK;
pTI->rect = rect;
return pTI->uId;
}
else if( nFlags & TVHT_ONITEMSTATEICON )
{
CImageList *pImg = GetImageList( TVSIL_NORMAL );
IMAGEINFO imageinfo;
pImg->GetImageInfo( 0, &imageinfo );
GetItemRect( hitem, &rect, TRUE );
rect.right = rect.left - (imageinfo.rcImage.right + 2);
pImg = GetImageList( TVSIL_STATE );
rect.left = rect.right - imageinfo.rcImage.right ;
pTI->hwnd = m_hWnd;
pTI->uId = (UINT)hitem;
pTI->lpszText = LPSTR_TEXTCALLBACK;
pTI->rect = rect;
// return value should be different from that used for item icon
return pTI->uId*2;
}
return -1;
}</tt></font></pre>
<h4>Step 3: ?? TTN_NEEDTEXT</h4>
<p><font color="#000000" size="3">由于在增加ToolTip是使用用了 <tt>LPSTR_TEXTCALLBACK,因此ToolTip在显示时会发送该消息来得到显示字符串。</tt></font></p>
<pre><font COLOR="#990000" size="3"><tt>BEGIN_MESSAGE_MAP(CTreeCtrlX, CTreeCtrl)
//{{AFX_MSG_MAP(CTreeCtrlX)
:
:
//}}AFX_MSG_MAP
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()</tt></font></pre>
<pre><tt><font COLOR="#990000" size="3">protected:
//{{AFX_MSG(CTreeCtrlX)
:
:
//}}AFX_MSG
afx_msg BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
DECLARE_MESSAGE_MAP()</font></tt></pre>
<p><font size="3"><br>
<tt><font COLOR="#990000">BOOL CTreeCtrlX::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT
* pResult )<br>
{<br>
// need to handle both ANSI and UNICODE versions of the message<br>
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;<br>
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;<br>
CString strTipText;<br>
UINT nID = pNMHDR->idFrom;<br>
<br>
// Do not process the message from built in tooltip <br>
if( nID == (UINT)m_hWnd &&<br>
(( pNMHDR->code == TTN_NEEDTEXTA && pTTTA->uFlags & TTF_IDISHWND ) ||<br>
( pNMHDR->code == TTN_NEEDTEXTW && pTTTW->uFlags & TTF_IDISHWND ) ) )<br>
return FALSE;<br>
<br>
// Get the mouse position<br>
const MSG* pMessage;<br>
CPoint pt;<br>
pMessage = GetCurrentMessage();<br>
ASSERT ( pMessage );<br>
pt = pMessage->pt;<br>
ScreenToClient( &pt );<br>
<br>
UINT nFlags;<br>
HTREEITEM hitem = HitTest( pt, &nFlags );<br>
if( nFlags & TVHT_ONITEMICON )<br>
{<br>
int nImage, nSelImage;<br>
GetItemImage( (HTREEITEM ) nID, nImage, nSelImage );<br>
strTipText.Format( "Image : %d", nImage );<br>
}<br>
else<br>
{<br>
strTipText.Format( "State : %d", GetItemState( (HTREEITEM ) nID, <br>
TVIS_STATEIMAGEMASK ) );<br>
}<br>
<br>
#ifndef _UNICODE<br>
if (pNMHDR->code == TTN_NEEDTEXTA)<br>
lstrcpyn(pTTTA->szText, strTipText, 80);<br>
else<br>
_mbstowcsz(pTTTW->szText, strTipText, 80);<br>
#else<br>
if (pNMHDR->code == TTN_NEEDTEXTA)<br>
_wcstombsz(pTTTA->szText, strTipText, 80);<br>
else<br>
lstrcpyn(pTTTW->szText, strTipText, 80);<br>
#endif<br>
*pResult = 0;<br>
<br>
return TRUE; // message was handled<br>
}</font></tt></font>
</p>
</td>
</tr>
<tr>
<td width="100%" height="12" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="6" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="8" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="17" class="font" colspan="2"></td>
</tr>
</table>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -