📄 ztreecontrol.cpp
字号:
zTreeNode * zTreeControl::GetCurrent()
{
if (!m_pNode || !m_pNode->hNode)
return NULL;
else
return m_pNode;
}
zTreeNode * zTreeControl::GetNodeParam(HTREEITEM hti)
{
TVITEM ti;
TCHAR str[200]={0};
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
if (pNode)
{
return pNode;
}else
return NULL;
}
void zTreeControl::MoveFirst()
{
//检查当前项有没有子项,如果有子项,暂不支持.
HTREEITEM hti = TreeView_GetChild(m_hCtrl,m_pNode->hNode);
if (hti) return;
zTreeNode * pNode = m_pNode;
Delete();
AddSibling(pNode,TVI_FIRST);
AddParentNum(pNode);
SetCurrent(pNode);
}
void zTreeControl::MovePrev()
{
//检查当前项有没有子项,如果有子项,暂不支持.
HTREEITEM hti = TreeView_GetChild(m_hCtrl,m_pNode->hNode);
if (hti) return;
//如果当前项没有兄项,返回
hti = TreeView_GetPrevSibling(m_hCtrl,m_pNode->hNode);
if (!hti) return;
//要插入到兄项的兄项的后面,即是兄项的前面,如果没有兄兄项,则插入到兄项的前面,即第一项.
HTREEITEM hti2 = TreeView_GetPrevSibling(m_hCtrl,hti);
if (!hti2) hti2=TVI_FIRST;
//获取zTreeNode
zTreeNode * pNode = m_pNode;
//删除本项.
Delete();
//插入兄弟项
AddSibling(pNode,hti2);
AddParentNum(pNode);
SetCurrent(pNode);
}
void zTreeControl::MoveNext()
{
//检查当前项有没有子项,如果有子项,暂不支持.
HTREEITEM hti = TreeView_GetChild(m_hCtrl,m_pNode->hNode);
if (hti) return;
//如果当前项没有弟项,返回
hti = TreeView_GetNextSibling(m_hCtrl,m_pNode->hNode);
if (!hti) return;
//获取zTreeNode
zTreeNode * pNode = m_pNode;
//删除本项.
Delete();
//插入兄弟项
AddSibling(pNode,hti);
AddParentNum(pNode);
SetCurrent(pNode);
}
void zTreeControl::MoveLast()
{
//检查当前项有没有子项,如果有子项,暂不支持.
HTREEITEM hti = TreeView_GetChild(m_hCtrl,m_pNode->hNode);
if (hti) return;
//获取zTreeNode
zTreeNode * pNode = m_pNode;
Delete();
AddSibling(pNode,TVI_LAST);
AddParentNum(pNode);
SetCurrent(pNode);
}
void zTreeControl::MoveUp()
{
}
void zTreeControl::MoveDown()
{
}
void zTreeControl::ExpandRoot()
{
HTREEITEM hti = TreeView_GetRoot(m_hCtrl);
if (hti)
{
TreeView_Expand(m_hCtrl,hti,TVE_EXPAND);
}
}
int zTreeControl::GotoRoot()
{
HTREEITEM hti = TreeView_GetRoot(m_hCtrl);
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
return SetCurrent(pNode);
}
int zTreeControl::GotoChild()
{
HTREEITEM hti = TreeView_GetChild(m_hCtrl,m_pNode->hNode);
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
return SetCurrent(pNode);
}
int zTreeControl::GotoPrevSibling()
{
HTREEITEM hti = TreeView_GetPrevSibling(m_hCtrl,m_pNode->hNode);
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
return SetCurrent(pNode);
}
int zTreeControl::GotoNextSibling()
{
HTREEITEM hti = TreeView_GetNextSibling(m_hCtrl,m_pNode->hNode);
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
return SetCurrent(pNode);
}
int zTreeControl::GotoParent()
{
HTREEITEM hti = TreeView_GetParent(m_hCtrl,m_pNode->hNode);
TVITEM ti;
memset(&ti,0,sizeof(TVITEM));
zTreeNode * pNode = NULL;
if (hti)
{
ti.mask = TVIF_PARAM | TVIF_HANDLE;
ti.hItem = hti;
TreeView_GetItem(m_hCtrl,&ti);
pNode = (zTreeNode*) ti.lParam;
}
return SetCurrent(pNode);
}
int zTreeControl::Foreach(zTreeNode * pCurrent,int nWorkType)
{
zTreeNode * pNode = NULL;
if (pCurrent)
pNode = pCurrent;
else
pNode = GetCurrent();
if (pNode)
{
bl(pNode->hNode,nWorkType);
}
return 0;
}
void zTreeControl::bl(HTREEITEM hti,int nWorkType)
{
//操作,遍历选择项.
while(hti)
{
zTreeNode * pNode = this->GetNodeParam(hti);
deal(pNode,nWorkType);
HTREEITEM hClient = TreeView_GetChild(m_hCtrl,hti);
if (hClient) //有子项
{
bl(hClient,nWorkType);
}
hti = TreeView_GetNextSibling(m_hCtrl,hti);
}
}
void zTreeControl::deal(zTreeNode * pNode,int nWorkType)
{
this->FlushText(pNode);
}
int zTreeControl::OnPopupMenu(POINT point)
{
if (m_nMenuId<=0) return 0;
// TCHAR sz[300]={0};
HMENU hMenu;
HMENU hMenuTrackPopup;
hMenu = LoadMenu (m_hInst, MAKEINTRESOURCE(m_nMenuId));
if (NULL != hMenu)
{
hMenuTrackPopup = GetSubMenu(hMenu, 0);
POINT pt;
TVHITTESTINFO tti;
GetCursorPos(&pt);
tti.pt = pt;
ScreenToClient(m_hCtrl,&tti.pt);
HTREEITEM hi = TreeView_HitTest(m_hCtrl,&tti);
if(hi && (tti.flags && TVHT_ONITEM))
{
//在项上面弹出菜单
TreeView_SelectItem(m_hCtrl,hi);
HWND hParent = ::GetParent(m_hCtrl);
TrackPopupMenu(hMenuTrackPopup, TPM_LEFTALIGN|TPM_TOPALIGN, pt.x, pt.y, 0, hParent, NULL);
DestroyMenu(hMenu);
}else
{
//不在项上面弹出菜单
}
}else return 0;
return 1;
}
void zTreeControl::FlushDiskTree(TCHAR * pPath)
{
zTreeNode * pNode = new zTreeNode();
_tcscpy(pNode->sPath,pPath);
_tcscpy(pNode->sName,_T("\\"));
pNode->nState = 1;
AddRoot(pNode);
// blDiskTree(path);
}
int zTreeControl::OnDispInfo(LPNMHDR lParam)
{
//示范代码
TV_DISPINFO *pLvdi = (TV_DISPINFO *)lParam;
TV_ITEM *pItem = &pLvdi->item;
zTreeNode *pNode = (zTreeNode *)(pItem->lParam);
static TCHAR szText[100];
TCHAR szTmp[1000]={0};
if (pItem->mask & TVIF_TEXT)
{
//文本设定
wsprintf(szText,_T("%s"),pNode->sName);
// if(m_flags.bShowChildNumber || m_flags.bShowItemProperties)
// {
// _tcscat(szText,_T("("));
// if(m_flags.bShowChildNumber)
// {
// wsprintf(szTmp,_T("%d"),pNode->nChild);
// _tcscat(szText,szTmp);
// }
// if(m_flags.bShowItemProperties)
// {
// wsprintf(szTmp,_T(".%d"),pNode->m_Properties.GetSize());
// _tcscat(szText,szTmp);
// }
// _tcscat(szText,_T(")"));
// }
_tcsncpy(pItem->pszText,szText,pItem->cchTextMax);
}
if (pItem->mask & TVIF_IMAGE)
{
//图标设定
if (pNode->nState==1)
pItem->iImage = 5;
else
pItem->iImage = 12;
}
if (pItem->mask & TVIF_SELECTEDIMAGE)
{
//选择图标设定
if (pNode->nState==1)
pItem->iSelectedImage = 6;
else
pItem->iSelectedImage = 12;
}
//wsprintf(szTmp,_T("%s,%d,"),pNode->sName,pItem->state);
//if (pItem->state & TVIS_BOLD) _tcscat(szTmp,_T("TVIS_BOLD "));
//if (pItem->state & TVIS_CUT ) _tcscat(szTmp,_T("TVIS_CUT "));
//if (pItem->state & TVIS_DROPHILITED) _tcscat(szTmp,_T("TVIS_DROPHILITED "));
//if (pItem->state & TVIS_EXPANDED ) _tcscat(szTmp,_T("TVIS_EXPANDED "));
//if (pItem->state & TVIS_EXPANDEDONCE ) _tcscat(szTmp,_T("TVIS_EXPANDEDONCE "));
//if (pItem->state & TVIS_EXPANDPARTIAL) _tcscat(szTmp,_T("TVIS_EXPANDPARTIAL "));
//if (pItem->state & TVIS_SELECTED ) _tcscat(szTmp,_T("TVIS_SELECTED "));
//if (pItem->state & TVIS_OVERLAYMASK ) _tcscat(szTmp,_T("TVIS_OVERLAYMASK "));
//if (pItem->state & TVIS_STATEIMAGEMASK)_tcscat(szTmp,_T("TVIS_STATEIMAGEMASK "));
//if (pItem->state & TVIS_USERMASK ) _tcscat(szTmp,_T("TVIS_USERMASK "));
//_tcscat(szTmp,_T("\n"));
//::OutputDebugString(szTmp);
return 0;
}
void zTreeControl::OnDblclk(zTreeNode * pNode)
{
// TCHAR szbufW[MAX_PATH]={0};
// _tcscpy(szbufW,pNode->sName);
// if (_tcsncicmp(szbufW, _T("exe."),4) != 0) return;
// _tcscpy(szbufW,pNode->sPath);
// _tcscat(szbufW,_T("\\"));
// _tcscat(szbufW,pNode->sName);
// CreateProcess(szbufW, NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
}
void zTreeControl::OnClick(zTreeNode * pNode)
{
TCHAR sz[300]={0};
if(pNode->nState==1)
{
wsprintf(sz,_T("Directory! %s\n"),pNode->sName);
if(!pNode->bShow)
{
blDiskTree(pNode->sPath);
pNode->bShow = TRUE;
}
}else if(pNode->nState==0)
{
wsprintf(sz,_T("File! %s\n"),pNode->sName);
}
::OutputDebugString(sz);
}
//BOOL SortByName(zTreeControl::zTreeNode * p1,zTreeControl::zTreeNode * p2)
//{
// if(p1->nState>p2->nState) return TRUE;
// else return _tcscmp(p1->sName,p2->sName);
//}
void zTreeControl::blDiskTree(TCHAR * pPath)
{
//操作,遍历选择项.
TCHAR sz[MAX_PATH]={0};
TCHAR pa[MAX_PATH]={0};
TCHAR pn[MAX_PATH]={0};
_tcscpy(pa,pPath);
_tcscpy(pn,pPath);
_tcscat(pn,_T("\\*.*"));
zFileFind ff;
ff.FindFirstFile(pn);
if (ff.m_hFind!=INVALID_HANDLE_VALUE)
{
// vector<zTreeNode *> vNode;
// vNode.clear();
do{
_tcscpy(sz,ff.m_find.cFileName);
if(ff.m_find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
zTreeNode * pNode = new zTreeNode();
_tcscpy(pNode->sPath,pa); _tcscat(pNode->sPath,_T("\\")); _tcscat(pNode->sPath,sz);
_tcscpy(pNode->sName,sz);
pNode->nState = 1; //Directory
// vNode.push_back(pNode);
AddChild(pNode);
// }else
// {
// pNode->nState = 0; //file
// AddChild(pNode);
// vNode.push_back(pNode);
// delete pNode;
}
}while(ff.FindNextFile());
// int num = (int)vNode.size();
// if(num>0) sort(vNode.begin(),vNode.end(),SortByName);
// for(int i=0;i<num;i++)
// {
// AddChild(vNode[i]);
// }
// vNode.clear();
}
ff.FindClose();
}
/*
_tcscpy(sz,ff.m_find.cFileName);
zTreeNode * pNode = new zTreeNode();
_tcscpy(pNode->sPath,pa); _tcscat(pNode->sPath,_T("\\")); _tcscat(pNode->sPath,sz);
_tcscpy(pNode->sName,sz);
if(ff.m_find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
pNode->nState = 1; //Directory
AddChild(pNode);
}else
{
pNode->nState = 0; //file
AddChild(pNode);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -