📄 treeview2.cpp
字号:
OnRClick(0, 0);
}
else
//儕僗僩價儏乕偺僉乕張棟偲摨偠応崌
return g_MainWnd.m_ListView.OnKeyDown((LPNMLVKEYDOWN)lpnkd);
return 0;
}
///////////////////////////////////////////////////////////////
void CTreeView::OnSetFocus()
{
g_MainWnd.m_CmdBands.SetEnableItemSelected2();
}
//ADD END
///////////////////////////////////////////////////////////////
void CTreeView::OnKillFocus()
{
KillTimer(g_MainWnd.m_hWnd, ID_TIMER_TVSELECTED);
if (m_bTimer) {
SetCurrentFolder();
m_bTimer = FALSE;
}
}
///////////////////////////////////////////////////////////////
void CTreeView::OnSelChanged(NMTREEVIEW* lpnmtv)
{
if (!m_bLoadReq) return;
KillTimer(g_MainWnd.m_hWnd, ID_TIMER_TVSELECTED);
if (lpnmtv->action == TVC_BYKEYBOARD) {
SetTimer(g_MainWnd.m_hWnd, ID_TIMER_TVSELECTED, 500, NULL);
m_bTimer = TRUE;
}
else if (lpnmtv->action == TVC_BYMOUSE)
SetCurrentFolder();
}
//ADD START TODA
///////////////////////////////////////////////////////////////
BOOL CTreeView::OnEndLabelEdit(TV_DISPINFO* pdi)
{
TV_DISPINFO* pDispInfo = (TV_DISPINFO*)pdi;
int nIndex = (int)pDispInfo->item.hItem;
if (!pDispInfo->item.pszText) return FALSE;
//僄儔乕僠僃僢僋
if (wcschr(pDispInfo->item.pszText, _T('\\'))!=NULL || wcschr(pDispInfo->item.pszText, _T('/'))!=NULL || wcschr(pDispInfo->item.pszText, _T(':'))!=NULL || wcschr(pDispInfo->item.pszText, _T(','))!=NULL || wcschr(pDispInfo->item.pszText, _T(';'))!=NULL || wcschr(pDispInfo->item.pszText, _T('*'))!=NULL || wcschr(pDispInfo->item.pszText, _T('?'))!=NULL || wcschr(pDispInfo->item.pszText, _T('<'))!=NULL || wcschr(pDispInfo->item.pszText, _T('>'))!=NULL || wcschr(pDispInfo->item.pszText, _T('|'))!=NULL)
{
MessageBox(g_MainWnd.m_hWnd, IDS_MSG_CANNOTUSECHAR, NULL, MB_OK|MB_ICONSTOP);
SetFocus(m_hWnd);
TreeView_EditLabel(m_hWnd, nIndex);
return FALSE;
}
else
{
if (wcslen(pDispInfo->item.pszText))
{
TCHAR szTempPath[MAX_PATH];
wcscpy(szTempPath, m_szCurrentFolder);
LPTSTR lpszTemp = wcsrchr(szTempPath, _T('\\'));
if (lpszTemp)
{
*lpszTemp = 0;
TCHAR szNewPath[MAX_PATH];
TCHAR szOldPath[MAX_PATH];
wsprintf(szOldPath, _T("%s"), m_szCurrentFolder);
wsprintf(szNewPath, _T("%s\\%s"), szTempPath, pDispInfo->item.pszText);
DisableUpdateNotify(); //ADD TODA (僼傽僀儖曄峏捠抦 from Y.Nagamidori)
//僼僅儖僟柤曄峏
if (!MoveFile(szOldPath, szNewPath))
{
MessageBox(g_MainWnd.m_hWnd, IDS_MSG_RENAMEERROR, NULL, MB_OK|MB_ICONSTOP);//幐攕
SetFocus(m_hWnd);
TreeView_EditLabel(m_hWnd, nIndex);
EnableUpdateNotify(); //ADD TODA (僼傽僀儖曄峏捠抦 from Y.Nagamidori)
return FALSE;
}
EnableUpdateNotify(); //ADD TODA (僼傽僀儖曄峏捠抦 from Y.Nagamidori)
//曄峏屻偺僷僗傊峏怴
wcscat(szNewPath, _T("\\"));
g_MainWnd.m_ListView.LoadFolderItem(szNewPath, FALSE);
}
else
{
//曐懚僷僗偑偍偐偟偄(僶僌偺応崌偺傒敪惗)
MessageBox(g_MainWnd.m_hWnd, IDS_MSG_RENAMEERROR, NULL, MB_OK|MB_ICONSTOP);//幐攕
SetFocus(m_hWnd);
TreeView_EditLabel(m_hWnd, nIndex);
return FALSE;
}
}
else
{
//幐攕
MessageBox(g_MainWnd.m_hWnd, IDS_MSG_INPUTNAME, NULL, MB_OK|MB_ICONSTOP);
SetFocus(m_hWnd);
TreeView_EditLabel(m_hWnd, nIndex);
return FALSE;
}
}
return TRUE;
}
////////////////////////////////////////////////////////////////
void CTreeView::OnRClick(int cx, int cy, BOOL bSelect)
{
HTREEITEM hItem=0;
TVHITTESTINFO tv_ht;
//慖戰傾僀僥儉偺庢摼
memset(&tv_ht, 0x00, sizeof(tv_ht));
tv_ht.flags = TVHT_ONITEM;
tv_ht.pt.x = cx;
tv_ht.pt.y = cy;
if(bSelect) ScreenToClient(m_hWnd, &(tv_ht.pt));
hItem = TreeView_HitTest(m_hWnd, &tv_ht);
//慖戰傾僀僥儉偑側偄応崌側偵傕偟側偄
if(!hItem) return;
if(bSelect)
{
//傾僀僥儉偺僴僀儔僀僩
TreeView_SelectItem(m_hWnd, hItem);
}
//傾僀僥儉偺儔儀儖庢摼
TCHAR szChildName[MAX_PATH] = _T("");
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_HANDLE;
tvi.pszText = szChildName;
tvi.cchTextMax = MAX_PATH;
tvi.hItem = hItem;
TreeView_GetItem(m_hWnd, &tvi);
//専嶕僼僅儖僟偺応崌
if (wcscmp(szChildName, SEARCH_FOLDER_NAME) == 0)
{
//儊僯儏乕偼昞帵偟側偄
return;
}
//塃僋儕僢僋儊僯儏乕嶌惉
HMENU hMenu;
hMenu = GetSubMenu(g_MainWnd.m_ListView.m_hMenuPopup, 1);
//埑弅/専嶕偺桳岠/柍岠敾掕
//g_MainWnd.m_CmdBands.SetEnableCompressSelected(hMenu, 0, 2, g_MainWnd.m_ListView.m_Settings.nCompDLL);
g_MainWnd.m_CmdBands.SetEnableCompressSelected(hMenu, hMenu, 0, 2, g_MainWnd.m_ListView.m_Settings.nCompDLL); //add by kawa
//塃僋儕僢僋儊僯儏乕昞帵
TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_TOPALIGN,
cx, cy, 0, g_MainWnd.m_hWnd, NULL);
}
//ADD END
///////////////////////////////////////////////////////////////
// -- Ex.Q --
// 僣儕乕 價儏乕偺崁栚偺愨懳僷僗傪媮傔傞
void CTreeView::GetTree (HTREEITEM hItem, LPTSTR pszKey)
{
TCHAR szName[MAX_PATH];
TV_ITEM tvi;
memset (&tvi, 0, sizeof (tvi));
// 恊傪庢摼
HTREEITEM hParent;
hParent = TreeView_GetParent (m_hWnd, hItem);
if (hParent) {
// 崁栚偺恊偺恊丒丒丒傪庢摼偡傞
GetTree (hParent, pszKey);
// 崁栚偺柤慜傪庢摼偡傞
tvi.mask = TVIF_TEXT;
tvi.hItem = hItem;
tvi.pszText = szName;
tvi.cchTextMax = MAX_PATH;
TreeView_GetItem (m_hWnd, &tvi);
// 儖乕僩偱側偗傟偽亸傪偮偗傞
if (wcscmp(pszKey, GetRootName()) != 0)
lstrcat (pszKey, TEXT("\\"));
else
lstrcpy (pszKey, TEXT("\\"));
// 恊偺僷僗偵崱偺僼僅儖僟柤傪捛壛
lstrcat (pszKey, szName);
} else {
//MOD START TODA (儖乕僩敾掕捛壛)
if(hItem == m_hRootItem)
{
// 崁栚偺柤慜傪庢摼偡傞
lstrcpy(pszKey, GetRootName());
szName[0] = _T('\0');
tvi.mask = TVIF_TEXT | TVIF_PARAM;
tvi.hItem = hItem;
tvi.pszText = szName;
tvi.cchTextMax = MAX_PATH;
TreeView_GetItem (m_hWnd, &tvi);
}
//MOD END
//ADD START TODA (専嶕敾掕)
if(hItem == m_hSearchItem)
{
// 崁栚偺柤慜傪庢摼偡傞
lstrcpy(pszKey, SEARCH_FOLDER_NAME);
szName[0] = _T('\0');
tvi.mask = TVIF_TEXT | TVIF_PARAM;
tvi.hItem = hItem;
tvi.pszText = szName;
tvi.cchTextMax = MAX_PATH;
TreeView_GetItem (m_hWnd, &tvi);
}
}
}
///////////////////////////////////////////////////////////////
// CountChildren - 僉乕偺僒僽僉乕偺悢傪挷傋傞
//
int CTreeView::CountChildren (LPTSTR pszPath, LPTSTR pszKey)
{
int rc;
TCHAR szName[MAX_PATH];
HANDLE ff;
WIN32_FIND_DATA wfd;
DWORD dwCnt = 0;
if (wcscmp(pszPath, GetRootName()) != 0)
wsprintf (szName, _T("%s\\%s\\*.*"), pszPath, pszKey);
else
wsprintf (szName, _T("\\%s\\*.*"), pszKey);
ff = FindFirstFile( szName, &wfd );
if (ff != INVALID_HANDLE_VALUE) {
while (1) {
if (wcsicmp(wfd.cFileName, _T("Recycled")) != 0 &&
(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
dwCnt++;
break;
}
rc = FindNextFile (ff, &wfd);
if (rc == 0)
break;
}
FindClose(ff);
}
return dwCnt;
}
///////////////////////////////////////////////////////////////
// EnumChildren - 僉乕偺僒僽僉乕傪楍嫇偡傞
int CTreeView::EnumChildren(HTREEITEM hParent, LPTSTR pszPath)
{
int rc;
DWORD nChild;
HANDLE ff;
WIN32_FIND_DATA wfd;
TCHAR szName[MAX_PATH];
TVINSERTSTRUCT tvis;
DWORD dwCnt = 0;
//ADD START TODA (専嶕僼僅儖僟偺応崌)
if (wcscmp(pszPath, SEARCH_FOLDER_NAME) == 0)
return 0;
//ADD END
//ADD START TODA (巕僲乕僪偺懚嵼僠僃僢僋)
HTREEITEM hChild = TreeView_GetChild(m_hWnd, hParent);
while(hChild) {
//師偺傾僀僥儉傪庢摼
HTREEITEM hNext = TreeView_GetNextItem(m_hWnd, hChild, TVGN_NEXT);
//巕僲乕僪偺傾僀僥儉庢摼
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(pszPath, GetRootName()) != 0)
wsprintf (szName, _T("%s\\%s"), pszPath, szChildName);
else
wsprintf (szName, _T("\\%s"), szChildName);
//懚嵼偟側偄応崌
if(GetFileAttributes(szName) == 0xFFFFFFFF)
TreeView_DeleteItem(m_hWnd, hChild);
hChild = hNext;
} //End of while
//ADD END
if (wcscmp(pszPath, GetRootName()) != 0)
wsprintf (szName, _T("%s\\*.*"), pszPath);
else
wsprintf (szName, _T("\\*.*"));
ff = FindFirstFile (szName, &wfd);
if (ff != INVALID_HANDLE_VALUE) {
while (1) {
if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ||
wfd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) &&
wcsicmp(wfd.cFileName, _T("Recycled")) != 0) {
//ADD START TODA (巕僲乕僪偺懚嵼僠僃僢僋捛壛)
//巕僲乕僪偺懚嵼僠僃僢僋
BOOL bFind = FALSE;
HTREEITEM hChild = TreeView_GetChild(m_hWnd, hParent);
while(hChild) {
//師偺傾僀僥儉傪庢摼
HTREEITEM hNext = TreeView_GetNextItem(m_hWnd, hChild, TVGN_NEXT);
//巕僲乕僪偺傾僀僥儉庢摼
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(szChildName, wfd.cFileName) == 0)
{
bFind = !bFind;
break;
}
hChild = hNext;
} //End of while
//ADD END
if(!bFind) //ADD TODA (敾掕忦審捛壛)
{
// 壓埵偺僨傿儗僋僩儕偑偁傞偐専嵏
nChild = CountChildren (pszPath, wfd.cFileName);
// 僣儕乕 價儏乕 僐儞僩儘乕儖偵僉乕傪憓擖偡傞
tvis.hParent = hParent;
tvis.hInsertAfter = TVI_SORT;
tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
tvis.item.pszText = wfd.cFileName;
tvis.item.cChildren = (nChild ? 1 : 0);
//ADD START TODA
if (wcsicmp(wfd.cFileName, g_MainWnd.m_lpszStartMenu) == 0) {
tvis.item.iImage = 5;
tvis.item.iSelectedImage = 5;
}
else
if (wcsicmp(wfd.cFileName, g_MainWnd.m_lpszNetwork) == 0) {
tvis.item.iImage = 6;
tvis.item.iSelectedImage = 6;
}
else
//ADD END
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
tvis.item.iImage = 3;
tvis.item.iSelectedImage = 3;
}
else if (wcsicmp(wfd.cFileName, g_MainWnd.m_lpszMyDocument) == 0) {
tvis.item.iImage = 4;
tvis.item.iSelectedImage = 4;
}
else {
tvis.item.iImage = 1;
tvis.item.iSelectedImage = 2;
}
TreeView_InsertItem(m_hWnd, &tvis);
}
dwCnt++;
}
rc = FindNextFile (ff, &wfd);
if (rc == 0)
break;
} //End of while
FindClose(ff);
}
// 僒僽僉乕偑側偄応崌偼揥奐儃僞儞傪嶍彍偡傞
TVITEM tvi;
tvi.hItem = hParent;
tvi.mask = TVIF_CHILDREN;
//MOD TODA
if (!TreeView_GetChild(m_hWnd, hParent))
tvi.cChildren = 0;
else
tvi.cChildren = 1;
TreeView_SetItem (m_hWnd, &tvi);
// 僜乕僩
TreeView_SortChildren(m_hWnd, hParent, 0);
return dwCnt;
}
///////////////////////////////////////////////////////////////
void CTreeView::OnItemExpanded(NMTREEVIEW* lpnmtv)
{
// 師偵僽儔儞僠傪揥奐偡傞偲偒偵夵傔偰楍嫇偡傞偺偱僒僽僉乕傪嶍彍偡傞
if (lpnmtv->action == TVE_COLLAPSE) {
//ADD START TODA (慖戰偟偰偄傞僲乕僪傪暵偠偨応崌偺僼僅乕僇僗堏摦)
if(lpnmtv->itemNew.hItem != lpnmtv->itemOld.hItem)
SetCurrentFolder();
//ADD END
//DEL START TODA (OnItemExpanding()偵張棟傪堏摦)
// HTREEITEM hChild;
// HTREEITEM hNext;
//
// hChild = TreeView_GetChild (lpnmtv->hdr.hwndFrom, lpnmtv->itemNew.hItem);
// while (hChild) {
// hNext = TreeView_GetNextItem (lpnmtv->hdr.hwndFrom, hChild, TVGN_NEXT);
// TreeView_DeleteItem (lpnmtv->hdr.hwndFrom, hChild);
// hChild = hNext;
// }
//DEL END
}
}
///////////////////////////////////////////////////////////////
void CTreeView::OnItemExpanding(NMTREEVIEW* lpnmtv)
{
if (lpnmtv->action == TVE_EXPAND) {
TreeExpand(m_hWnd, lpnmtv->itemNew.hItem); //ADD TODA
//DEL START TODA (娭悢屇傃弌偟(TreeExpand())偵偟偨堊)
// TCHAR szKey[MAX_PATH];
// //僼僅儖僟柤傪庢摼
// GetTree (lpnmtv->itemNew.hItem, szKey);
// //巕僣儕乕傪楍嫇偡傞
// EnumChildren (lpnmtv->itemNew.hItem, szKey);
//DEL END
}
}
//ADD START TODA
///////////////////////////////////////////////////////////////
void CTreeView::OnMouseMove(POINT ptWnd)
{
HWND hMain = g_MainWnd.m_hWnd;
ClientToScreen(hMain, &ptWnd);
//僣儕乕價儏乕偵僴僀儔僀僩傪愝掕
TVHITTESTINFO tv_ht ;
memset(&tv_ht, 0x00, sizeof(tv_ht));
tv_ht.flags = TVHT_ONITEM;
tv_ht.pt.x = ptWnd.x;
tv_ht.pt.y = ptWnd.y;
ScreenToClient(m_hWnd, &(tv_ht.pt));
HTREEITEM hItem = TreeView_HitTest(m_hWnd, &tv_ht);
if(hItem)
{
//傾僀僥儉偺儔儀儖庢摼
TCHAR szChildName[MAX_PATH] = _T("");
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_HANDLE;
tvi.pszText = szChildName;
tvi.cchTextMax = MAX_PATH;
tvi.hItem = hItem;
TreeView_GetItem(m_hWnd, &tvi);
//専嶕僼僅儖僟埲奜偺応崌
if (wcscmp(szChildName, SEARCH_FOLDER_NAME) != 0)
TreeView_SelectDropTarget(m_hWnd, hItem);
else
TreeView_SelectDropTarget(m_hWnd, NULL);
}
else
TreeView_SelectDropTarget(m_hWnd, NULL);
}
///////////////////////////////////////////////////////////////
BOOL CTreeView::OnLButtonUp(HWND hWnd)
{
HWND hMain = g_MainWnd.m_hWnd;
//僣儕乕價儏乕偺僪儘僢僾張棟
DWORD dwPos = GetMessagePos();
TVHITTESTINFO tv_ht;
memset(&tv_ht, 0x00, sizeof(tv_ht));
tv_ht.flags = TVHT_ONITEM;
tv_ht.pt.x = LOWORD(dwPos);
tv_ht.pt.y = HIWORD(dwPos);
ScreenToClient(m_hWnd, &(tv_ht.pt));
HTREEITEM hItem = TreeView_HitTest(m_hWnd, &tv_ht);
if(hItem)
{
//傾僀僥儉偺儔儀儖庢摼
TCHAR szChildName[MAX_PATH] = _T("");
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_HANDLE;
tvi.pszText = szChildName;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -