📄 favtreectrl.cpp
字号:
GetItemPath(m_hItem, path);
if(m_hItem != GetRootItem())
{
path = "\\"+path;
path = szPath+ path + GetItemText(m_hItem) + "\\";
}
else
path = szPath + "\\";
ShellExecute(NULL, "find", path, NULL, NULL, 0);
}
void CFavTreeCtrl::OnRfavProperty()
{
// TODO: Add your command handler code here
CString strName;
strName = GetItemText(m_hItem);
CString path,szPath;
if(!pmf->GetFavoriteFolder(szPath))
return ;
GetItemPath(m_hItem, path);
path = "\\"+path;
path = szPath+ path;
try{
SHELLEXECUTEINFO sei;
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_INVOKEIDLIST|SEE_MASK_FLAG_NO_UI ;
sei.lpIDList = NULL;
sei.hwnd = NULL;
sei.lpFile = path+strName+".url";
sei.lpVerb = "properties";
sei.nShow = SW_SHOWDEFAULT;
sei.lpDirectory = path;
if(!ShellExecuteEx(&sei))
ShellExecute(NULL, "properties", path+strName+".lnk", NULL, NULL, SW_SHOWDEFAULT );
else
{
int d = GetItemData(m_hItem);
if(d>=0)
{
char buf[2048];
::GetPrivateProfileString(_T("InternetShortcut"), _T("URL"),
_T(""), buf, 2048, path+strName+".url");
CString url;
POSITION pos = m_astrFav.FindIndex(d);
if(pos!=NULL)
url = m_astrFav.GetAt(pos);
if(url==buf)
return;
else
{
if(pos!=NULL)
m_astrFav.SetAt(pos, buf);
//update menu
pmf->m_bFavDirty = 2;
}
}
}
}catch(...){}
}
void CFavTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(pImageList)
{
delete pImageList;
pImageList = NULL;
}
m_hDragItem = pNMTreeView->itemNew.hItem;
if(m_hDragItem == NULL)
return;
pImageList = CreateDragImage(m_hDragItem);
if(pImageList!=NULL)
{
VERIFY (pImageList->BeginDrag (0, CPoint (8, 8)));
VERIFY (pImageList->DragEnter (GetDesktopWindow (), pNMTreeView->ptDrag));
m_bDragging = TRUE;
m_hDropItem = NULL;
m_hOldDropItem = NULL;
m_bMoveIntoFolder = FALSE;
m_HalfItemHeight = GetItemHeight()/2;
SetCapture();
m_nScrollTimer = SetTimer(1, 75, NULL); //auto scroll time
}
*pResult = 0;
}
void CFavTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
try{
if(m_bDragging)
{
if(pImageList==NULL)
{
m_bDragging = FALSE;
return;
}
CPoint pt (point);
ClientToScreen (&pt);
// move the drag image
VERIFY (pImageList->DragMove (pt));
// unlock window updates
VERIFY (pImageList->DragShowNolock (FALSE));
ScreenToClient (&pt);
UINT uFlags;
// get the item that is below cursor
m_hDropItem = HitTest (pt, &uFlags);
if( m_hOldDropItem == NULL )
m_hOldDropItem = GetDropHilightItem();
// highlight it
if(m_hDropItem != GetRootItem())
pt.y-=m_HalfItemHeight;
if(HitTest(pt, &uFlags) == m_hDropItem)
{
SelectDropTarget (m_hDropItem);
m_bMoveIntoFolder = TRUE;
}
else
{
m_bMoveIntoFolder = FALSE;
HTREEITEM hdi = m_hDropItem;
m_hDropItem = GetPrevSiblingItem(m_hDropItem);
if(m_hDropItem == NULL)
{
m_hDropItem = GetParentItem(hdi);
m_bMoveIntoFolder = TRUE;
}
SelectDropTarget(NULL);
}
if( m_nExpandTimer && m_hDropItem == m_hOldDropItem )
{
KillTimer( m_nExpandTimer );
m_nExpandTimer = 0;
}
if( !m_nExpandTimer )
m_nExpandTimer = SetTimer( 1000, 2000, NULL );
VERIFY (pImageList->DragShowNolock (TRUE));
}
else
{
//display url in status bar
UINT uFlags;
// get the item that is below cursor
HTREEITEM hItem = HitTest (point, &uFlags);
if(hItem != m_hOldDropItem)
{
CString url;
int img=-1, selimg=-1;
GetItemImage(hItem, img, selimg);
if(img != 0 && img != 5)
{
int d = GetItemData(hItem);
if(d>=0)
{
POSITION pos = m_astrFav.FindIndex(d);
if(pos!=NULL)
url = m_astrFav.GetAt(pos);
}
else
url = "";
}
pmf->SetMessageText(url);
m_hOldDropItem = hItem;
}
}
}catch(...){}
CTreeCtrl::OnMouseMove(nFlags, point);
}
void CFavTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bDragging)
{
KillTimer( m_nScrollTimer );//auto scroll
KillTimer( m_nExpandTimer); //auto expand
m_nScrollTimer =0;
m_nExpandTimer = 0;
VERIFY (pImageList->DragLeave (GetDesktopWindow ()));
pImageList->EndDrag ();
// stop intercepting all mouse messages
VERIFY (ReleaseCapture ());
delete pImageList;
pImageList = NULL;
m_bDragging = FALSE;
if(m_hDropItem==NULL)
return;
int img, selimg;
GetItemImage(m_hDragItem, img, selimg);
BOOL bMoveFolder=FALSE;
if(img==0|| img == 5)
bMoveFolder=TRUE;
GetItemImage(m_hDropItem, img, selimg);
BOOL bTargetFolder=FALSE;
if((img==0|| img == 5) && m_bMoveIntoFolder)
bTargetFolder=TRUE;
//get source and taarget
CString strName;
strName = GetItemText(m_hDragItem);
CString path,szPath;
if(!pmf->GetFavoriteFolder(szPath))
return ;
//update menu
pmf->m_bFavDirty = 2;
GetItemPath(m_hDragItem, path);
path = "\\"+path;
path = szPath+ path;
CString source;
if(!bMoveFolder)
{
source = path+strName+".url";
OFSTRUCT ofs;
if(OpenFile(source, &ofs, OF_EXIST)==HFILE_ERROR)
{
source = path+strName+".lnk";
strName += ".lnk";
}
else
strName += ".url";
}
else
source = path + strName;
//get target
CString strDir = GetItemText(m_hDropItem);
path ="";
GetItemPath(m_hDropItem, path);
HTREEITEM hRoot = GetRootItem();
path = "\\"+path;
path = szPath+ path;
CString target;
if(m_hDropItem == hRoot)
target = szPath+"\\"+strName;
else if(!bTargetFolder)
target = path+strName;
else if(!m_bMoveIntoFolder)
target = path + strName;
else
target = path+strDir+"\\"+strName;
HTREEITEM hnode, hParent;
if(!bMoveFolder)
{
hParent = GetParentItem(m_hDropItem);
if(source!=target)
{
//copy or move here
//get source path
if(CopyFile(source, target, TRUE))
{
if(ItemHasChildren(m_hDropItem) && m_bMoveIntoFolder)//is folder
{
GetItemImage(m_hDragItem, img, selimg);
hnode = InsertItem(strName.Left(strName.GetLength()-4), img, selimg, m_hDropItem, TVI_LAST);
SetItemData(hnode, GetItemData(m_hDragItem));
}
else if(!bTargetFolder || !m_bMoveIntoFolder)
{
GetItemImage(m_hDragItem, img, selimg);
hnode = InsertItem(strName.Left(strName.GetLength()-4), img, selimg, hParent, m_hDropItem);
SetItemData(hnode, GetItemData(m_hDragItem));
}
if(!PRESS_CTRL)
{
//delete original
if(DeleteFile(source))
DeleteItem(m_hDragItem);
}
//update menu order
source = source.Left(source.GetLength()-strName.GetLength());
hParent = GetParentItem(m_hDragItem);
BuildMenuOrder(source, hParent);
target = target.Left(target.GetLength()-strName.GetLength());
if(bTargetFolder)
hParent = m_hDropItem;
else
hParent = GetParentItem(m_hDropItem);
BuildMenuOrder(target, hParent);
}
else//not update menu
{
pmf->m_bFavDirty = FALSE;
}
}
else
{
//only sort the order
GetItemImage(m_hDragItem, img, selimg);
if(!bTargetFolder)
hnode = InsertItem(strName.Left(strName.GetLength()-4), img, selimg, hParent, m_hDropItem);
else
hnode = InsertItem(strName.Left(strName.GetLength()-4), img, selimg, m_hDropItem, TVI_FIRST);
SetItemData(hnode, GetItemData(m_hDragItem));
DeleteItem(m_hDragItem);
//update menu order
source = source.Left(source.GetLength()-strName.GetLength());
if(bTargetFolder)
hParent = m_hDropItem;
else
hParent = GetParentItem(m_hDropItem);
BuildMenuOrder(source, hParent);
}
}
else
{
hParent = GetParentItem(m_hDropItem);
if(source!=target)
{
//copy or move here
//get source path
if(MoveFile(source, target))
{
if(ItemHasChildren(m_hDropItem))//is folder
{
GetItemImage(m_hDragItem, img, selimg);
hnode = InsertItem(strName, img, selimg, m_hDropItem, TVI_LAST);
SetItemData(hnode, GetItemData(m_hDragItem));
}
else if(!bTargetFolder)
{
GetItemImage(m_hDragItem, img, selimg);
hnode = InsertItem(strName, img, selimg, hParent, m_hDropItem);
SetItemData(hnode, GetItemData(m_hDragItem));
}
DeleteItem(m_hDragItem);
if(source+"\\" == pmf->m_strStartFavFolder)
{
m_hStartFolder = hnode;
SetItemState(hnode,TVIS_BOLD,TVIS_BOLD);
}
//update menu order
source = source.Left(source.GetLength()-strName.GetLength());
hParent = GetParentItem(m_hDragItem);
BuildMenuOrder(source, hParent);
target = target.Left(target.GetLength()-strName.GetLength());
if(bTargetFolder && m_bMoveIntoFolder)
hParent = m_hDropItem;
else
hParent = GetParentItem(m_hDropItem);
BuildMenuOrder(target, hParent);
//move sub order
CString str;
if(pmf->GetFavoriteFolder(str))
{
source = source.Mid(str.GetLength()+1);
target = target.Mid(str.GetLength()+1);
MoveSubMenuOrder(source+strName, target+strName);
}
}
else//not update menu
{
pmf->m_bFavDirty = FALSE;
}
}
else
{
//only sort the order
GetItemImage(m_hDragItem, img, selimg);
if(!bTargetFolder)
hnode = InsertItem(strName, img, selimg, hParent, m_hDropItem);
else
hnode = InsertItem(strName, img, selimg, m_hDropItem, TVI_FIRST);
SetItemData(hnode, GetItemData(m_hDragItem));
DeleteItem(m_hDragItem);
if(source+"\\" == pmf->m_strStartFavFolder)
{
m_hStartFolder = hnode;
SetItemState(hnode,TVIS_BOLD,TVIS_BOLD);
}
//update menu order
source = source.Left(source.GetLength()-strName.GetLength());
if(bTargetFolder && m_bMoveIntoFolder)
hParent = m_hDropItem;
else
hParent = GetParentItem(m_hDropItem);
BuildMenuOrder(source, hParent);
}
}
}
CTreeCtrl::OnLButtonUp(nFlags, point);
}
#define SCROLL_BORDER 10
#define SCROLL_SPEED_ZONE_WIDTH 20
void CFavTreeCtrl::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if( nIDEvent != m_nScrollTimer )
{
if( nIDEvent == m_nExpandTimer )
{
HTREEITEM htiFloat = GetDropHilightItem();
if( htiFloat && htiFloat == m_hDropItem )
{
int img, selimg;
GetItemImage(htiFloat, img, selimg);
if(img == 0 || img == 5)
{
ExpandNode(htiFloat);
Expand( htiFloat, TVE_EXPAND );
}
}
}
CTreeCtrl::OnTimer(nIDEvent);
return;
}
HTREEITEM hitem;
// Doesn't matter that we didn't initialize m_nTimerTicks
m_nTimerTicks++;
POINT pt;
GetCursorPos( &pt );
CRect rect;
GetClientRect( &rect );
ClientToScreen( &rect );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -