//#pragma once #ifndef IMPORTXMLTREECTRL_ZZG_2009_01_22 #define IMPORTXMLTREECTRL_ZZG_2009_01_22 #include "afxcmn.h" #include "afxwin.h" #include "resource.h" #include #include #include "XMLDomNode.h" #include "XMLDomNodes.h" #include "XMLDomFile.h" // CImportXMLDocDlg 对话框 typedef Array NodeInfoAry; class CImportXMLTreeCtrl : public CTreeCtrl { public: CImportXMLTreeCtrl(); CImportXMLTreeCtrl(CXMLDOMFile*pXMLDoc); //插入新节点及扩展数据 HTREEITEM InsertItemEx(CXMLNodeInfoEx *pNodeInfo, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST); //删除新节点及扩展数据 void DeleteItemEx(HTREEITEM hItem); //设置xml文档指针 void SetXMLDoc(CXMLDOMFile*pXMLDoc); //设置当前页面的名字 void SetCurPageName(const CString& strName); //删除所有节点扩展数据 void DeleteAllItemData(HTREEITEM hItem = TVI_ROOT); //初始化树 void InitTree(); //设置节点状态 仅对有checkbox的treectrl起作用 BOOL SetItemState( HTREEITEM hItem, UINT nState, UINT nStateMask, BOOL bSearch=TRUE); //把所有被选择的tree节点凡是名字为“选项”的节点扩展数据存入tree的 一个map成员变量中 void GetCheckedItemData(HTREEITEM hItem); //把扩展数据中的路径信息改成字符串数组 根据“/”分割 void GetListCtrlIndex(const CXMLNodeInfoEx &data,CStringArray &arystr); //展开指定节点(暂时没写函数体)代码在inittree()的最后 void ExpandItem(HTREEITEM hItem);//展开指定节点 protected: afx_msg void OnDestroy(){GetCheckedItemData(GetRootItem());DeleteAllItemData();CTreeCtrl::OnDestroy();}//ok afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnStateIconClick(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); DECLARE_MESSAGE_MAP() //广度遍历tree形成界面tree void BreadthXmlNodeToTreeNode(const CXMLDOMNodePtr &pXmlNode); //是否有子节点 BOOL IsHasChildNodes(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); //得到xml节点tag名字 CString GetXMLNodeName(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); //得到xml节点属性名字 CString GetXMLNodeAttributeName(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr,int nIndex=0); //得到xml节点属性值 CString GetXMLNodeAttributeValue(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr,const CString strNodeAttriName); //得到xml节点值(仅对叶子节点) CString GetXMLNodeValue(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); //得到当前xml节点属性数量 long GetXMLNodeAttriNum(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); public: std::map m_mapData;//对应对话框的数据 private: CXMLDOMFile* m_pXMLDoc;//xml文档指针 CImageList m_imageList;//图标(目录 和选项) CImageList m_imageState;//状态图标仅对有checkbox起作用 UINT m_uFlags;//状态风格(对有checkbox起作用) HTREEITEM m_hItem;// 当前页面对应的树节点 CString m_strPageName;//对应的对话框页面的名字 根据此名字 直接购选此名字对应的tree节点 //遍历兄弟及父节点设置节点状态 void TravelSiblingAndParent(HTREEITEM hItem, int nState); //遍历子节点设置节点状态 void TravelChild(HTREEITEM hItem,int nState); //得到xml指针指向的节点信息 CXMLNodeInfoEx GetNodeInfoEx(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr);//得到xml节点的信息(包含多属性) }; class CImportXMLDocDlg : public CModelessDialog { DECLARE_DYNAMIC(CImportXMLDocDlg) public: CImportXMLDocDlg(CWnd* pParent = NULL); // 标准构造函数 CImportXMLDocDlg(CXMLDOMFile *pXMLDoc,CString strPageName,int nFlag = 0,CWnd* pParent = NULL); // 标准构造函数 virtual ~CImportXMLDocDlg(); // 对话框数据 enum { IDD = IDD_IMPORTDLG }; public: void InitTree();//初始化树 CXMLNodeInfo GetCurXmlNodeInfo(){return m_selNodeInfo;}//返回 选中树节点的信息 protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() public: CImportXMLTreeCtrl m_treeXmlDoc;//xml界面tree //CListBox m_listProperty;//属性列表 CString m_strFilePath;//xml文档路径 private: CXMLDOMFile *m_pXMLDoc;//xml文档指针 CXMLNodeInfo m_selNodeInfo;//树上选中节点的信息 afx_msg void OnTvnSelchangedImportxmldoctree(NMHDR *pNMHDR, LRESULT *pResult); CString m_strPageName;//当前属性页的名字 根据此名字 直接购选此名字对应的tree节点 int m_nFlag;// 对话框风格 }; #endif