typelibtreeview.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 307 行

CPP
307
字号
// tlbtree.cpp : implementation file//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.#include "stdafx.h"#include "util.h"#include "resource.h"//#include "typelib.h"#include "TypeLibTreeView.h"#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define MAX_NAMES   256/////////////////////////////////////////////////////////////////////////////// CTypeLibTreeViewIMPLEMENT_DYNCREATE(CTypeLibTreeView, CView)CTypeLibTreeView::CTypeLibTreeView( ITypeLib* pTLB ){	m_hTypeInfos = NULL ;	m_ptlb = pTLB ;}CTypeLibTreeView::~CTypeLibTreeView(){	if (m_ptlb) {		int i = m_ptlb->Release() ;	}}BEGIN_MESSAGE_MAP(CTypeLibTreeView, CView)	//{{AFX_MSG_MAP(CTypeLibTreeView)	ON_WM_CREATE()	ON_WM_DESTROY()	ON_WM_SIZE()	//}}AFX_MSG_MAP	ON_NOTIFY(TVN_SELCHANGED, ID_TREEVIEW, OnTreeSelchanged)	ON_NOTIFY(TVN_ITEMEXPANDING, ID_TREEVIEW, OnTreeItemExpanding)	ON_NOTIFY(TVN_ITEMEXPANDED, ID_TREEVIEW, OnTreeItemExpanded)	ON_NOTIFY(NM_RETURN, ID_TREEVIEW, OnTreeItemReturn)	ON_NOTIFY(TVN_DELETEITEM, ID_TREEVIEW, OnTreeDeleteItem)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTypeLibTreeView drawing/////////////////////////////////////////////////////////////////////////////// CTypeLibTreeView diagnostics#ifdef _DEBUGvoid CTypeLibTreeView::AssertValid() const{	CView::AssertValid();}void CTypeLibTreeView::Dump(CDumpContext& dc) const{	CView::Dump(dc);}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CTypeLibTreeView message handlersint CTypeLibTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct){	if (CView::OnCreate(lpCreateStruct) == -1)		return -1;	RECT rect ;	rect.top = lpCreateStruct->y ;	rect.left = lpCreateStruct->x ;	rect.bottom = lpCreateStruct->cy ;	rect.right = lpCreateStruct->cx ;	if (!m_tree.Create( WS_CHILD | WS_VISIBLE |								WS_BORDER |								TVS_HASLINES |								TVS_LINESATROOT |								TVS_SHOWSELALWAYS |								TVS_HASBUTTONS |								TVS_DISABLEDRAGDROP,								rect, this, ID_TREEVIEW ))	{		TRACE( _T("Tree control failed to create!") ) ;		return -1 ;	}	m_images.Create( IDB_IMAGELIST, 16, 64, RGB(0,255,0) ) ;	m_tree.SetImageList( &m_images, TVSIL_NORMAL ) ;	return 0;}void CTypeLibTreeView::OnDestroy(){	CView::OnDestroy();	m_tree.DeleteAllItems() ;}void CTypeLibTreeView::OnDraw(CDC* pDC){	// TODO: Add your specialized code here and/or call the base class}void CTypeLibTreeView::OnSize(UINT nType, int cx, int cy){	CView::OnSize(nType, cx, cy);	m_tree.SetWindowPos( NULL, -1, -1, cx+2, cy+2, SWP_NOZORDER ) ;}void CTypeLibTreeView::OnInitialUpdate(){	TRACE(_T("OnInitialUpdate\n")) ;		ASSERT( m_ptlb );	m_ptlb->AddRef() ;	CView::OnInitialUpdate();}void CTypeLibTreeView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint){	USES_CONVERSION;	if (lHint != NULL )		return ;	TRACE(_T("OnUpdate\n")) ;	m_tree.SetRedraw( FALSE ) ;	BeginWaitCursor() ;	m_tree.DeleteAllItems() ;	m_hTypeInfos = NULL ;	TV_INSERTSTRUCT tvis ;	tvis.hParent = TVI_ROOT ;	tvis.hInsertAfter = TVI_FIRST ;	tvis.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE ;	tvis.item.iImage = CTreeItem::typeTypeLib ;	tvis.item.iSelectedImage = tvis.item.iImage + 1 ;	HRESULT hr = S_OK ;	CString strError ;	TRY	{				tvis.item.cChildren = m_ptlb->GetTypeInfoCount() ;				BSTR    bstrName = NULL ;		BSTR    bstrDoc = NULL ;		BSTR    bstrHelp = NULL ;		DWORD   dwHelpID ;		hr = m_ptlb->GetDocumentation( MEMBERID_NIL, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp ) ;		if (FAILED(hr))		{			strError = _T("ITypeLib::GetDocumentation failed.") ;			AfxThrowMemoryException() ;		}		CTreeItem* pItem = new CTreeItem(&m_tree) ;		pItem->m_Type = CTreeItem::typeTypeLib ;		pItem->SetTypeLib( m_ptlb ) ;		m_ptlb->AddRef() ;		tvis.item.lParam = (LPARAM)pItem ;		LPCTSTR lpszName = OLE2CT(bstrName);		if (::SysStringLen(bstrDoc) != 0)		{			LPCTSTR lpszDoc = OLE2CT(bstrDoc);			CString str;			str.Format( _T("%s (%s)"), lpszName, lpszDoc);			tvis.item.pszText = str.GetBuffer(0);			m_hTypeInfos = m_tree.InsertItem( &tvis ) ;			str.ReleaseBuffer(-1) ;		}		else		{			tvis.item.pszText = (LPTSTR)lpszName;			m_hTypeInfos = m_tree.InsertItem( &tvis ) ;		}		::SysFreeString( bstrName ) ;		::SysFreeString( bstrDoc ) ;		::SysFreeString( bstrHelp ) ;	}	CATCH(CException, pException)	{	}	END_CATCH	if (m_hTypeInfos)	{		m_tree.Expand( m_hTypeInfos, TVE_EXPAND ) ;		//m_tree.SelectItem( m_hTypeInfos ) ;	}	m_tree.SetRedraw( TRUE ) ;	EndWaitCursor() ;}void CTypeLibTreeView::DeleteTreeItems( HTREEITEM htree ){	HTREEITEM       hItem, hItemNext ;	ASSERT(htree) ;	hItem = m_tree.GetChildItem( htree ) ;	while( hItem )	{		hItemNext = m_tree.GetNextSiblingItem( hItem ) ;		m_tree.DeleteItem( hItem ) ;		hItem = hItemNext ;	}}void CTypeLibTreeView::OnTreeSelchanged(NMHDR* pNMHDR, LRESULT* pResult){	NM_TREEVIEW* pnmtv = (NM_TREEVIEW*)pNMHDR;	*pResult = 0;	CTreeItem*  pItem = (CTreeItem*)pnmtv->itemNew.lParam ;	if (pItem == NULL)		return ;	ASSERT(pItem->IsKindOf(RUNTIME_CLASS(CTreeItem)));}void CTypeLibTreeView::OnTreeItemExpanding(NMHDR* pNMHDR, LRESULT* pResult){	*pResult = 0 ;	NM_TREEVIEW* pnmtv = (NM_TREEVIEW*)pNMHDR;	if ((pnmtv->action != TVE_EXPAND && pnmtv->itemNew.lParam) ||		(pnmtv->itemNew.state & TVIS_EXPANDEDONCE))		return ;	CTreeItem*  pItem = (CTreeItem*)pnmtv->itemNew.lParam ;	if (pItem == NULL)		return ;	ASSERT(pItem->IsKindOf(RUNTIME_CLASS(CTreeItem)));	BeginWaitCursor() ;	m_tree.SetRedraw( FALSE ) ;	*pResult = !pItem->Expand(  pnmtv->itemNew.hItem ) ;	// No children	if (*pResult == TRUE)	{		TV_ITEM item ;		item.cChildren = 0 ;		item.mask = TVIF_CHILDREN ;		item.hItem = pnmtv->itemNew.hItem ;		m_tree.SetItem( &item ) ;	}	m_tree.SetRedraw( TRUE ) ;	EndWaitCursor() ;}void CTypeLibTreeView::OnTreeItemExpanded(NMHDR* pNMHDR, LRESULT* pResult){	*pResult = (LRESULT)FALSE ;}void CTypeLibTreeView::OnTreeItemReturn(NMHDR* pNMHDR, LRESULT* pResult){	*pResult = (LRESULT)TRUE ;	HTREEITEM hTreeItemSel = m_tree.GetSelectedItem() ;	if (hTreeItemSel)		m_tree.Expand( hTreeItemSel, TVE_TOGGLE ) ;}inline void CTypeLibTreeView::OnTreeDeleteItem(NMHDR* pNMHDR, LRESULT* pResult){	*pResult = (LRESULT)TRUE ;	NM_TREEVIEW* pnmtv = (NM_TREEVIEW*)pNMHDR;	if (pnmtv->itemOld.lParam)	{		CTreeItem* pItem = (CTreeItem*)pnmtv->itemOld.lParam ;		ASSERT(pItem->IsKindOf(RUNTIME_CLASS(CTreeItem)));		delete pItem ;		//pnmtv->itemOld.lParam = NULL ;	}}

⌨️ 快捷键说明

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