📄 ztreecontrol.cpp
字号:
#include "../StdAfx.h"
#include "zTreeControl.h"
zTreeControl::zTreeControl(void)
{
//#ifdef _PPC
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_TREEVIEW_CLASSES;
InitCommonControlsEx(&icex);
//#endif
m_Version = 0.1f;
m_Tag = 0x54524545; //"TREE"
m_pNode = NULL;
m_pFile = NULL;
m_Flag.TrunFlagsShowChildNumber(FALSE);
m_Flag.TrunFlagsShowItemProperties(TRUE);
m_Flag.TrunFlagsShowImageIcon(TRUE);
m_pImageList = NULL;
m_pImageSave = NULL;
}
zTreeControl::~zTreeControl(void)
{
}
int zTreeControl::CreateEx(int ctlid,int x, int y, int nWidth, int nHeight, HWND hParent,HINSTANCE hInst)
{
DWORD dwExtStyle = 0;
TCHAR * lpszClass = WC_TREEVIEW;
TCHAR * lpszName = _T("树控件");
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL |\
TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_HASBUTTONS;
m_hCtrl = ::CreateWindowEx(dwExtStyle,lpszClass,lpszName,dwStyle,
x,y,nWidth,nHeight,hParent,(HMENU)ctlid,hInst,NULL);
return zControl::CreateEx(ctlid,x,y,nWidth,nHeight,hParent,hInst);
}
int zTreeControl::OnNotify(LPNMHDR lParam)
{
int ret = 0;
NM_TREEVIEW* pLvdi = (NM_TREEVIEW*)lParam;
POINT pt={0};
TCHAR szMsg[300]={0};
switch(pLvdi->hdr.code)
{
case 0xffffffef:
// wsprintf(szMsg,_T("Notify:MouseMove?%x\n"),pLvdi->hdr.code);
break;
case 0xfffffff9:
// wsprintf(szMsg,_T("Notify:Mouse??%x\n"),pLvdi->hdr.code);
break;
case 0xfffffffb:
// wsprintf(szMsg,_T("Notify:MouseRbuttonDown?%x\n"),pLvdi->hdr.code);
OnPopupMenu(pt);
break;
case TVN_SELCHANGED:
SetCurrent(pLvdi);
OnClick(GetCurrent());
break;
case NM_DBLCLK:
OnDblclk(GetCurrent());
break;
case 0x3e8: //菜单弹出消息
case WM_RBUTTONDOWN:
case WM_CONTEXTMENU: //0x7b
wsprintf(szMsg,_T("Notify:Tree:0x7B\n "));
// m_bMenu = 1;
break;
case NM_CUSTOMDRAW: //
OnCustomDraw((LPNMTVCUSTOMDRAW) lParam);
break;
case TVN_GETDISPINFO:
OnDispInfo(lParam);
break;
default:
break;
}
if (_tcslen(szMsg)>0) ::OutputDebugString(szMsg);
return zControl::OnNotify(lParam);
}
void zTreeControl::OnCustomDraw(LPNMTVCUSTOMDRAW lParam)
{
int a =0;
}
int zTreeControl::Save(TCHAR * pszSaveName)
{
if (m_pFile==NULL) return 0;
int total = 0;
BOOL ret = m_pFile->CreateFile(pszSaveName,_T("w"));
if (ret)
{
//写标记
m_pFile->WriteFile(&m_Tag,1,sizeof(m_Tag));
//写存储版本
m_pFile->WriteFile(&m_Version,1,sizeof(float));
//获取有多少个根项
int n = GotoRoot();
if (n!=0) n=1;
while(GotoNextSibling()) {n++;}
m_pFile->WriteFile(&n,1,sizeof(int));
//存储节点
GotoRoot();
zTreeNode * pNode = this->GetCurrent();
if (pNode)
{
total = SaveItem(pNode->hNode);
}
m_pFile->CloseFile();
}
return total;
}
int zTreeControl::SaveItem(HTREEITEM hti)
{
//操作,遍历选择项.
int ret = 0;
while(hti)
{
zTreeNode * pNode = (zTreeNode *)this->GetNodeParam(hti);
SaveNode(pNode);
ret ++;
HTREEITEM hClient = TreeView_GetChild(m_hCtrl,hti);
if (hClient) //有子项
{
SaveItem(hClient);
}
hti = TreeView_GetNextSibling(m_hCtrl,hti);
}
return ret;
}
int zTreeControl::SaveNode(zTreeNode* pNode)
{
//操作,保存节点
// m_pFile->WriteFile(&pNode->nChild,1,sizeof(int)); //写子项数
// m_pFile->WriteFile(&pNode->nState,1,sizeof(long)); //写节点状态
// m_pFile->WriteFile(pNode->sName,1,sizeof(pNode->sName));//写节点名字
//写属性 (写属性由属性自己写)
// size_t na = pNode->m_Properties.GetSize(); //属性数
// m_pFile->WriteFile(&na,1,sizeof(size_t));
// for (unsigned int i=0;i<na;i++) //各个属性
// {
// int nType = pNode->m_Properties.GetType(i);
// TCHAR * pTitle = pNode->m_Properties.GetTitle(i);
// TCHAR * pName = pNode->m_Properties.GetName(i);
// long lParam = pNode->m_Properties.GetParam(i);
// zTreeProperties::ITEMPROPERTIES it;
// m_pFile->WriteFile(&nType,1,sizeof(it.nType));
// m_pFile->WriteFile(pTitle,1,sizeof(it.szTitle));
// m_pFile->WriteFile(pName,1,sizeof(it.szName));
// m_pFile->WriteFile(&lParam,1,sizeof(it.nParam));
// }
return 1;
}
int zTreeControl::Load(TCHAR * pszLoadName)
{
if (m_pFile==NULL) return 0;
int total = 0;
this->Reset();
BOOL ret =m_pFile->CreateFile(pszLoadName,_T("r"));
if (ret)
{
//读取标记
DWORD tag;
m_pFile->ReadFile(&tag,1,sizeof(DWORD));
if(tag!=m_Tag)
{
::MessageBox(m_hCtrl,_T("不是本类型文件!"),_T("错误"),MB_OK|MB_ICONQUESTION);
m_pFile->CloseFile();
return 0;
}
//读取版本
float version;
m_pFile->ReadFile(&version,1,sizeof(float));
if(version!=m_Version)
{
::MessageBox(m_hCtrl,_T("存储文件版本和本程序版本不一致!"),_T("错误"),MB_OK|MB_ICONQUESTION);
m_pFile->CloseFile();
return 0;
}
//读取根项
int nRoot = 0;
m_pFile->ReadFile(&nRoot,1,sizeof(int));
for (int i=0;i<nRoot;i++)
{
zTreeNode * pNode = new zTreeNode();
LoadNode(pNode);
AddRoot(pNode);
LoadItem(pNode);
}
this->GotoRoot();
m_pFile->CloseFile();
}
return total;
}
int zTreeControl::LoadItem(zTreeNode * pNode)
{
//操作,遍历选择项.
int ret = 0;
for (int i=0;i<pNode->nChild;i++)
{
m_pNode = pNode;
zTreeNode * pRNode = new zTreeNode();
LoadNode(pRNode);
AddChild(pRNode);
if (pRNode->nChild>0)
{
LoadItem(pRNode);
}
}
return ret;
}
int zTreeControl::LoadNode(zTreeNode * pNode)
{
//读取节点
// m_pFile->ReadFile(&pNode->nChild,1,sizeof(int));
// m_pFile->ReadFile(&pNode->nState,1,sizeof(long));
// m_pFile->ReadFile(pNode->sName,1,sizeof(pNode->sName));
//读取属性项.(读属性由属性自己读)
int np = 0;
// m_pFile->ReadFile(&np,1,sizeof(size_t));
// for (int i=0;i<np;i++)
// {
// zTreeNode::ITEMPROPERTIES it;
// m_pFile->ReadFile(&it.nType,1,sizeof(it.nType));
// m_pFile->ReadFile(it.szTitle,1,sizeof(it.szTitle));
// m_pFile->ReadFile(it.szName,1,sizeof(it.szName));
// m_pFile->ReadFile(&it.nParam,1,sizeof(it.nParam));
//
// pNode->AddProperties(it.nType,it.szTitle,it.szName,it.nParam);
// }
return np;
}
int zTreeControl::Reset()
{
if (!m_hCtrl) return 0;
return TreeView_DeleteAllItems(m_hCtrl);
}
int zTreeControl::Delete()
{
if (!m_pNode) return 0;
//当前项设置为其下一项,如果没有下一项设置为上一项,如果都没有设置空.
HTREEITEM hti = TreeView_GetNextSibling(m_hCtrl,m_pNode->hNode);
if (!hti) hti = TreeView_GetPrevSibling(m_hCtrl,m_pNode->hNode);
//删除当前项
DeleteParentNum(m_pNode);
TreeView_DeleteItem(m_hCtrl,m_pNode->hNode);
//设置新选择
TVITEM ti;
TCHAR str[200]={0};
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
ti.pszText = str;
ti.cchTextMax = 200;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
return SetCurrent(pNode);
}
int zTreeControl::AddRoot(zTreeNode * pNode)
{
TVINSERTSTRUCT tvi;
memset(&tvi,0,sizeof(TVINSERTSTRUCT));
tvi.hParent = TVI_ROOT; //or HTREEITEM
tvi.hInsertAfter = TVI_LAST; //or TVI_FIRST / TVI_SORT
tvi.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.item.pszText = LPSTR_TEXTCALLBACK; //
tvi.item.lParam = (LPARAM)pNode;
tvi.item.iImage = I_IMAGECALLBACK; // item image: defer to OnGetDispInfo ()
tvi.item.iSelectedImage = I_IMAGECALLBACK; // item selimage: defer to OnGetDispInfo ()
pNode->hNode = TreeView_InsertItem(m_hCtrl,&tvi);
m_pNode = pNode; //添加根项,当前项改变.
return TreeView_SelectItem(m_hCtrl,m_pNode->hNode);
}
int zTreeControl::AddChild(zTreeNode * pNode ,HTREEITEM flag)
{
TVINSERTSTRUCT tvi;
memset(&tvi,0,sizeof(TVINSERTSTRUCT));
if (!m_pNode|| !m_pNode->hNode)
{
tvi.hParent = TVI_ROOT; //or HTREEITEM
}else
{
tvi.hParent = m_pNode->hNode; //or HTREEITEM
}
tvi.hInsertAfter = flag; //or TVI_FIRST / TVI_SORT
tvi.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.item.iImage = I_IMAGECALLBACK; // item image: defer to OnGetDispInfo ()
tvi.item.iSelectedImage = I_IMAGECALLBACK; // item selimage: defer to OnGetDispInfo ()
tvi.item.pszText = LPSTR_TEXTCALLBACK;
tvi.item.lParam = (LPARAM)pNode;
pNode->hNode = TreeView_InsertItem(m_hCtrl,&tvi);
return (UINT)pNode;
}
int zTreeControl::AddSibling(zTreeNode * pNode,HTREEITEM flag)
{
TVINSERTSTRUCT tvi;
memset(&tvi,0,sizeof(TVINSERTSTRUCT));
if (!m_pNode || !m_pNode->hNode)
{
tvi.hParent = TVI_ROOT; //or HTREEITEM
}else
{
tvi.hParent = TreeView_GetParent(m_hCtrl,m_pNode->hNode);
}
tvi.hInsertAfter = flag; //or TVI_FIRST / TVI_SORT
tvi.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.item.iImage = I_IMAGECALLBACK; // item image: defer to OnGetDispInfo ()
tvi.item.iSelectedImage = I_IMAGECALLBACK; // item selimage: defer to OnGetDispInfo ()
tvi.item.pszText = LPSTR_TEXTCALLBACK;
tvi.item.lParam = (LPARAM)pNode;
pNode->hNode = TreeView_InsertItem(m_hCtrl,&tvi);
m_pNode = pNode; //添加兄弟项,当前项改.
return TreeView_SelectItem(m_hCtrl,m_pNode->hNode);
}
int zTreeControl::AddParentNum(zTreeNode * pNode)
{
if ((pNode==NULL)||(pNode->hNode==NULL))
return 0;
HTREEITEM hti = NULL;
hti = TreeView_GetParent(m_hCtrl,pNode->hNode);
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
zTreeNode * pPNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pPNode = (zTreeNode*) ti.lParam;
pPNode->nChild++;
}
return FlushText(pPNode);
}
int zTreeControl::DeleteParentNum(zTreeNode * pNode)
{
if ((pNode==NULL)||(pNode->hNode==NULL))
return 0;
HTREEITEM hti = NULL;
hti = TreeView_GetParent(m_hCtrl,pNode->hNode);
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
zTreeNode * pPNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pPNode = (zTreeNode*) ti.lParam;
pPNode->nChild--;
}
return FlushText(pPNode);
}
int zTreeControl::FlushText(zTreeNode * pNode)
{
if (pNode==NULL || pNode->hNode==NULL) return 0;
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
ti.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
ti.iImage = I_IMAGECALLBACK; // item image: defer to OnGetDispInfo ()
ti.iSelectedImage = I_IMAGECALLBACK; // item selimage: defer to OnGetDispInfo ()
ti.pszText = LPSTR_TEXTCALLBACK;
ti.hItem = pNode->hNode;
return TreeView_SetItem(m_hCtrl,&ti);
}
int zTreeControl::SetCurrent(NM_TREEVIEW* pLvdi)
{
HTREEITEM hti;
hti = TreeView_GetSelection(m_hCtrl);
TVITEM ti;
TCHAR str[200]={0};
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
ti.pszText = str;
ti.cchTextMax = 200;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
return SetCurrent(pNode);
}
int zTreeControl::SetCurrent(zTreeNode * pNode)
{
if (pNode)
{
m_pNode = pNode;
return TreeView_SelectItem(m_hCtrl,m_pNode->hNode);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -