⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0517004.htm

📁 VC知识库5_chm_decompile_20040520_210715
💻 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()&nbsp;

{

	CTreeCtrl::PreSubclassWindow();



	EnableToolTips(TRUE);

}</font></tt></pre> 
 
 
 
<p>&nbsp; </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>&lt;nFlags &amp; TVHT_ONITEMICON ||nFlags &amp; 

TVHT_ONITEMSTATEICON&gt;</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, &amp;nFlags );

	if( nFlags &amp; TVHT_ONITEMICON )

	{

		CImageList *pImg = GetImageList( TVSIL_NORMAL );

		IMAGEINFO imageinfo;

		pImg-&gt;GetImageInfo( 0, &amp;imageinfo );



		GetItemRect( hitem, &amp;rect, TRUE );

		rect.right = rect.left - 2;

		rect.left -= (imageinfo.rcImage.right + 2);



		pTI-&gt;hwnd = m_hWnd;

		pTI-&gt;uId = (UINT)hitem;

		pTI-&gt;lpszText = LPSTR_TEXTCALLBACK;

		pTI-&gt;rect = rect;

		return pTI-&gt;uId;

	}

	else if( nFlags &amp; TVHT_ONITEMSTATEICON )

	{

		CImageList *pImg = GetImageList( TVSIL_NORMAL );

		IMAGEINFO imageinfo;

		pImg-&gt;GetImageInfo( 0, &amp;imageinfo );



		GetItemRect( hitem, &amp;rect, TRUE );

		rect.right = rect.left - (imageinfo.rcImage.right + 2);



		pImg = GetImageList( TVSIL_STATE );

		rect.left = rect.right - imageinfo.rcImage.right ;



		pTI-&gt;hwnd = m_hWnd;

		pTI-&gt;uId = (UINT)hitem;

		pTI-&gt;lpszText = LPSTR_TEXTCALLBACK;

		pTI-&gt;rect = rect;

		

		// return value should be different from that used for item icon

		return pTI-&gt;uId*2;	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

	}

	return -1;

}</tt></font></pre>



<h4>Step 3: ?? TTN_NEEDTEXT</h4>



<p><font color="#000000" size="3">由于在增加ToolTip是使用用了&nbsp; <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-&gt;idFrom;<br> 
 
<br> 
 
// Do not process the message from built in tooltip&nbsp;<br> 
 
if( nID == (UINT)m_hWnd &amp;&amp;<br> 
 
(( pNMHDR-&gt;code == TTN_NEEDTEXTA &amp;&amp; pTTTA-&gt;uFlags &amp; TTF_IDISHWND ) ||<br> 
 
( pNMHDR-&gt;code == TTN_NEEDTEXTW &amp;&amp; pTTTW-&gt;uFlags &amp; 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-&gt;pt;<br> 
 
ScreenToClient( &amp;pt );<br> 
 
<br> 
 
UINT nFlags;<br> 
 
HTREEITEM hitem = HitTest( pt, &amp;nFlags );<br> 
 
if( nFlags &amp; TVHT_ONITEMICON )<br> 
 
{<br> 
 
int nImage, nSelImage;<br> 
 
GetItemImage( (HTREEITEM ) nID, nImage, nSelImage );<br> 
 
strTipText.Format( &quot;Image : %d&quot;, nImage );<br> 
 
}<br> 
 
else<br> 
 
{<br> 
 
strTipText.Format( &quot;State : %d&quot;, GetItemState( (HTREEITEM ) nID,&nbsp;<br> 
 
&nbsp;&nbsp;&nbsp;&nbsp; TVIS_STATEIMAGEMASK ) );<br> 
 
}<br> 
 
<br> 
 
#ifndef _UNICODE<br> 
 
if (pNMHDR-&gt;code == TTN_NEEDTEXTA)<br> 
 
lstrcpyn(pTTTA-&gt;szText, strTipText, 80);<br> 
 
else<br> 
 
_mbstowcsz(pTTTW-&gt;szText, strTipText, 80);<br> 
 
#else<br> 
 
if (pNMHDR-&gt;code == TTN_NEEDTEXTA)<br> 
 
_wcstombsz(pTTTA-&gt;szText, strTipText, 80);<br> 
 
else<br> 
 
lstrcpyn(pTTTW-&gt;szText, strTipText, 80);<br> 
 
#endif<br> 
 
*pResult = 0;<br> 
 
<br> 
 
return TRUE;&nbsp;&nbsp;&nbsp; // 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 + -