📄 hnettree.h
字号:
#if !defined(AFX_HNETTREE_H__D3432B01_C855_4C5C_A2C4_65B204C1D45B__INCLUDED_)
#define AFX_HNETTREE_H__D3432B01_C855_4C5C_A2C4_65B204C1D45B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// HNetTree.h : header file
//
#include "HPublic.h"
#define UM_CLK_TREE_ITEM WM_USER+9001
#define UM_ENUM_NET WM_USER+9002
class CHTLVItem{
public:
CHTLVItem(){};
//复制已存在对象,生成新对象
CHTLVItem(CHTLVItem &other){
*this=other;
}
//由父亲节点生成子节点
CHTLVItem(CHTLVItem *parent){
strIndex="";
nLen=0;
bufVal=NULL;
type=parent->bufVal[0];
if((parent->bufVal[1]&0x80)==0){
nLen=parent->bufVal[1];
bufVal=parent->bufVal+2;
nOffset=2;
}else{
int nLenLen=parent->bufVal[1]&0x7f;
BYTE *pLen=(BYTE*)&nLen;
for(int i=0;i<nLenLen;i++)
memcpy(pLen+i,parent->bufVal+2+nLenLen-1-i,1);
bufVal=parent->bufVal+2+nLenLen;
nOffset=2+nLenLen;
}
}
virtual ~CHTLVItem(){};
BOOL Create(BYTE *buf,int nLenBuf){
strIndex="";
nLen=0;
bufVal=NULL;
type=buf[0];
if((buf[1]&0x80)==0){
nLen=buf[1];
bufVal=buf+2;
nOffset=2;
if((nLen+2)>nLenBuf)return FALSE;//子节点数据块越限,此节点为假节点。这种情况是可能
}else{
int nLenLen=buf[1]&0x7f;
if((nLenLen>(nLenBuf-1)) || (nLenLen>4)){
return FALSE;//四个字节的长度值最大可达2^32=4G,足够用了,超过四个字节,定是出错了
}
BYTE *pLen=(BYTE*)&nLen;
for(int i=0;i<nLenLen;i++)
memcpy(pLen+i,buf+2+nLenLen-1-i,1);
bufVal=buf+2+nLenLen;
nOffset=2+nLenLen;
if((nLen+2+nLenLen)>nLenBuf)return FALSE;//子节点数据块越限,此节点为假节点。这种情况是可能
}
return TRUE;
}
CHTLVItem& operator=(CHTLVItem& other){
strIndex=other.strIndex;
type=other.type;
nLen=other.nLen;
bufVal=other.bufVal;
nOffset=other.nOffset;
return *this;
}
public:
CString strIndex; //此字符串的个位表示此节点是其父亲的第几个孩子,
//十位表示其父亲是其爷爷的第几个孩子...
//每一位的值为:0-15(0-0xf)。
//因此,在此种定义下每个节点的孩子不能超过16个,否则出错
int nLen;
int nOffset;
BYTE type;
BYTE* bufVal;
};
/////////////////////////////////////////////////////////////////////////////
// CHNetTree window
#define ITEM_DATA_ROOT 0
#define ITEM_DATA_CARD 1
#define ITEM_DATA_DOMAIN 2
#define ITEM_DATA_ATV_HOST 3
class AFX_EXT_CLASS CTreeItemSelChangedParm
{
public:
CTreeItemSelChangedParm(){
m_nID=-1;
m_strPath="";
m_bFromTree=TRUE;
m_hItem=NULL;
};
CTreeItemSelChangedParm(CTreeItemSelChangedParm& other){
(*this)=other;
};
CTreeItemSelChangedParm(HTREEITEM hItem,UINT nID,CString strPath,BOOL bFromTree=TRUE){
m_nID=nID;
m_strPath=strPath;
m_bFromTree=bFromTree;
m_hItem=hItem;
}
~CTreeItemSelChangedParm(){};
CTreeItemSelChangedParm& operator=(CTreeItemSelChangedParm& other){
m_nID=other.m_nID;
m_strPath=other.m_strPath;
m_bFromTree=other.m_bFromTree;
m_hItem=other.m_hItem;
return other;
}
UINT m_nID;
BOOL m_bFromTree;
HTREEITEM m_hItem;
CString m_strPath;
};
class CHNetTree : public CTreeCtrl,public CHPublic
{
// Construction
public:
CHNetTree();
// Attributes
public:
// Operations
public:
HTREEITEM GetChildItemByText(HTREEITEM hParent,CString strText);
void DeleteChildrenItem(HTREEITEM hItem);
CString GetPath(HTREEITEM hItem);
void WhenTreeItemSelected(HTREEITEM hItem);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHNetTree)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CHNetTree();
// Generated message map functions
protected:
//{{AFX_MSG(CHNetTree)
afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_HNETTREE_H__D3432B01_C855_4C5C_A2C4_65B204C1D45B__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -