📄 favtreectrl.cpp
字号:
alias = dlg.m_alias; url = dlg.m_url;
alias.TrimLeft();
url.TrimLeft();
if(alias !="" && !alias.IsEmpty() && url!="" && !url.IsEmpty())
((CMainFrame*)pMainFrame)->m_mapAlias.SetAt(alias, url);
}
}
}
int CFavTreeCtrl::ExpandNode(HTREEITEM hItem)
{
if ((hItem != NULL) && !ItemHasChildren(hItem))
{
int img, selimg;
GetItemImage(hItem, img, selimg);
if(img == 0 || img == 5)
{
int nEndPos = m_astrFav.GetSize();
CString strName;
strName = GetItemText(hItem);
CString path,szPath;
if(!((CMainFrame*)pMainFrame)->GetFavoriteFolder(szPath))
return 0;
GetItemPath(hItem, path);
/*
HTREEITEM hItemp = GetParentItem(hItem);
HTREEITEM hParent = GetParentItem(hItemp);
HTREEITEM hRoot = GetRootItem();
while(hParent !=NULL)
{
path = GetItemText(hItemp)+"\\"+path;
hItemp = hParent;
hParent = GetParentItem(hParent);
}*/
path = "\\"+path;
path = szPath+ path + strName;
return ((CFavTree*)m_pFavTree)->BuildFavorites(path, nEndPos, hItem);
}
}
return 0;
}
void CFavTreeCtrl::OnRfavMostFolder()
{
// TODO: Add your command handler code here
CString strName;
strName = "myiefolder.mic";
CString path,szPath;
if(!((CMainFrame*)pMainFrame)->GetFavoriteFolder(szPath))
return ;
GetItemPath(m_hItem, path);
/*
HTREEITEM hItem = GetParentItem(m_hItem);
HTREEITEM hParent = GetParentItem(hItem);
HTREEITEM hRoot = GetRootItem();
while(hParent !=NULL)
{
path = GetItemText(hItem)+"\\"+path;
hItem = hParent;
hParent = GetParentItem(hParent);
}*/
path = "\\"+path;
path = szPath+ path + GetItemText(m_hItem) + "\\";
// if(CreateFile(path+strName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL)!=NULL)
{
int nImage, nSImage;
GetItemImage(m_hItem, nImage, nSImage);
if(nImage == 0)
{
SetItemImage(m_hItem, 5,6);
WritePrivateProfileString("MyIE", "MostFav", "1", path+strName);
}
else if (nImage == 5)
{
SetItemImage(m_hItem, 0,2);
WritePrivateProfileString("MyIE", "MostFav", "0", path+strName);
}
//update menu
((CMainFrame*)pMainFrame)->m_bFavDirty = TRUE;
}
}
void CFavTreeCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
HTREEITEM hItem;
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
hItem = HitTest(pt);
m_hItem = hItem;
if (hItem != NULL )
{
int img, selimg;
GetItemImage(hItem, img, selimg);
if(img == 0 || img == 5)
{
if(!ItemHasChildren(hItem))
ExpandNode(hItem);
OnRfavOpenall();
}
}
*pResult = 0;
}
void CFavTreeCtrl::OnRfavfolderFind()
{
// TODO: Add your command handler code here
CString path,szPath;
if(!((CMainFrame*)pMainFrame)->GetFavoriteFolder(szPath))
return ;
GetItemPath(m_hItem, path);
/*
HTREEITEM hItem = GetParentItem(m_hItem);
HTREEITEM hParent = GetParentItem(hItem);
HTREEITEM hRoot = GetRootItem();
while(hParent !=NULL)
{
path = GetItemText(hItem)+"\\"+path;
hItem = hParent;
hParent = GetParentItem(hParent);
}*/
path = "\\"+path;
path = szPath+ path + GetItemText(m_hItem) + "\\";
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(!((CMainFrame*)pMainFrame)->GetFavoriteFolder(szPath))
return ;
GetItemPath(m_hItem, path);
/*
HTREEITEM hItem = GetParentItem(m_hItem);
HTREEITEM hParent = GetParentItem(hItem);
HTREEITEM hRoot = GetRootItem();
while(hParent !=NULL)
{
path = GetItemText(hItem)+"\\"+path;
hItem = hParent;
hParent = GetParentItem(hParent);
}*/
path = "\\"+path;
path = szPath+ path;
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");
if(m_astrFav[d]==buf)
return;
else
{
m_astrFav[d] = buf;
//update menu
((CMainFrame*)pMainFrame)->m_bFavDirty = TRUE;
}
}
}
}
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;
int img, selimg;
GetItemImage(m_hDragItem, img, selimg);
if(img == 0 || img == 5)
{
//not drag folders
*pResult = 0;
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;
SetCapture();
SetCursor(LoadCursor(NULL, IDC_ARROW));
m_nTimerID = 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
if(m_bDragging)
{
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
SelectDropTarget (m_hDropItem);
int img=-1, selimg=-1;
GetItemImage(m_hDropItem, img, selimg);
int oldimg=-1, oldselimg=-1;
GetItemImage(m_hOldDropItem, oldimg, oldselimg);
if(img != 0 && img != 5)
{
SetCursor(LoadCursor(NULL, IDC_NO));
}
else
{
SetCursor(LoadCursor(NULL, IDC_ARROW));
}
if( m_idTimer && m_hDropItem == m_hOldDropItem )
{
KillTimer( m_idTimer );
m_idTimer = 0;
}
if( !m_idTimer )
m_idTimer = 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);
// highlight it
CString url;
int img=-1, selimg=-1;
GetItemImage(hItem, img, selimg);
if(img != 0 && img != 5)
{
int d = GetItemData(hItem);
if(d>=0)
{
GetURL(m_astrFav[d], url);
}
else
url = "";
}
pMainFrame->SetMessageText(url);
}
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_nTimerID );//auto scroll
KillTimer( m_idTimer); //auto expand
VERIFY (pImageList->DragLeave (GetDesktopWindow ()));
pImageList->EndDrag ();
// stop intercepting all mouse messages
VERIFY (ReleaseCapture ());
delete pImageList;
pImageList = NULL;
m_bDragging = FALSE;
int img, selimg;
GetItemImage(m_hDropItem, img, selimg);
if(img == 0 || img == 5)
{
//copy or move here
//get source path
CString strName;
strName = GetItemText(m_hDragItem);
CString path,szPath;
if(!((CMainFrame*)pMainFrame)->GetFavoriteFolder(szPath))
return ;
GetItemPath(m_hDragItem, path);
/*
HTREEITEM hItem = GetParentItem(m_hDragItem);
HTREEITEM hParent = GetParentItem(hItem);
HTREEITEM hRoot = GetRootItem();
while(hParent !=NULL)
{
path = GetItemText(hItem)+"\\"+path;
hItem = hParent;
hParent = GetParentItem(hParent);
}*/
path = "\\"+path;
path = szPath+ path;
CString source = path+strName+".url";
OFSTRUCT ofs;
if(OpenFile(source, &ofs, OF_EXIST)==HFILE_ERROR)
{
source = path+strName+".lnk";
strName += ".lnk";
}
else
strName += ".url";
//get target
CString strDir = GetItemText(m_hDropItem);
path ="";
GetItemPath(m_hDropItem, path);
HTREEITEM hRoot = GetRootItem();
/*
hItem = GetParentItem(m_hDropItem);
hParent = GetParentItem(hItem);
while(hParent !=NULL)
{
path = GetItemText(hItem)+"\\"+path;
hItem = hParent;
hParent = GetParentItem(hParent);
}*/
path = "\\"+path;
path = szPath+ path;
CString target;
if(m_hDropItem == hRoot)
target = szPath+"\\"+strName;
else
target = path+strDir+"\\"+strName;
if(CopyFile(source, target, TRUE))
{
if(ItemHasChildren(m_hDropItem))
{
GetItemImage(m_hDragItem, img, selimg);
HTREEITEM hnode = InsertItem(strName.Left(strName.GetLength()-4), img, selimg, m_hDropItem, TVI_SORT);
SetItemData(hnode, GetItemData(m_hDragItem));
}
short ks=GetKeyState(VK_CONTROL);
if(ks>=0)
{
//delete original
if(DeleteFile(source))
DeleteItem(m_hDragItem);
}
//update menu
((CMainFrame*)pMainFrame)->m_bFavDirty = TRUE;
}
}
}
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_nTimerID )
{
if( nIDEvent == m_idTimer )
{
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_timerticks
m_timerticks++;
POINT pt;
GetCursorPos( &pt );
CRect rect;
GetClientRect( &rect );
ClientToScreen( &rect );
// NOTE: Screen coordinate is being used because the call
// to DragEnter had used the Desktop window.
CImageList::DragMove(pt);
int iMaxV = GetScrollLimit(SB_VERT);
int iPosV = GetScrollPos(SB_VERT);
// The cursor must not only be SOMEWHERE above/beneath the tree control
// BUT RIGHT above or beneath it
// i.e. the x-coordinates must be those of the control (+/- SCROLL_BORDER)
if ( pt.x < rect.left - SCROLL_BORDER )
; // Too much to the left
else if ( pt.x > rect.right + SCROLL_BORDER )
; // Too much to the right
else if( (pt.y < rect.top + SCROLL_BORDER) && iPosV )
{
hitem = GetFirstVisibleItem();
// We need to scroll up
// Scroll slowly if cursor near the treeview control
int slowscroll = 6 - (rect.top + SCROLL_BORDER - pt.y) / SCROLL_SPEED_ZONE_WIDTH;
if( 0 == ( m_timerticks % (slowscroll > 0? slowscroll : 1) ) )
{
CImageList::DragShowNolock(FALSE);
SendMessage( WM_VSCROLL, SB_LINEUP);
SelectDropTarget(hitem);
m_hDropItem = hitem;
CImageList::DragShowNolock(TRUE);
}
}
else if( (pt.y > rect.bottom - SCROLL_BORDER) && (iPosV!=iMaxV) )
{
// We need to scroll down
// Scroll slowly if cursor near the treeview control
int slowscroll = 6 - (pt.y - rect.bottom + SCROLL_BORDER ) / SCROLL_SPEED_ZONE_WIDTH;
if( 0 == ( m_timerticks % (slowscroll > 0? slowscroll : 1) ) )
{
CImageList::DragShowNolock(FALSE);
SendMessage( WM_VSCROLL, SB_LINEDOWN);
int nCount = GetVisibleCount();
hitem = GetFirstVisibleItem();
for ( int i=0; i<nCount-1; ++i )
hitem = GetNextVisibleItem(hitem);
if( hitem )
SelectDropTarget(hitem);
m_hDropItem = hitem;
CImageList::DragShowNolock(TRUE);
}
}
// The cursor must be in a small zone IN the treecontrol at the left/right
int iPosH = GetScrollPos(SB_HORZ);
int iMaxH = GetScrollLimit(SB_HORZ);
if ( !rect.PtInRect(pt) ) return; // not in TreeCtrl
else if ( (pt.x < rect.left + SCROLL_BORDER) && (iPosH != 0) )
{
// We need to scroll to the left
CImageList::DragShowNolock(FALSE);
SendMessage(WM_HSCROLL, SB_LINELEFT);
CImageList::DragShowNolock(TRUE);
}
else if ( (pt.x > rect.right - SCROLL_BORDER) && (iPosH != iMaxH) )
{
// We need to scroll to the right
CImageList::DragShowNolock(FALSE);
SendMessage(WM_HSCROLL, SB_LINERIGHT);
CImageList::DragShowNolock(TRUE);
}
}
void CFavTreeCtrl::OnDestroy()
{
CTreeCtrl::OnDestroy();
// TODO: Add your message handler code here
CImageList* pImage = GetImageList( TVSIL_NORMAL );
delete pImage;
if( m_idTimer )
{
KillTimer( m_idTimer );
m_idTimer = 0;
}
}
void CFavTreeCtrl::GetItemPath(HTREEITEM hti, CString &path)
{
HTREEITEM hItem = GetParentItem(hti);
HTREEITEM hParent = GetParentItem(hItem);
HTREEITEM hRoot = GetRootItem();
while(hParent !=NULL)
{
path = GetItemText(hItem)+"\\"+path;
hItem = hParent;
hParent = GetParentItem(hParent);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -