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

📄 control.htm#1

📁 VC的一些技巧性文档
💻 HTM#1
📖 第 1 页 / 共 3 页
字号:
</p></td></tr><tr><td><font color="0000FF"><a name="12">TreeList control中使用check box<Br>闻怡洋译</a></font></td></tr><tr><td><p></Br></Br>方法很简单,一句话总结:定义用户定义状态,并对不同的状态(state)使用不同的图片。<Br></Br>在下面的sample中,我们使用CTreeListCtrl作为父类。由于TreeList control支持一些现有state 所以用户定义的state必需使用INDEXTOSTATEIMAGEMASK(i)进行变换。<Br></Br>如果对本文所讲的方法有不明的地方,可以先熟悉一下TreeList Control的使用,然后再看本文。<Br></Br></Br>Step 1: 创建state list image<Br>创建的图片有三种状态。<Br></Br>state ImageList只是用于和state改变有关的显示图片,TreeList Control中还应包含其他image List,如:焦点选择改变的imageList,用于在选中和未选中是改变显示图片。<Br></Br>Step 2: 初始化<Br>CImageList m_imageState; 成员变量<Br>m_imageState.Create( IDB_STATE, 13, 1, RGB(255,255,255) );//创建ImageList<Br>m_tree.SetImageList( &(m_tree.m_imageState), TVSIL_STATE );//在TreeList中加入表示状态的ImageList。<Br>Step 3: 增加结点时设置标记<Br>重新定义一个InsertItem函数。使用TV_INSERTSTRUCT来插入结点。<Br></Br>即使用函数HTREEITEM InsertItem( LPTV_INSERTSTRUCT lpInsertStruct );<Br></Br>lpInsertStruct->item.mask |= TVIF_STATE   ;//保证state 和stateMask是有效的。<Br></Br>你必须在TV_ITEM中标明state和stateMask。(INDEXTOSTATEIMAGEMASK宏可以得到state image的下标)<Br></Br>state 设置为INDEXTOSTATEIMAGEMASK(1)表示用户定义的第一种状态<Br></Br>stateMask设置为TVIS_STATEIMAGEMASK.表示用户定义的状态。<Br></Br>当然也可以调用SetItemState设置state.<Br></Br>SetItemState( hItem, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK );<Br></Br>Step 4: 增加mouse button down消息映射<Br>通过使用HitTest来得知是否按在State图片上。并需要得到当前state。<Br></Br>void CTreeCtrlX::OnLButtonDown(UINT nFlags, CPoint point)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;UINT uFlags=0;<Br>&nbsp;&nbsp;&nbsp;&nbsp;HTREEITEM hti = HitTest(point,&uFlags);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;if( uFlags & TVHT_ONITEMSTATEICON )<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12;<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//GetItemState( hti, TVIS_STATEIMAGEMASK )>>12 对用户定义state反变换<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1),<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TVIS_STATEIMAGEMASK );<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br>}<Br></Br>Step 5:处理 OnKeyDown<Br>void CTreeCtrlX::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;if( nChar == VK_SPACE )<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTREEITEM hti = GetSelectedItem();<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12;<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1),<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TVIS_STATEIMAGEMASK );<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br>}<Br></Br></Br></Br></Br>Step 6: 增加其他的功能函数<Br>BOOL CTreeCtrlX::IsItemChecked(HTREEITEM hItem)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;return GetItemState( hItem, TVIS_STATEIMAGEMASK )>>12 == 2;<Br>}<Br></Br>HTREEITEM CTreeCtrlX::GetFirstCheckedItem()<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;for ( HTREEITEM hItem = GetRootItem(); hItem!=NULL; hItem = GetNextItem( hItem ) )<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( IsItemChecked(hItem) )<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hItem;<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;return NULL;<Br>}<Br></Br>HTREEITEM CTreeCtrlX::GetNextCheckedItem( HTREEITEM hItem )<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;for ( hItem = GetNextItem( hItem ); hItem!=NULL; hItem = GetNextItem( hItem ) )<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( IsItemChecked(hItem) )<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hItem;<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;return NULL;<Br>}<Br></Br>HTREEITEM CTreeCtrlX::GetPrevCheckedItem( HTREEITEM hItem )<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;for ( hItem = GetPrevItem( hItem ); hItem!=NULL; hItem = GetPrevItem( hItem ) )<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( IsItemChecked(hItem) )<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hItem;<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;return NULL;<Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="13">可以使用Drag&Drop的CTreeView<Br>闻怡洋译</a></font></td></tr><tr><td><p></Br></Br>CTreeViewExt是MFC使用者可重用的类,该类由CTreeView派生,可以用在文档-视结构的应用程序中,并且支持Drag&Drop。<Br></Br>使用者所需要做的仅仅是将文件加到AppWizard产生的工程中,(CTreeView为基类)并且将CTreeView替换为CTreeViewExt。并重载三个Virtual Function。<Br></Br>(WenYY:这很简单吧,下面是源代码,我会在必要的地方加上注释,但由于原作者并未加,所以如果有出入请原谅,作者定义了三处虚拟函数,其作用是让使用者重载后,加入自己的判断条件和结果处理的功能,很巧妙的思想:<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyItemProperties<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsItemCanBeDroppedOn(HTREEITEM hSource, HTREEITEM hTarget);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL ItemCanBeDragged(HTREEITEM hItem);//检查是否可以对该ITEM实施Drag&Drop<Br>)<Br></Br>Header file<Br></Br>#if !defined(AFX_TREEVIEWEXT_H__99D8F6F8_79F0_11D1_8DC6_0000E8125FE5__INCLUDED_)<Br>#define AFX_TREEVIEWEXT_H__99D8F6F8_79F0_11D1_8DC6_0000E8125FE5__INCLUDED_<Br></Br>#if _MSC_VER >= 1000<Br>#pragma once<Br>#endif // _MSC_VER >= 1000<Br>// TreeViewExt.h : header file<Br>//<Br></Br>/////////////////////////////////////////<Br>// CTreeViewExt view<Br></Br>class CTreeViewExt : public CTreeView<Br>{<Br>protected:<Br>&nbsp;&nbsp;&nbsp;&nbsp;CTreeViewExt();           // protected constructor used by dynamic creation<Br>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_DYNCREATE(CTreeViewExt)<Br></Br>// Attributes<Br>public:<Br></Br>// Operations<Br>public:<Br></Br>// Overrides<Br>&nbsp;&nbsp;&nbsp;&nbsp;// ClassWizard generated virtual function overrides<Br>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_VIRTUAL(CTreeViewExt)<Br>&nbsp;&nbsp;&nbsp;&nbsp;protected:<Br>&nbsp;&nbsp;&nbsp;&nbsp;virtual void OnDraw(CDC* pDC);      // overridden to draw this view<Br>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_VIRTUAL<Br></Br>// Implementation<Br>protected:<Br>&nbsp;&nbsp;&nbsp;&nbsp;HTREEITEM m_hDraggedItem;<Br>&nbsp;&nbsp;&nbsp;&nbsp;BOOL m_bDraggingNow;   //标记<Br>&nbsp;&nbsp;&nbsp;&nbsp;CImageList *m_pDragImageList;<Br>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CTreeViewExt();<Br>#ifdef _DEBUG<Br>&nbsp;&nbsp;&nbsp;&nbsp;virtual void AssertValid() const;<Br>&nbsp;&nbsp;&nbsp;&nbsp;virtual void Dump(CDumpContext& dc) const;<Br>#endif<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;// Generated message map functions<Br>protected:<Br>&nbsp;&nbsp;&nbsp;&nbsp;virtual void CopyItemProperties(HTREEITEM hNewItem, HTREEITEM hDraggedItem);<Br>&nbsp;&nbsp;&nbsp;&nbsp;virtual BOOL IsItemCanBeDroppedOn(HTREEITEM hSource, HTREEITEM hTarget);<Br>&nbsp;&nbsp;&nbsp;&nbsp;virtual BOOL ItemCanBeDragged(HTREEITEM hItem);//检查是否可以对该ITEM实施Drag&Drop<Br>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_MSG(CTreeViewExt)<Br>&nbsp;&nbsp;&nbsp;&nbsp;afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);//必须重载的函数<Br>&nbsp;&nbsp;&nbsp;&nbsp;afx_msg void OnMouseMove(UINT nFlags, CPoint point);<Br>&nbsp;&nbsp;&nbsp;&nbsp;afx_msg void OnLButtonUp(UINT nFlags, CPoint point);<Br>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_MSG<Br>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_MESSAGE_MAP()<Br>};<Br></Br>/////////////////////////////////////////<Br></Br>//{{AFX_INSERT_LOCATION}}<Br>// Microsoft Developer Studio will insert additional declarations immediately before the previous line.<Br></Br>#endif // !defined(AFX_TREEVIEWEXT_H__99D8F6F8_79F0_11D1_8DC6_0000E8125FE5__INCLUDED_)<Br></Br>Implementation file<Br></Br>// TreeViewExt.cpp : implementation file<Br>//<Br></Br>#include "stdafx.h"<Br>#include "TreeViewExt.h"<Br></Br>#ifdef _DEBUG<Br>#define new DEBUG_NEW<Br>#undef THIS_FILE<Br>static char THIS_FILE[] = __FILE__;<Br>#endif<Br></Br>/////////////////////////////////////////<Br>// CTreeViewExt<Br></Br>IMPLEMENT_DYNCREATE(CTreeViewExt, CTreeView)<Br></Br>CTreeViewExt::CTreeViewExt()<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_bDraggingNow		= FALSE;<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_hDraggedItem		= NULL;<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_pDragImageList	= NULL;<Br>}<Br></Br>CTreeViewExt::~CTreeViewExt()<Br>{<Br>}<Br></Br></Br>BEGIN_MESSAGE_MAP(CTreeViewExt, CTreeView)<Br>&nbsp;&nbsp;&nbsp;&nbsp;//{{AFX_MSG_MAP(CTreeViewExt)<Br>&nbsp;&nbsp;&nbsp;&nbsp;ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)<Br>&nbsp;&nbsp;&nbsp;&nbsp;ON_WM_MOUSEMOVE()<Br>&nbsp;&nbsp;&nbsp;&nbsp;ON_WM_LBUTTONUP()<Br>&nbsp;&nbsp;&nbsp;&nbsp;//}}AFX_MSG_MAP<Br>END_MESSAGE_MAP()<Br></Br>/////////////////////////////////////////<Br>// CTreeViewExt drawing<Br></Br>void CTreeViewExt::OnDraw(CDC* pDC)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;CDocument* pDoc = GetDocument();<Br>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: add draw code here<Br>}<Br></Br>/////////////////////////////////////////<Br>// CTreeViewExt diagnostics<Br></Br>#ifdef _DEBUG<Br>void CTreeViewExt::AssertValid() const<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;CTreeView::AssertValid();<Br>}<Br></Br>void CTreeViewExt::Dump(CDumpContext& dc) const<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;CTreeView::Dump(dc);<Br>}<Br>#endif //_DEBUG<Br></Br>/////////////////////////////////////////<Br>// CTreeViewExt message handlers<Br></Br>void CTreeViewExt::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;if (!m_bDraggingNow)<Br>&nbsp;&nbsp;&nbsp;&nbsp;{//先检查是否正在过程中<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ItemCanBeDragged(pNMTreeView->itemNew.hItem))<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//查询条件,是否允许Drag&Drop<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTreeCtrl& tree = GetTreeCtrl();<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.SetCapture();<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bDraggingNow = TRUE;<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hDraggedItem = pNMTreeView->itemNew.hItem;//保存变量<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.Select(m_hDraggedItem, TVGN_CARET);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDragImageList = tree.CreateDragImage(m_hDraggedItem);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDragImageList->DragEnter(&tree, pNMTreeView->ptDrag);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDragImageList->BeginDrag(0, CPoint(0, 0));<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br></Br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -