treeitem.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 1,084 行 · 第 1/2 页

CPP
1,084
字号
// tree.cpp//// 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 "TreeItem.h"#include "util.h"#define MAX_NAMES   64IMPLEMENT_DYNCREATE(CTreeItem, CObject)CTreeItem::CTreeItem(CTreeCtrl* pTree ){	ASSERT(pTree) ;	m_pTree = pTree ;	m_punk = NULL ;	m_Type = typeUnknown ;	m_uiMemid = 0 ;}CTreeItem::~CTreeItem(){	if (m_punk )		m_punk->Release()  ;}BOOL CTreeItem::Expand( HTREEITEM hitem ){	BOOL fExpand = FALSE ;	switch(m_Type)	{	case typeUnknown:	case typeUnknown2:	break ;	case typeTypeLib:		fExpand = ExpandTypeLib( hitem );	break ;	case typeTypeLib2:	{		// CTypeLibWnd::m_fGroupByType == TRUE		CTreeItem* pItem ;		TV_INSERTSTRUCT tvis ;		tvis.hParent = hitem ;		tvis.hInsertAfter = TVI_LAST ;		tvis.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE ;		tvis.item.iImage = CTreeItem::typeUnknown ;		tvis.item.iSelectedImage = tvis.item.iImage + 1 ;		tvis.item.cChildren = 1 ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeEnums ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("Enums") ;		m_pTree->InsertItem(&tvis) ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeRecords ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("Structs") ;		m_pTree->InsertItem(&tvis) ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeModules ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("Modules") ;		m_pTree->InsertItem(&tvis) ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeInterfaces ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("Interfaces") ;		m_pTree->InsertItem(&tvis) ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeDispinterfaces ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("Dispinterfaces") ;		m_pTree->InsertItem(&tvis) ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeCoClasses ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("CoClasses") ;		m_pTree->InsertItem(&tvis) ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeAliases ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("Typedefs") ;		m_pTree->InsertItem(&tvis) ;		pItem = new CTreeItem(m_pTree) ;		pItem->SetTypeLib( GetTypeLib() ) ;		GetTypeLib()->AddRef() ;		pItem->m_Type = CTreeItem::typeUnions ;		tvis.item.lParam = (LPARAM)pItem ;		tvis.item.pszText = _T("Unions") ;		m_pTree->InsertItem(&tvis) ;		fExpand = TRUE ;	}	break ;	case typeEnums:	case typeRecords:	case typeModules:	case typeInterfaces:	case typeDispinterfaces:	case typeCoClasses:	case typeAliases:	case typeUnions:		fExpand = ExpandTypeLib( hitem ) ;	break ;	case typeTypeInfo:	case typeTypeInfo2:	case typeEnum:	case typeRecord:	case typeModule:	case typeInterface:	case typeDispinterface:	case typeCoClass:	case typeAlias:	case typeUnion:		fExpand = ExpandTypeInfo( hitem ) ;	break ;	case typeMethods:	case typeMethods2:		fExpand = ExpandFuncs( hitem ) ;	break ;	case typeProperties:	case typeProperties2:	case typeConstants:	case typeConstants2:		fExpand = ExpandVars( hitem ) ;	break ;	case typeImplTypes:	case typeImplTypes2:		fExpand = ExpandImplTypes( hitem ) ;	break ;	case typeMethod:	case typeProperty:	case typeConstant:	default:	break ;	}	return fExpand ;}BOOL CTreeItem::ExpandTypeLib( HTREEITEM hitem ){	ASSERT(hitem) ;	CTreeItem*  pNewItem = NULL ;	UINT            uiTypeInfoCount = GetTypeLib()->GetTypeInfoCount() ;	HRESULT         hr = S_OK ;	TV_INSERTSTRUCT tvis ;	CString         strError = "Enumerating typeinfos";	TYPEATTR*       pattr = NULL ;	BOOL            fExpand = FALSE ;	tvis.hParent = hitem  ;	tvis.hInsertAfter = TVI_LAST ;	tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN ;	tvis.item.cChildren = 1 ;	TRY	{		for (UINT n = 0 ; n < uiTypeInfoCount ; n++)		{			pNewItem = new CTreeItem( m_pTree ) ;			pNewItem->m_Type = typeTypeInfo ;			ASSERT(pNewItem) ;			tvis.item.lParam = (LPARAM)pNewItem ;			hr = GetTypeLib()->GetTypeInfo( n, (ITypeInfo**)&pNewItem->m_punk ) ;			if (FAILED(hr))			{				strError.Format(_T("Could not get TypeInfo #%u"), n ) ;				AfxThrowOleException(hr) ;			}			ASSERT(pNewItem->m_punk) ;			hr = pNewItem->GetTypeInfo()->GetTypeAttr(&pattr) ;			if FAILED(hr)			{				strError.Format(_T("ITypeInfo::GetTypeAttr() failed") ) ;				AfxThrowOleException(hr) ;			}			if ((m_Type == typeTypeLib) ||				(m_Type == (TypeKindToItemType(pattr->typekind) + 8)))			{				tvis.item.iImage = pattr->typekind + typeEnum ;				tvis.item.iSelectedImage = tvis.item.iImage ;				CString sName;				pNewItem->GetName(sName, TRUE );				tvis.item.pszText = sName.GetBuffer(0);				m_pTree->InsertItem( &tvis ) ;				sName.ReleaseBuffer();				pNewItem->GetTypeInfo()->ReleaseTypeAttr( pattr ) ;				fExpand = TRUE ;			}			else			{				pNewItem->GetTypeInfo()->ReleaseTypeAttr( pattr ) ;				delete pNewItem ;			}	   }	}	CATCH(CException, pException)	{		if (pException->IsKindOf(RUNTIME_CLASS(COleException)))			ErrorMessage( strError, ((COleException*)pException)->m_sc ) ;		else			ErrorMessage( strError, hr ) ;		if (pNewItem)			delete pNewItem ;		return FALSE ;	}	END_CATCH	return fExpand ;}BOOL CTreeItem::ExpandTypeInfo( HTREEITEM hitem ){	ASSERT(m_pTree) ;	ASSERT(hitem) ;	CTreeItem*  pNewItem = NULL ;	HRESULT         hr = S_OK ;	TV_INSERTSTRUCT tvis ;	CString         strError = "Enumerating TypeInfo" ;	TYPEATTR*       pattr = NULL ;	ITypeInfo*      pti = GetTypeInfo() ;	ASSERT(pti) ;	BOOL            fExpand = FALSE ;	tvis.hParent = hitem  ;	tvis.hInsertAfter = TVI_LAST ;	tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN ;	tvis.item.iImage = typeUnknown ;	tvis.item.iSelectedImage = tvis.item.iImage + 1 ;	TRY	{		hr = pti->GetTypeAttr(&pattr) ;		if FAILED(hr)		{			strError.Format(_T("ITypeInfo::GetTypeAttr() failed"), hr ) ;			AfxThrowMemoryException() ;		}		switch(pattr->typekind)		{		// typedef [attributes] enum [tag] {		//      enumlist		// } enumname;		//		// "typedef enum enumname"		case TKIND_ENUM:			fExpand = ExpandVars( hitem ) ;		break ;		// typedef [attributes]		//  struct [tag] {		//      memberlist		//  } structname;		//		// "typedef struct structname"		case TKIND_RECORD:			fExpand = ExpandVars( hitem ) ;		break ;		// [attributes]		//  module modulename {		//      elementlist		// };		case TKIND_MODULE:			if (pattr->cVars)			{				// Add "Constants" folder				//				pNewItem = new CTreeItem(m_pTree) ;				pNewItem->m_Type = typeProperties ;				pNewItem->SetTypeInfo(pti) ;				pti->AddRef() ;				tvis.item.cChildren = pattr->cVars ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.pszText = _T("Constants") ;				tvis.item.iImage = typeConstants ;				tvis.item.iSelectedImage = tvis.item.iImage + 1 ;				m_pTree->InsertItem( &tvis ) ;				fExpand = TRUE ;			}			if (pattr->cFuncs)			{				pNewItem = new CTreeItem(m_pTree) ;				pNewItem->m_Type = typeMethods ;				pNewItem->SetTypeInfo(pti) ;				pti->AddRef() ;				tvis.item.cChildren = pattr->cFuncs ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.pszText = _T("Functions") ;				tvis.item.iImage = typeMethods ;				tvis.item.iSelectedImage = tvis.item.iImage + 1 ;				m_pTree->InsertItem( &tvis ) ;				fExpand = TRUE ;			}		break ;		// [attributes]		//  interface interfacename  [:baseinterface] {		//      functionlist		// };		case TKIND_INTERFACE:			fExpand = ExpandFuncs( hitem) ;			if (pattr->cImplTypes)			{				pNewItem = new CTreeItem(m_pTree) ;				pNewItem->m_Type = typeImplTypes ;				pNewItem->SetTypeInfo(pti) ;				pti->AddRef() ;				tvis.item.pszText = _T("Inherited Interfaces") ;				tvis.item.iImage = typeInterface ;				tvis.item.cChildren = pattr->cImplTypes ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.iSelectedImage = tvis.item.iImage ;				m_pTree->InsertItem( &tvis ) ;				fExpand = TRUE ;			}		break ;		// [attributes]		//  dispinterface intfname {		//      interface interfacename		// };		case TKIND_DISPATCH :			if (pattr->cVars)			{				// Add "Constants" folder				//				pNewItem = new CTreeItem(m_pTree) ;				pNewItem->m_Type = typeConstants ;				pNewItem->SetTypeInfo(pti) ;				pti->AddRef() ;				tvis.item.cChildren = pattr->cVars ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.pszText = _T("Constants") ;				tvis.item.iImage = typeConstants ;				tvis.item.iSelectedImage = tvis.item.iImage + 1 ;				m_pTree->InsertItem( &tvis ) ;				// Add "Properties" folder				//				pNewItem = new CTreeItem(m_pTree) ;				pNewItem->m_Type = typeProperties ;				pNewItem->SetTypeInfo(pti) ;				pti->AddRef() ;				tvis.item.cChildren = pattr->cVars ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.pszText = _T("Properties") ;				tvis.item.iImage = typeProperties ;				tvis.item.iSelectedImage = tvis.item.iImage + 1 ;				m_pTree->InsertItem( &tvis ) ;				fExpand = TRUE ;			 }			if (pattr->cFuncs)			{				pNewItem = new CTreeItem(m_pTree) ;				pNewItem->m_Type = typeMethods ;				pNewItem->SetTypeInfo(pti) ;				pti->AddRef() ;				tvis.item.cChildren = pattr->cFuncs ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.pszText = _T("Methods") ;				tvis.item.iImage = typeMethods ;				tvis.item.iSelectedImage = tvis.item.iImage + 1 ;				m_pTree->InsertItem( &tvis ) ;				fExpand = TRUE ;			}			if (pattr->cImplTypes)			{				pNewItem = new CTreeItem(m_pTree) ;				pNewItem->m_Type = typeImplTypes ;				pNewItem->SetTypeInfo(pti) ;				pti->AddRef() ;				tvis.item.pszText = _T("Inherited Interfaces") ;				tvis.item.iImage = typeInterface ;				tvis.item.cChildren = pattr->cImplTypes ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.iSelectedImage = tvis.item.iImage ;				m_pTree->InsertItem( &tvis ) ;				fExpand = TRUE ;			}		break ;		// [attributes]		//  coclass classname {		//      [attributes2] [interface | dispinterface] interfacename;		//      ...		// };		case TKIND_COCLASS:			fExpand = ExpandImplTypes( hitem ) ;		break ;		// typedef [attributes] basetype aliasname;		case TKIND_ALIAS:			if (pattr->tdescAlias.vt == VT_USERDEFINED)			{				ITypeInfo* ptiRefType = NULL ;				HRESULT hr = pti->GetRefTypeInfo( pattr->tdescAlias.hreftype, &ptiRefType ) ;				if (FAILED(hr))					AfxThrowOleException( hr ) ;				CTreeItem* pNewItem = new CTreeItem(m_pTree) ;				pNewItem->SetTypeInfo( ptiRefType ) ;				pNewItem->m_Type = TypeKindToItemType( pNewItem->GetTypeKind() ) ;				tvis.item.iImage = TypeKindToItemType( pNewItem->GetTypeKind() ) ;				tvis.item.cChildren = 1 ;				tvis.item.lParam = (LPARAM)pNewItem ;				tvis.item.iSelectedImage = tvis.item.iImage ;				CString sName;				pNewItem->GetName(sName, TRUE );				tvis.item.pszText = sName.GetBuffer(0) ;				m_pTree->InsertItem( &tvis ) ;				sName.ReleaseBuffer();				fExpand = TRUE ;			}		break ;		// typedef [attributes] union [tag] {		//      memberlist		// } unionname;		case TKIND_UNION:			fExpand = ExpandVars( hitem ) ;		break ;		default:		break ;		}		if (pattr)			pti->ReleaseTypeAttr( pattr ) ;	}	CATCH(CException, pException)	{		ErrorMessage( strError, hr ) ;		if (pNewItem)			delete pNewItem ;		if (pattr)			pti->ReleaseTypeAttr( pattr ) ;		return FALSE ;	}	END_CATCH	return fExpand ;}BOOL CTreeItem::ExpandFuncs( HTREEITEM hitem ){	ASSERT(hitem) ;	CTreeItem*  pNewItem = NULL ;	HRESULT         hr = S_OK ;	TV_INSERTSTRUCT tvis ;	CString         strError ;	TYPEATTR*       pattr = NULL ;	ITypeInfo*      pti = GetTypeInfo() ;	ASSERT(pti) ;	FUNCDESC*       pfuncdesc = NULL ;	BSTR            bstrParams = NULL ;	BOOL            fExpand = FALSE ;	tvis.hParent = hitem  ;	tvis.hInsertAfter = TVI_LAST ;	tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN ;	TRY	{		hr = pti->GetTypeAttr(&pattr) ;		if FAILED(hr)		{			strError.Format(_T("ITypeInfo::GetTypeAttr() failed: %x"), hr);			AfxThrowMemoryException() ;		}		BSTR  rgbstrNames[MAX_NAMES] ;		int   cNames ;		//		// Enumerate through all FUNCDESCS		for ( int iIndex = 0 ; iIndex < pattr->cFuncs ; iIndex++)		{			hr = pti->GetFuncDesc( iIndex, &pfuncdesc ) ;			if (FAILED(hr))			{				strError.Format(_T("GetVarDesc failed for function #%u"), iIndex) ;				AfxThrowMemoryException() ;			}			//int cParams = pfuncdesc->cParams ;			//int cParamsOpt = abs(pfuncdesc->cParamsOpt) ;			// Get the names of the function and it's parameters into rgbstrNames.			// cNames gets the number of parameters + 1.			//

⌨️ 快捷键说明

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