📄 treeviewex.cpp
字号:
// TreeViewEx.cpp: implementation of the CTreeViewEx class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resourceeditor.h"
#include "TreeViewEx.h"
#include "DirFileInfo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
const int CTreeViewEx::IMG_IDX = 2;
const int CTreeViewEx::IMG_SEL_IDX = 3;
const int CTreeViewEx::IMG_COLL_IDX = 0;
const int CTreeViewEx::IMG_COLL_SEL_IDX = 1;
const int CTreeViewEx::IMG_EXPA_IDX = 4;
const int CTreeViewEx::IMG_EXPA_SEL_IDX = 5;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CTreeViewEx, CTreeView)
CTreeViewEx::CTreeViewEx()
{
m_pInfo = NULL;
m_pImgLst = NULL;
m_hSelOnKilled = NULL;
m_hBmp = NULL;
}
CTreeViewEx::~CTreeViewEx()
{
}
BEGIN_MESSAGE_MAP(CTreeViewEx, CTreeView)
//{{AFX_MSG_MAP(CTreeViewEx)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMETreeView drawing
void CTreeViewEx::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CMETreeView diagnostics
#ifdef _DEBUG
void CTreeViewEx::AssertValid() const
{
CTreeView::AssertValid();
}
void CTreeViewEx::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
void CTreeViewEx::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
CTreeCtrl &tc = GetTreeCtrl();
tc.DeleteAllItems();
if(m_pImgLst == NULL)
{
m_pImgLst = new CImageList;
if(m_pImgLst != NULL)
{
VERIFY(m_pImgLst->Create(IDB_CATEGORY, 0, 6, RGB(255, 255, 255)));
tc.SetImageList(m_pImgLst, TVSIL_NORMAL);
}
}
}
// 用各菜单项填充TreeCtrl,将菜单信息以树形结构显示出来
// 被填充的菜单项(包括子菜单)
// 被填充的菜单项在树中所对应的父菜单的句柄
void CTreeViewEx::FillTreeCtrl(CDirFileNode * pNode, HTREEITEM hParent/* = TVI_ROOT*/ )
{
if(pNode == NULL)
return;
int nChildCount = m_pInfo->GetChildCount(pNode);
if(nChildCount == 0)
return;
CTreeCtrl & tc = GetTreeCtrl();
for(int i = 0; i < nChildCount; i++)
{
CDirFileNode * pChild = (CDirFileNode *)m_pInfo->GetChild(pNode, i);
RecursiveFillTree(tc, pChild, hParent);
}
}
// 注:只填充当前节点和它的子节点,不填充兄弟节点
void CTreeViewEx::RecursiveFillTree( CTreeCtrl &tc, CDirFileNode * pNode, HTREEITEM hParent )
{
if(pNode == NULL)
return;
BOOL bIsDir = m_pInfo->IsDirNode(pNode);
int nImg = bIsDir ? IMG_COLL_IDX : IMG_IDX;
int nSel = bIsDir ? IMG_COLL_SEL_IDX : IMG_SEL_IDX;
HTREEITEM hInsert = tc.InsertItem(pNode->szName, nImg, nSel, hParent);
tc.SetItemData(hInsert, (DWORD)pNode);
CDirFileNode * pCur = (CDirFileNode *)m_pInfo->GetChild(pNode);
for ( ; pCur != NULL; pCur = (CDirFileNode *)m_pInfo->GetNext(pCur))
{
RecursiveFillTree(tc, pCur, hInsert);
}
}
void CTreeViewEx::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
if(m_pImgLst != NULL)
{
m_pImgLst->DeleteImageList();
delete m_pImgLst;
m_pImgLst = NULL;
}
CTreeView::PostNcDestroy();
}
void CTreeViewEx::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CTreeCtrl &tc = GetTreeCtrl();
if( pNMTreeView->action == TVE_EXPAND )
{
// expand
tc.SetItemImage(pNMTreeView->itemNew.hItem, IMG_EXPA_IDX, IMG_EXPA_SEL_IDX);
}
else if( pNMTreeView->action == TVE_COLLAPSE )
{
// collaps
tc.SetItemImage(pNMTreeView->itemNew.hItem, IMG_COLL_IDX, IMG_COLL_SEL_IDX);
}
*pResult = 0;
}
void CTreeViewEx::OnKillFocus(CWnd* pNewWnd)
{
CTreeView::OnKillFocus(pNewWnd);
// TODO: Add your message handler code here
m_hSelOnKilled = GetTreeCtrl().GetSelectedItem();
}
void CTreeViewEx::OnSetFocus(CWnd* pOldWnd)
{
CTreeView::OnSetFocus(pOldWnd);
// TODO: Add your message handler code here
GetTreeCtrl().SelectItem(m_hSelOnKilled);
}
void CTreeViewEx::SetModifiedFlag( BOOL bModified /* = TRUE */)
{
CDocument * pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->SetModifiedFlag( bModified );
}
BOOL CTreeViewEx::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= TVS_HASLINES;
cs.style |= TVS_LINESATROOT;
cs.style |= TVS_HASBUTTONS;
cs.style |= TVS_SHOWSELALWAYS;
cs.style &= ~TVS_EDITLABELS;
cs.style &= ~TVS_TRACKSELECT;
return CTreeView::PreCreateWindow(cs);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -