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

📄 treeviewex.cpp

📁 Resource editor base speadrum Chinese mobile
💻 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 + -