📄 控制.htm
字号:
*pResult = 0;<Br>}<Br></Br>void CTreeViewExt::OnMouseMove(UINT nFlags, CPoint point)<Br>{<Br> if (m_bDraggingNow)<Br> {<Br> CTreeCtrl& tree = GetTreeCtrl();<Br> m_pDragImageList->DragEnter(&tree, point);<Br> m_pDragImageList->DragMove(point);<Br> }<Br></Br> CTreeView::OnMouseMove(nFlags, point);<Br>}<Br></Br>void CTreeViewExt::OnLButtonUp(UINT nFlags, CPoint point)<Br>{<Br> if (m_bDraggingNow)<Br> {<Br> ReleaseCapture();<Br></Br> m_bDraggingNow = FALSE;<Br> m_pDragImageList->EndDrag();<Br> delete m_pDragImageList;<Br> m_pDragImageList = NULL;<Br></Br> CTreeCtrl& tree = GetTreeCtrl();<Br> UINT flags;<Br> HTREEITEM hTargetItem = tree.HitTest(point, &flags);//得到目标<Br> if (hTargetItem != NULL && IsItemCanBeDroppedOn(m_hDraggedItem, hTargetItem))<Br> {//查询是否可以成功完成,条件是开始时选中的Item和结束使选中的ITEM是否满足你的条件<Br> HTREEITEM hNewItem = tree.InsertItem("Untitled", hTargetItem);<Br> CopyItemProperties(hNewItem, m_hDraggedItem);//进行处理<Br> if (nFlags != MK_CONTROL)<Br> tree.DeleteItem(m_hDraggedItem);<Br> }<Br></Br> m_hDraggedItem = NULL;<Br> }<Br></Br> CTreeView::OnLButtonUp(nFlags, point);<Br>}<Br></Br>BOOL CTreeViewExt::ItemCanBeDragged(HTREEITEM hItem)<Br>{//作用为决定现在是否能开始,可以作为一种运行时的选项<Br> return FALSE;<Br>}<Br></Br>BOOL CTreeViewExt::IsItemCanBeDroppedOn(HTREEITEM hSource, HTREEITEM hTarget)<Br>{//决定现在结束条件是否正常,如不正常则放弃这次操作<Br> return FALSE;<Br>}<Br></Br>void CTreeViewExt::CopyItemProperties(HTREEITEM hNewItem, HTREEITEM hDraggedItem)<Br>{//按照你的需要对两个ITEM进行处理。<Br></Br>}<Br></Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="14">有关属性对话框(property sheet )的几个提示<Br>闻怡洋</a></font></td></tr><tr><td><p></Br>下面的所有例子,都假定你从CPropertySheet中派生了新类。<Br></Br>1、隐藏APPLY按钮<Br></Br>使用 PSH_NOAPPLYNOW 标志.<Br></Br>propsheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;<Br>2、增加新的子窗口<Br>使用成员变量。CEdit m_edit.<Br>BOOL CMyPropSheet::OnInitDialog()<Br>{<Br> BOOL bResult = CPropertySheet::OnInitDialog();<Br></Br> CRect rectWnd;<Br> GetWindowRect(rectWnd);<Br> SetWindowPos(NULL, 0, 0,<Br> rectWnd.Width() + 100,<Br> rectWnd.Height(),<Br> SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);<Br></Br> m_edit.CreateEx( WS_EX_CLIENTEDGE, _T("EDIT"), NULL,<Br> WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,<Br> rectWnd.Width(), 20, 80, 24, m_hWnd, 0, 0 );<Br></Br> m_edit.SetFont( GetFont() );<Br></Br> CenterWindow();<Br> return bResult;<Br>}<Br>3、改变页片上的字体<Br>在 OnInitDialog() 中:<Br></Br>// m_fontEdit is a member variable<Br>// Create a bold font<Br>m_fontEdit.CreateFont( -8, 0, 0, 0, 700, 0, 0, 0, 1,<Br> 0, 0, 0, 0, _T("MS Sans Serif") );<Br>GetTabControl()->SetFont( &m_fontEdit );<Br>4、使用Image<Br></Br>m_imageTab为成员变量。<Br>BOOL CMyPropSheet::OnInitDialog()<Br>{<Br>BOOL bResult = CPropertySheet::OnInitDialog();<Br></Br>m_imageTab.Create( IDB_TABIMAGES, 13, 1, RGB(255,255,255) );<Br>CTabCtrl *pTab = GetTabControl();<Br>pTab->SetImageList( &m_imageTab );<Br></Br>TC_ITEM tcItem;<Br>tcItem.mask = TCIF_IMAGE;<Br>for( int i = 0; i < 3; i++ )<Br>{<Br>tcItem.iImage = i;<Br>pTab->SetItem( i, &tcItem );<Br>}<Br>return bResult;<Br>}<Br> <Br></p></td></tr><tr><td><font color="0000FF"><a name="15">为TreeCtrl中的项增加ToolTip<Br>文洋译</a></font></td></tr><tr><td><p></Br></Br>要点:通过OnToolHitTest来增加ToolTip,CTreeCtrl::HitTest(...)的使用,TTN_NEEDTEXT消息的处理。<Br></Br>定义一个新类,有CTreeCtrl派生<Br>Step 1:打开ToolTip 功能<Br>void CTreeCtrlX::PreSubclassWindow()<Br>{<Br> CTreeCtrl::PreSubclassWindow();<Br></Br> EnableToolTips(TRUE);<Br>}<Br></Br></Br>Step 2: OnToolHitTest() 的重载<Br>首先通过HitTest决定是否增加ToolTip,如果需要则返回非零。<Br></Br>在本例中ToolTip使用了LPSTR_TEXTCALLBACK,而没有立即设定显示字符串。<Br></Br>在本例只在鼠标指向每项的图片时才显示ToolTip<Br></Br><nFlags & TVHT_ONITEMICON ||nFlags & TVHT_ONITEMSTATEICON><Br></Br>int CTreeCtrlX::OnToolHitTest(CPoint point, TOOLINFO * pTI) const<Br>{<Br> RECT rect;<Br></Br> UINT nFlags;<Br> HTREEITEM hitem = HitTest( point, &nFlags );<Br> if( nFlags & TVHT_ONITEMICON )<Br> {<Br> CImageList *pImg = GetImageList( TVSIL_NORMAL );<Br> IMAGEINFO imageinfo;<Br> pImg->GetImageInfo( 0, &imageinfo );<Br></Br> GetItemRect( hitem, &rect, TRUE );<Br> rect.right = rect.left - 2;<Br> rect.left -= (imageinfo.rcImage.right + 2);<Br></Br> pTI->hwnd = m_hWnd;<Br> pTI->uId = (UINT)hitem;<Br> pTI->lpszText = LPSTR_TEXTCALLBACK;<Br> pTI->rect = rect;<Br> return pTI->uId;<Br> }<Br> else if( nFlags & TVHT_ONITEMSTATEICON )<Br> {<Br> CImageList *pImg = GetImageList( TVSIL_NORMAL );<Br> IMAGEINFO imageinfo;<Br> pImg->GetImageInfo( 0, &imageinfo );<Br></Br> GetItemRect( hitem, &rect, TRUE );<Br> rect.right = rect.left - (imageinfo.rcImage.right + 2);<Br></Br> pImg = GetImageList( TVSIL_STATE );<Br> rect.left = rect.right - imageinfo.rcImage.right ;<Br></Br> pTI->hwnd = m_hWnd;<Br> pTI->uId = (UINT)hitem;<Br> pTI->lpszText = LPSTR_TEXTCALLBACK;<Br> pTI->rect = rect;<Br></Br> // return value should be different from that used for item icon<Br> return pTI->uId*2;<Br> }<Br> return -1;<Br>}<Br>Step 3: ?? TTN_NEEDTEXT<Br>由于在增加ToolTip是使用用了 LPSTR_TEXTCALLBACK,因此ToolTip在显示时会发送该消息来得到显示字符串。<Br></Br>BEGIN_MESSAGE_MAP(CTreeCtrlX, CTreeCtrl)<Br> //{{AFX_MSG_MAP(CTreeCtrlX)<Br> :<Br> :<Br> //}}AFX_MSG_MAP<Br> ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)<Br> ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)<Br>END_MESSAGE_MAP()<Br>protected:<Br> //{{AFX_MSG(CTreeCtrlX)<Br> :<Br> :<Br> //}}AFX_MSG<Br> afx_msg BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );<Br> DECLARE_MESSAGE_MAP()<Br></Br>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>}<Br></Br></Br></Br></p></td></tr></table><p align="center"><img src="/logo.gif" align="center"><a href="/co/index.htm">北京美达美科技有限公司</a> 版权所有: 1998-1999</a></p></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -