📄 mainfrm.cpp
字号:
{
CString folder = GetLocalPane2()->GetLocalFolder();
GetLocalPane2()->SetLocalFolder(folder);
GetLocalPane()->GetTreeCtrl()->DisplayTree(NULL, FALSE);
GetLocalPane()->GetTreeCtrl()->SetSelPath(folder);
}
}
void CMainFrame::OnToolbarReconnect()
{
if (m_pCommandQueue->IsBusy() || m_pCommandQueue->IsConnected())
return;
t_server server;
CServerPath path;
if (m_pCommandQueue->GetLastServer(server, path))
{
m_pCommandQueue->Connect(server);
if (path.IsEmpty())
m_pCommandQueue->List(FZ_LIST_USECACHE,TRUE);
else
m_pCommandQueue->List(path,FZ_LIST_USECACHE,TRUE);
}
}
void CMainFrame::OnUpdateToolbarReconnect(CCmdUI* pCmdUI)
{
BOOL enable=FALSE;
if (m_pCommandQueue->IsConnected() || m_pCommandQueue->IsBusy())
pCmdUI->Enable(FALSE);
else
{
CString host,user,pass;
int port;
host=COptions::GetOption(OPTION_LASTSERVERHOST);
port=COptions::GetOptionVal(OPTION_LASTSERVERPORT);
user=COptions::GetOption(OPTION_LASTSERVERUSER);
//pass=crypt.decrypt(COptions::GetOption(OPTION_LASTSERVERPASS));
if ((host!="")&&(port!=0))//&&(user!=""))
enable=TRUE;
pCmdUI->Enable(enable);
}
}
CImageList* CMainFrame::CreateDragImageEx(CListCtrl *pList, LPPOINT lpPoint)
{
if (pList->GetSelectedCount() <= 0)
return NULL; // no row selected
DWORD dwStyle = GetWindowLong(pList->m_hWnd, GWL_STYLE) & LVS_TYPEMASK;
CRect rectComplete(0, 0, 0, 0);
// Determine List Control Client width size
CRect rectClient;
pList->GetClientRect(rectClient);
int nWidth = rectClient.Width() + 50;
// Start and Stop index in view area
int nIndex = pList->GetTopIndex() - 1;
int nBottomIndex = pList->GetTopIndex() + pList->GetCountPerPage();
if (nBottomIndex > (pList->GetItemCount() - 1))
nBottomIndex = pList->GetItemCount() - 1;
// Determine the size of the drag image (limited for rows visibled and client width)
while ((nIndex = pList->GetNextItem(nIndex, LVNI_SELECTED)) != -1)
{
if (nIndex > nBottomIndex)
break;
CRect rectItem;
pList->GetItemRect(nIndex, rectItem, LVIR_BOUNDS);
if (rectItem.left < 0)
rectItem.left = 0;
if (rectItem.right > nWidth)
rectItem.right = nWidth;
rectComplete.UnionRect(rectComplete, rectItem);
}
// Create memory device context
CClientDC dcClient(this);
CDC dcMem;
CBitmap Bitmap;
if (!dcMem.CreateCompatibleDC(&dcClient))
return NULL;
if (!Bitmap.CreateCompatibleBitmap(&dcClient, rectComplete.Width(), rectComplete.Height()))
return NULL;
CBitmap *pOldMemDCBitmap = dcMem.SelectObject(&Bitmap);
// Use green as mask color
dcMem.FillSolidRect(0, 0, rectComplete.Width(), rectComplete.Height(), RGB(0,255,0));
// Don't use antialiased font for the dragimages
CFont *pFont = pList->GetFont();
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfQuality = NONANTIALIASED_QUALITY;
CFont newFont;
newFont.CreateFontIndirect(&lf);
CFont *oldFont = dcMem.SelectObject(&newFont);
// Paint each DragImage in the DC
nIndex = pList->GetTopIndex() - 1;
while ((nIndex = pList->GetNextItem(nIndex, LVNI_SELECTED)) != -1)
{
if (nIndex > nBottomIndex)
break;
TCHAR buffer[1000];
LVITEM item = {0};
item.mask = LVIF_TEXT | LVIF_IMAGE;
item.iItem = nIndex;
item.pszText = buffer;
item.cchTextMax = 999;
pList->GetItem(&item);
// Draw the icon
CImageList* pSingleImageList = pList->GetImageList((dwStyle == LVS_ICON)?LVSIL_NORMAL:LVSIL_SMALL);
if (pSingleImageList)
{
CRect rectIcon;
pList->GetItemRect(nIndex, rectIcon, LVIR_ICON);
IMAGEINFO info;
pSingleImageList->GetImageInfo(item.iImage, &info);
CPoint p((rectIcon.left - rectComplete.left + rectIcon.right - rectComplete.left) / 2 - (info.rcImage.right - info.rcImage.left) / 2,
(rectIcon.top - rectComplete.top + rectIcon.bottom - rectComplete.top) / 2 - (info.rcImage.bottom - info.rcImage.top) / 2 + ((dwStyle == LVS_ICON)?2:0));
pSingleImageList->Draw( &dcMem, item.iImage,
p,
ILD_TRANSPARENT);
}
// Draw the text
CString text;
text = item.pszText;
CRect textRect;
pList->GetItemRect( nIndex, textRect, LVIR_LABEL );
textRect.top -= rectComplete.top - 2;
textRect.bottom -= rectComplete.top + 1;
textRect.left -= rectComplete.left - 2;
textRect.right -= rectComplete.left;
DWORD flags = DT_END_ELLIPSIS | DT_MODIFYSTRING;
if (dwStyle == LVS_ICON)
flags |= DT_CENTER | DT_WORDBREAK;
dcMem.DrawText(text, -1, textRect, flags);
}
dcMem.SelectObject(oldFont);
dcMem.SelectObject(pOldMemDCBitmap);
// Create drag image(list)
CImageList* pCompleteImageList = new CImageList;
pCompleteImageList->Create(rectComplete.Width(), rectComplete.Height(), ILC_COLOR32 | ILC_MASK, 0, 1);
pCompleteImageList->Add(&Bitmap, RGB(0, 255, 0)); // Green is used as mask color
Bitmap.DeleteObject();
if (lpPoint)
{
lpPoint->x = rectComplete.left;
lpPoint->y = rectComplete.top;
}
return pCompleteImageList;
}
CImageList* CMainFrame::CreateDragImageEx(CTreeCtrl *pTree, LPPOINT lpPoint)
{
HTREEITEM hItem;
if (pTree == GetLocalPane()->GetTreeCtrl())
hItem = reinterpret_cast<CDirTreeCtrl *>(pTree)->m_hDragSource;
else
hItem = reinterpret_cast<CFtpTreeCtrl *>(pTree)->m_hDragSource;
if (!hItem)
return NULL; // no row selected
CRect rectComplete(0, 0, 0, 0);
// Determine List Control Client width size
CRect rectClient;
pTree->GetClientRect(rectClient);
int nWidth = rectClient.Width();
CRect rectItem;
pTree->GetItemRect(hItem, rectItem, FALSE);
if (rectItem.left < 0)
rectItem.left = 0;
if (rectItem.right > (nWidth + 50))
rectItem.right = nWidth + 50;
rectComplete.UnionRect(rectComplete, rectItem);
// Create memory device context
CClientDC dcClient(this);
CDC dcMem;
CBitmap Bitmap;
if (!dcMem.CreateCompatibleDC(&dcClient))
return NULL;
if (!Bitmap.CreateCompatibleBitmap(&dcClient, rectComplete.Width(), rectComplete.Height()))
return NULL;
CBitmap *pOldMemDCBitmap = dcMem.SelectObject(&Bitmap);
// Use green as mask color
dcMem.FillSolidRect(0, 0, rectComplete.Width(), rectComplete.Height(), RGB(0,255,0));
// Don't use antialiased font for the dragimages
CFont *pFont = pTree->GetFont();
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfQuality = NONANTIALIASED_QUALITY;
CFont newFont;
newFont.CreateFontIndirect(&lf);
CFont *oldFont = dcMem.SelectObject(&newFont);
TCHAR buffer[1000];
TVITEM tvItem = {0};
tvItem.mask = TVIF_TEXT | TVIF_IMAGE;
tvItem.hItem = hItem;
tvItem.pszText = buffer;
tvItem.cchTextMax = 999;
pTree->GetItem(&tvItem);
// Draw the icon
CImageList* pSingleImageList = pTree->GetImageList(TVSIL_NORMAL);
if (pSingleImageList)
{
CRect rectIcon;
pTree->GetItemRect(hItem, rectIcon, true);
IMAGEINFO info;
pSingleImageList->GetImageInfo(tvItem.iImage, &info);
CPoint p(rectIcon.left - rectComplete.left - (info.rcImage.right - info.rcImage.left) - 3,
rectIcon.top - rectComplete.top);
pSingleImageList->Draw( &dcMem, tvItem.iImage,
p,
ILD_TRANSPARENT);
}
// Draw the text
CString text;
text = tvItem.pszText;
CRect textRect;
pTree->GetItemRect(hItem, textRect, true);
textRect.top -= rectComplete.top - 2;
textRect.bottom -= rectComplete.top + 1;
textRect.left -= rectComplete.left - 2;
textRect.right -= rectComplete.left;
DWORD flags = DT_END_ELLIPSIS | DT_MODIFYSTRING;
dcMem.DrawText(text, -1, textRect, flags);
dcMem.SelectObject(oldFont);
dcMem.SelectObject(pOldMemDCBitmap);
// Create drag image(list)
CImageList* pCompleteImageList = new CImageList;
pCompleteImageList->Create(rectComplete.Width(), rectComplete.Height(), ILC_COLOR32 | ILC_MASK, 0, 1);
pCompleteImageList->Add(&Bitmap, RGB(0, 255, 0)); // Green is used as mask color
Bitmap.DeleteObject();
if (lpPoint)
{
lpPoint->x = rectComplete.left;
lpPoint->y = rectComplete.top;
}
return pCompleteImageList;
}
void CMainFrame::OnBegindrag(CWnd *pDragWnd, CPoint point)
{
POINT pt = {0};
if (pDragWnd == GetLocalPane2()->GetListCtrl() ||
pDragWnd == GetFtpPane()->GetListCtrl())
{
if (reinterpret_cast<CListCtrl *>(pDragWnd)->GetSelectedCount() <= 0)
return; // No row selected
m_pDragImage = CreateDragImageEx(reinterpret_cast<CListCtrl *>(pDragWnd), &pt);
}
else
{
if (!reinterpret_cast<CTreeCtrl *>(pDragWnd)->GetSelectedItem())
return; // No item selected
m_pDragImage = CreateDragImageEx(reinterpret_cast<CTreeCtrl *>(pDragWnd), &pt);
}
if (m_pDragImage == NULL)
return;
m_pDragWnd = pDragWnd;
CPoint ptStart = point;
ptStart -= pt;
m_pDragImage->BeginDrag(0, ptStart);
CRect rect;
::GetWindowRect(pDragWnd->m_hWnd, &rect);
CPoint pt2 = point;
pt2.Offset(rect.left+8, rect.top+8);
m_pDragImage->DragEnter(NULL, pt2);
SetCapture();
}
void CMainFrame::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_pDragImage && m_pDragWnd) // In Drag&Drop mode ?
{
CPoint ptDropPoint(point);
ClientToScreen(&ptDropPoint);
CWnd* pDropWnd = CWnd::WindowFromPoint(ptDropPoint);
m_pDragImage->DragMove(ptDropPoint);
if (m_pDragWnd == GetFtpTreePane()->GetTreeCtrl() &&
pDropWnd != GetFtpTreePane()->GetTreeCtrl() &&
pDropWnd != GetFtpPane()->GetListCtrl())
{
SetCursor(m_hcNo);
reinterpret_cast<CFtpTreeCtrl *>(GetFtpTreePane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CFtpListCtrl *>(GetFtpPane()->GetListCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CDirTreeCtrl *>(GetLocalPane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CLocalFileListCtrl *>(GetLocalPane2()->GetListCtrl())->DragLeave(m_pDragImage);
}
else if (pDropWnd == GetQueuePane()->GetListCtrl())
{
SetCursor(m_hcArrow);
reinterpret_cast<CFtpTreeCtrl *>(GetFtpTreePane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CFtpListCtrl *>(GetFtpPane()->GetListCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CDirTreeCtrl *>(GetLocalPane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CLocalFileListCtrl *>(GetLocalPane2()->GetListCtrl())->DragLeave(m_pDragImage);
}
else if (pDropWnd == GetLocalPane2()->GetListCtrl())
{
if (reinterpret_cast<CLocalFileListCtrl *>(GetLocalPane2()->GetListCtrl())->DragPosition(m_pDragImage, m_pDragWnd, ptDropPoint))
SetCursor(m_hcArrow);
else
SetCursor(m_hcNo);
reinterpret_cast<CFtpListCtrl *>(GetFtpPane()->GetListCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CFtpTreeCtrl *>(GetFtpTreePane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CDirTreeCtrl *>(GetLocalPane()->GetTreeCtrl())->DragLeave(m_pDragImage);
}
else if (pDropWnd == GetFtpPane()->GetListCtrl())
{
if (reinterpret_cast<CFtpListCtrl *>(GetFtpPane()->GetListCtrl())->DragPosition(m_pDragImage, m_pDragWnd, ptDropPoint))
SetCursor(m_hcArrow);
else
SetCursor(m_hcNo);
reinterpret_cast<CFtpTreeCtrl *>(GetFtpTreePane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CDirTreeCtrl *>(GetLocalPane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CLocalFileListCtrl *>(GetLocalPane2()->GetListCtrl())->DragLeave(m_pDragImage);
}
else if (pDropWnd == GetFtpTreePane()->GetTreeCtrl())
{
if (reinterpret_cast<CFtpTreeCtrl *>(GetFtpTreePane()->GetTreeCtrl())->DragPosition(m_pDragImage, m_pDragWnd, ptDropPoint))
SetCursor(m_hcArrow);
else
SetCursor(m_hcNo);
reinterpret_cast<CFtpListCtrl *>(GetFtpPane()->GetListCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CDirTreeCtrl *>(GetLocalPane()->GetTreeCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CLocalFileListCtrl *>(GetLocalPane2()->GetListCtrl())->DragLeave(m_pDragImage);
}
else if (pDropWnd == GetLocalPane()->GetTreeCtrl())
{
if (reinterpret_cast<CDirTreeCtrl *>(GetLocalPane()->GetTreeCtrl())->DragPosition(m_pDragImage, m_pDragWnd, ptDropPoint))
SetCursor(m_hcArrow);
else
SetCursor(m_hcNo);
reinterpret_cast<CFtpListCtrl *>(GetFtpPane()->GetListCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CLocalFileListCtrl *>(GetLocalPane2()->GetListCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CFtpTreeCtrl *>(GetFtpTreePane()->GetTreeCtrl())->DragLeave(m_pDragImage);
}
else
{
reinterpret_cast<CFtpListCtrl *>(GetFtpPane()->GetListCtrl())->DragLeave(m_pDragImage);
reinterpret_cast<CFtpTreeCtrl *>(GetFtpTreePane()->GetTreeCtrl(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -