📄 treeview2.cpp
字号:
///////////////////////////////////////////////////////////////
//TreeView.cpp
//僼僅儖僟堦棗傪昞帵
///////////////////////////////////////////////////////////////
#include "GSFinder.h"
#include "TreeView2.h"
///////////////////////////////////////////////////////////////
#define ID_TREEVIEW 1
//ADD START TODA
WNDPROC Org_TreeViewProc = NULL;
///////////////////////////////////////////////////////////////
LRESULT CALLBACK TreeViewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
//僉乕墴壓
case WM_KEYDOWN:
//HOME僉乕墴壓
if(wParam == VK_HOME)
{
g_MainWnd.m_ListView.OnGoBack();
return 0;
}
//END僉乕墴壓
if(wParam == VK_END)
{
g_MainWnd.m_ListView.OnGoFront();
return 0;
}
break;
//僞僢僾奐巒帪
case WM_LBUTTONDOWN:
g_MainWnd.m_TreeView.OnTapHoldBegin((DWORD)lParam);
break;
#ifndef __POCKET_PC
//僞僢僾廔椆帪
case WM_LBUTTONUP:
g_MainWnd.m_TreeView.OnTapHoldCancel();
break;
#endif
//僞僢僾&儂乕儖僪帪(僞僀儉傾僂僩帪)
case WM_TIMER:
if(wParam == ID_TIMER_MENUCANCEL)
{
//g_MainWnd.m_TreeView.OnSelectMenuLoop();
//g_MainWnd.m_TreeView.OnSelectMenuLoop();
}
else if(wParam == ID_TIMER_TAPHOLD)
g_MainWnd.m_TreeView.OnTapHoldEnter();
break;
//偦傟埲奜
default:
break;
}
return CallWindowProc((WNDPROC)Org_TreeViewProc, hWnd, message, wParam, lParam);
}
//ADD END
///////////////////////////////////////////////////////////////
CTreeView::CTreeView()
{
m_hImageList = NULL;
m_bEditing = FALSE;
m_hRootItem = NULL;
m_bLoadReq = TRUE;
m_bTimer = FALSE;
m_bTaping = FALSE; //ADD TODA
m_bHolding = FALSE; //ADD TODA
}
///////////////////////////////////////////////////////////////
CTreeView::~CTreeView()
{
}
///////////////////////////////////////////////////////////////
void CTreeView::Init(HWND hwndParent)
{
DWORD dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | TVS_EDITLABELS |
TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS;
DWORD dwExStyle = WS_EX_CLIENTEDGE;
#ifdef __POCKET_PC //ADD START TODA (from Y.Nagamidori)
dwStyle |= WS_BORDER;
dwExStyle = 0;
#endif //ADD END
m_hWnd = CreateWindowEx(dwExStyle,
WC_TREEVIEW,
NULL, dwStyle, 0, 0, 0, 0,
hwndParent, (HMENU)ID_TREEVIEW,
g_hInst, NULL);
//ADD START TODA (僞僢僾&儂乕儖僪梡)
Org_TreeViewProc = (WNDPROC)GetWindowLong(m_hWnd, GWL_WNDPROC);
SetWindowLong(m_hWnd, GWL_WNDPROC, (DWORD)TreeViewProc);
//ADD END
InitImageList();
LoadFolderTree(); //MOD TODA (僐儊儞僩偺夝彍)
//DEL START TODA (張棟堦杮壔偺堊)
// TreeView_DeleteAllItems(m_hWnd);
//
// TVINSERTSTRUCT tvis;
// tvis.hParent = NULL;
// tvis.hInsertAfter = TVI_SORT;
// tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
// tvis.item.pszText = (LPTSTR)GetRootName();
// tvis.item.iImage = 0;
// tvis.item.iSelectedImage = 0;
// tvis.item.cChildren = 1;
// HTREEITEM hRoot = TreeView_InsertItem(m_hWnd, &tvis);
// m_hRootItem = hRoot;
// TreeView_Expand(m_hWnd, hRoot, TVE_EXPAND);
//DEL END
}
///////////////////////////////////////////////////////////////
void CTreeView::Destroy()
{
ImageList_Destroy(m_hImageList);
DestroyWindow(m_hWnd);
}
//ADD START TODA
///////////////////////////////////////////////////////////////
void CTreeView::TreeExpand(HWND hTree, HTREEITEM hItem, BOOL bDelete)
{
if(bDelete)
{
//僣儕乕偺巕僲乕僪傪慡偰嶍彍
HTREEITEM hChild = TreeView_GetChild(hTree, hItem);
while(hChild) {
HTREEITEM hNext = TreeView_GetNextItem(hTree, hChild, TVGN_NEXT);
TreeView_DeleteItem(hTree, hChild);
hChild = hNext;
}
}
//巕僲乕僪偺嵞庢摼
TCHAR szKey[MAX_PATH];
//1.僼僅儖僟柤傪庢摼
GetTree(hItem, szKey);
//2.巕僣儕乕傪楍嫇偡傞
EnumChildren(hItem, szKey);
}
//ADD END
///////////////////////////////////////////////////////////////
void CTreeView::LoadChildFolder(HTREEITEM hParent, LPCTSTR szPath)
{
WIN32_FIND_DATA finddata;
TCHAR szTemp[MAX_PATH];
HTREEITEM hTreeItem;
wsprintf(szTemp, _T("%s\\*.*"), szPath);
HANDLE hFind = FindFirstFile(szTemp, &finddata);
if (hFind != INVALID_HANDLE_VALUE)
{
BOOL bRet = TRUE;
do
{
if (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
TVINSERTSTRUCT tvis;
tvis.hParent = hParent;
tvis.hInsertAfter = TVI_SORT;
tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvis.item.pszText = finddata.cFileName;
tvis.item.iImage = 1;
tvis.item.iSelectedImage = 1;
hTreeItem = TreeView_InsertItem(m_hWnd, &tvis);
wsprintf(szTemp, _T("%s\\%s"), szPath, finddata.cFileName);
LoadChildFolder(hTreeItem, szTemp);
}
}
while (FindNextFile(hFind, &finddata));
FindClose(hFind);
}
TreeView_SortChildren(m_hWnd, hParent, 0);
}
///////////////////////////////////////////////////////////////
//MOD TODA (僷儔儊乕僞捛壛)
void CTreeView::SetCurrentFolder(LPCTSTR lpszPath, BOOL bUpdate, BOOL bSelect)
{
//DEL START TODA (旕昞帵偵偟側偄曽偑憗偄?亄偪傜偮偒杊巭)
// //僣儕乕價儏乕傪旕昞帵
// HWND hwndPrev = GetFocus();
// ShowWindow(m_hWnd, SW_HIDE);
//DEL END
m_bLoadReq = FALSE;
//専嶕僨傿儗僋僩儕巜掕偺応崌
if(0 == wcscmp(SEARCH_FOLDER_NAME, lpszPath))
{
//儖乕僩傪揥奐
TreeView_Expand(m_hWnd, m_hRootItem, TVE_EXPAND);
//傾僀僥儉慖戰
TreeView_SelectItem(m_hWnd, m_hSearchItem);
m_bLoadReq = TRUE;
return;
}
KillTimer(NULL, ID_TIMER_TVSELECTED);
LPCTSTR lpszStart = wcschr(lpszPath, _T('\\'));
//専嶕奐巒僲乕僪傪儖乕僩偵愝掕
HTREEITEM hSelectItem = m_hRootItem;
HTREEITEM hParent = m_hRootItem;
//儖乕僩傪揥奐
TreeView_Expand(m_hWnd, hParent, TVE_EXPAND);
//専嶕傾僀僥儉偑側偔側傞傑偱孞傝曉偟
while (lpszStart)
{
//僨傿儗僋僩儕柤拪弌
TCHAR szName[MAX_PATH] = _T("");
LPCTSTR lpszEnd = wcschr(lpszStart + 1, _T('\\'));
if (lpszEnd) {
int len = lpszEnd - (lpszStart + 1);
wcsncpy(szName, ++lpszStart, len);
szName[len] = 0;
}
else
wcscpy(szName, ++lpszStart);
//巕僲乕僪庢摼
HTREEITEM hChild = TreeView_GetChild(m_hWnd, hParent);
while (hChild)
{
//巕僲乕僪偺傾僀僥儉庢摼
TCHAR szChildName[MAX_PATH] = _T("");
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_HANDLE;
tvi.pszText = szChildName;
tvi.cchTextMax = MAX_PATH;
tvi.hItem = hChild;
TreeView_GetItem(m_hWnd, &tvi);
//懳徾偺僨傿儗僋僩儕偺応崌
if (wcscmp(szName, szChildName) == 0)
{
hSelectItem = hParent = hChild;
lpszStart = wcschr(lpszStart, _T('\\'));
if (lpszStart) {
//巕僲乕僪傪揥奐
TreeView_Expand(m_hWnd, hParent, TVE_EXPAND);
}
break;
}
hChild = TreeView_GetNextItem(m_hWnd, hChild, TVGN_NEXT);
} //End of while
if(!hChild) break;
} //End of while
//ADD START TODA (僲乕僪傪峏怴偡傞張棟傪捛壛)
if(bUpdate)
{
//僲乕僪偺忬懺傪庢摼
TVITEM tvi;
tvi.mask = TVIF_CHILDREN | TVIF_STATE | TVIF_HANDLE;
tvi.hItem = hParent;
tvi.cChildren = 0;
TreeView_GetItem(m_hWnd, &tvi);
//峏怴慜偺巕僲乕僪傪庢摼
HTREEITEM hChild = TreeView_GetChild(m_hWnd, hParent);
//愭摢僲乕僪傪峏怴(嶌惉偟側偍偡)
TreeExpand(m_hWnd, hParent);
//峏怴慜偵巕僲乕僪偑偁傝丄僲乕僪偑揥奐偟偰偄偨応崌
if(hChild && tvi.state & TVIS_EXPANDED)
//僲乕僪傪奐偔
TreeView_Expand(m_hWnd, hParent, TVE_EXPAND);
else
//僲乕僪傪暵偠傞
TreeView_Expand(m_hWnd, hParent, TVE_COLLAPSE);
}
//ADD END
//傾僀僥儉傪慖戰
if(bSelect) //ADD TODA
TreeView_SelectItem(m_hWnd, hSelectItem);
m_bLoadReq = TRUE;
//DEL START TODA (旕昞帵偵偟側偄曽偑憗偄?亄偪傜偮偒杊巭)
// //僣儕乕價儏乕傪昞帵
// ShowWindow(m_hWnd, SW_SHOW);
// SetFocus(hwndPrev);
//DEL END
}
///////////////////////////////////////////////////////////////
void CTreeView::LoadFolderTree()
{
m_bLoadReq = FALSE;
// HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
HWND hwndPrev = GetFocus();
ShowWindow(m_hWnd, SW_HIDE);
TreeView_DeleteAllItems(m_hWnd);
TVINSERTSTRUCT tvis;
tvis.hParent = NULL;
tvis.hInsertAfter = TVI_SORT;
tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
tvis.item.pszText = (LPTSTR)GetRootName();
tvis.item.iImage = 0;
tvis.item.iSelectedImage = 0;
tvis.item.cChildren = 1;
HTREEITEM hRoot = TreeView_InsertItem(m_hWnd, &tvis);
// LoadChildFolder(hRoot, _T(""));
m_hRootItem = hRoot;
TreeView_Expand(m_hWnd, hRoot, TVE_EXPAND);
// m_hRootItem = hRoot;
// SetCursor(hCursor);
//ADD TODA (専嶕寢壥僼僅儖僟嶌惉)
LoadSeachFolderRoot();
m_bLoadReq = TRUE;
ShowWindow(m_hWnd, SW_SHOW);
SetFocus(hwndPrev);
}
//ADD START TODA
///////////////////////////////////////////////////////////////
void CTreeView::LoadSeachFolderRoot()
{
TVINSERTSTRUCT tvis;
tvis.hParent = NULL;
tvis.hInsertAfter = TVI_LAST;
tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
tvis.item.pszText = SEARCH_FOLDER_NAME;
tvis.item.iImage = 7;
tvis.item.iSelectedImage = 7;
tvis.item.cChildren = 0;
m_hSearchItem = TreeView_InsertItem(m_hWnd, &tvis);
}
//ADD END
///////////////////////////////////////////////////////////////
void CTreeView::InitImageList()
{
m_bLoadReq = FALSE;
TreeView_DeleteAllItems(m_hWnd);
TreeView_SetImageList(m_hWnd, NULL, TVSIL_NORMAL);
ImageList_Destroy(m_hImageList);
//ImageList嶌惉
m_hImageList = ImageList_Create(16, 16, ILC_COLOR|ILC_MASK, 1, 2);
AddRootIcon(m_hImageList);
HICON hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_FOLDER_S, IMAGE_ICON, 16, 16, 0);
ImageList_AddIcon(m_hImageList, hIcon);
DestroyIcon(hIcon);
hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_FOLDERO_S, IMAGE_ICON, 16, 16, 0);
ImageList_AddIcon(m_hImageList, hIcon);
DestroyIcon(hIcon);
hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_TEMP_S, IMAGE_ICON, 16, 16, 0);
ImageList_AddIcon(m_hImageList, hIcon);
DestroyIcon(hIcon);
hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_MYDOCUMENTS_S, IMAGE_ICON, 16, 16, 0);
ImageList_AddIcon(m_hImageList, hIcon);
DestroyIcon(hIcon);
//ADD START TODA
//僗僞乕僩儊僯儏乕
hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_START_S, IMAGE_ICON, 16, 16, 0);
ImageList_AddIcon(m_hImageList, hIcon);
DestroyIcon(hIcon);
//僱僢僩儚乕僋傾僀僐儞
hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_NETFOLDER_S, IMAGE_ICON, 16, 16, 0);
ImageList_AddIcon(m_hImageList, hIcon);
DestroyIcon(hIcon);
//専嶕傾僀僐儞
hIcon = (HICON)LoadImage(g_hInst, (LPCTSTR)IDI_SEARCH_S, IMAGE_ICON, 16, 16, 0);
ImageList_AddIcon(m_hImageList, hIcon);
DestroyIcon(hIcon);
//ADD END
TreeView_SetImageList(m_hWnd, m_hImageList, TVSIL_NORMAL);
m_bLoadReq = TRUE;
}
///////////////////////////////////////////////////////////////
void CTreeView::SetCurrentFolder()
{
TCHAR szPath[MAX_PATH] = _T("");
TCHAR szTemp[MAX_PATH] = _T("");
TCHAR szName[MAX_PATH] = _T("");
HTREEITEM hTreeItem = TreeView_GetSelection(m_hWnd);
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_HANDLE;
tvi.pszText = szName;
tvi.cchTextMax = MAX_PATH;
tvi.hItem = hTreeItem;
TreeView_GetItem(m_hWnd, &tvi);
if (wcscmp(szName, GetRootName()) != 0)
{
wcscpy(szPath, szName);
hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
while (hTreeItem)
{
tvi.hItem = hTreeItem;
TreeView_GetItem(m_hWnd, &tvi);
if (wcscmp(szName, GetRootName()) != 0)
wsprintf(szTemp, _T("%s\\%s"), szName, szPath);
else
wsprintf(szTemp, _T("\\%s"), szPath);
wcscpy(szPath, szTemp);
hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
}
wcscpy(szTemp, szPath);
}
else
{
wcscpy(szTemp, _T(""));
}
g_MainWnd.m_ListView.LoadFolderItem(szTemp, FALSE);
}
//ADD START TODA
////////////////////////////////////////////////////////////////
void CTreeView::GetCurrentFolder(LPTSTR lpszPath)
{
TCHAR szPath[MAX_PATH] = _T("");
TCHAR szTemp[MAX_PATH] = _T("");
TCHAR szName[MAX_PATH] = _T("");
HTREEITEM hTreeItem = TreeView_GetSelection(m_hWnd);
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_HANDLE;
tvi.pszText = szName;
tvi.cchTextMax = MAX_PATH;
tvi.hItem = hTreeItem;
TreeView_GetItem(m_hWnd, &tvi);
if (wcscmp(szName, GetRootName()) != 0)
{
wcscpy(szPath, szName);
hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
while (hTreeItem)
{
tvi.hItem = hTreeItem;
TreeView_GetItem(m_hWnd, &tvi);
if (wcscmp(szName, GetRootName()) != 0)
wsprintf(szTemp, _T("%s\\%s"), szName, szPath);
else
wsprintf(szTemp, _T("\\%s"), szPath);
wcscpy(szPath, szTemp);
hTreeItem = TreeView_GetParent(m_hWnd, hTreeItem);
}
wcscpy(szTemp, szPath);
}
else
{
// wcscpy(szTemp, _T(""));
szTemp[0] = 0x00;
}
wcscpy(m_szCurrentFolder, szTemp);
if(lpszPath) wcscpy(lpszPath, szTemp);
}
////////////////////////////////////////////////////////////////
DWORD CTreeView::OnKeyDown(LPNMTVKEYDOWN lpnkd)
{
if (m_bEditing) return 0;
if(g_bDraging)
{
if(lpnkd->wVKey == VK_ESCAPE) {
g_MainWnd.OnDropCansel();
g_bDraging = FALSE;
}
return 0;
}
//僔儑乕僩僇僢僩僉乕僥乕僽儖
if ((lpnkd->wVKey == 'M' && (GET_KEYSTATE(VK_CONTROL)&0x8000)) ||
(lpnkd->wVKey == VK_CONTROL && (GET_KEYSTATE(VK_MENU)&0x8000)))
{
HTREEITEM hItem = TreeView_GetSelection(m_hWnd);
if(hItem)
{
RECT rc;
TreeView_GetItemRect(m_hWnd, hItem, &rc, TRUE);
OnRClick(rc.left + (rc.right - rc.left) / 2, rc.top + (rc.bottom - rc.top) / 2);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -