📄 htlvtree.h
字号:
#if !defined(AFX_HTLVTREE_H__8DDFA4B5_64EE_41EE_AD0B_B6DF2D256365__INCLUDED_)
#define AFX_HTLVTREE_H__8DDFA4B5_64EE_41EE_AD0B_B6DF2D256365__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// htlvtree.h : header file
//
#include "HPublic.h"
#define UM_CLK_TREE_ITEM WM_USER+100
/////////////////////////////////////////////////////////////////////////////
// CHTLVTree window
class AFX_EXT_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;
};
class AFX_EXT_CLASS CHTLVTree : public CTreeCtrl,public CHPublic
{
// Construction
public:
CHTLVTree();
// Attributes
public:
HTREEITEM GetChildItemByText(HTREEITEM hParent,CString strText);
HTREEITEM GetChildItemByIndex(HTREEITEM hParent,int nIndex);
protected:
CImageList m_imaLarge;
CImageList m_imaSmall;
BYTE *m_bufTLV;
int m_nLenTLV;
// Operations
public:
void SetTLV(BYTE *bufTLV,int nLenTLV);
void GenerateChildren(HTREEITEM hParent);
void GenerateTree();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHTLVTree)
public:
//}}AFX_VIRTUAL
// Implementation
public:
void EnableImg();
static CString FormatVal(CHTLVItem &hlv);
static CString FormatText(CHTLVItem &hlv);
void WhenTreeItemSelected(HTREEITEM hItem);
void SetSmallImg();
void SetLargeImg();
virtual ~CHTLVTree();
// Generated message map functions
protected:
//{{AFX_MSG(CHTLVTree)
afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int GetImg(int nType);
static CString DescribeType(int nType);
void ChangeItemText(HTREEITEM hParent);
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_HTLVTREE_H__8DDFA4B5_64EE_41EE_AD0B_B6DF2D256365__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -