⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 类似 windows explorer的工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
    m_pActiveView->OnUpFolder();
}

void CMainFrame::OnActiveListView(CChildView* pChildView)
{
    m_pActiveView = pChildView;
}
// 点击“查看”按钮,在各种查看方式之间切换
void CMainFrame::OnViewFileList() 
{
    int nViewStyle = (int)m_pActiveView->GetViewStyle();
    nViewStyle = (nViewStyle + 1) % 4;
    
    m_pActiveView->ChangeViewStyle((VIEWSTYLE)nViewStyle);
}
void CMainFrame::OnViewBigIcon() 
{
    m_pActiveView->ChangeViewStyle(BIGICON);
}
void CMainFrame::OnViewSmallIcon() 
{
    m_pActiveView->ChangeViewStyle(SMALLICON);
}
void CMainFrame::OnViewlist() 
{
    m_pActiveView->ChangeViewStyle(LIST);
}
void CMainFrame::OnViewDetailInfo() 
{
    m_pActiveView->ChangeViewStyle(DETAILINFO);
}
// 点击工具栏下拉箭头,弹出菜单
void CMainFrame::OnToolbarDropDown(NMTOOLBAR *pnmh,LRESULT *plRes)
{
#define MENUISCHECKED(nView) \
    (m_pActiveView->GetViewStyle() == nView ? MF_CHECKED : MF_UNCHECKED)
    
    CRect rect;
    CMenu menu;
    CMenu* pSubMenu;
    CWnd* pWnd = &m_wndToolBar;
    
    switch (pnmh->iItem)//分析按钮的命令ID
    {
    case ID_VIEW: 
        menu.LoadMenu(IDR_VIEW);
        
        if (menu.GetSafeHmenu() != NULL)
        {
            pSubMenu = menu.GetSubMenu(0);
            
            if (pSubMenu != NULL)
            {
                int nCurrentStyle = m_pActiveView->GetViewStyle();

                pSubMenu->SetDefaultItem(nCurrentStyle, TRUE);
                pSubMenu->CheckMenuItem(ID_BIGICON, MENUISCHECKED(BIGICON));
                pSubMenu->CheckMenuItem(ID_SMALLICON, MENUISCHECKED(SMALLICON));
                pSubMenu->CheckMenuItem(ID_VIEWLIST, MENUISCHECKED(LIST));
                pSubMenu->CheckMenuItem(ID_DETAILLIST, MENUISCHECKED(DETAILINFO));
                
                pWnd->SendMessage(TB_GETRECT,pnmh->iItem,(LPARAM)&rect);
                pWnd->ClientToScreen(&rect);
                pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_VERTICAL,rect.left,rect.bottom,this,&rect);
            }
            
        }
        break;
    default:
        return;
    }
}
void CMainFrame::OnEditPaste() 
{
    UINT uDropEffect = RegisterClipboardFormat(CLIPBOARD_FORMAT);
    UINT nFileCount = 0;
    DWORD dwEffect; // 是什么操作 COPY、MOVE……
    
    if (OpenClipboard()) // 打开剪贴板
    {
        HDROP hDrop = HDROP(GetClipboardData(CF_HDROP));
        
        if (hDrop)
        {
            DWORD *dw = (DWORD*)(GetClipboardData(uDropEffect));
            
            // 操作类型
            if (dw == NULL)
            {
                dwEffect = DROPEFFECT_COPY;
            }
            else
            {
                dwEffect = *dw;
            }
            if (dwEffect == 0)
            {
                CloseClipboard();
                return;
            }
            
            UINT  uOpType;
            
            if (dwEffect & DROPEFFECT_MOVE)
            {
                uOpType = FO_MOVE;
            }
            else if (dwEffect & DROPEFFECT_COPY)
            {
                uOpType = FO_COPY;
            }
            else
            {
                ASSERT(FALSE);
            }
            
            nFileCount = DragQueryFile(hDrop, (UINT) -1, NULL, 0);
            if (nFileCount==0)
            {
#ifdef _DEBUG
                ::MessageBox(NULL,"No File will be Cut/Copy",MAINFORMCAPTION,MB_OK);
#endif //_DEBUG
                return;
            }	
            
            char szFile[ MAX_PATH];
            
            CShellFileOp op;
            op.SetOperationFlags (uOpType, this,
                FOF_FILESONLY | FOF_NOCONFIRMATION |
                FOF_NOCONFIRMMKDIR | FOF_RENAMEONCOLLISION );
            
            op.AddDestFile (m_pActiveView->GetCurrentPath());
            
            for(UINT count = 0; count < nFileCount; count++ )
            {
                DragQueryFile(hDrop, count, szFile, sizeof(szFile));
                //lstrcat(lpBuffer,szFile);
                //lstrcat(lpBuffer,"\r\n");
                op.AddSourceFile(szFile);
            }
            
            BOOL bSuccess;
            BOOL bAPICalled = FALSE;
            bSuccess = op.Go(&bAPICalled);
            
            //m_pActiveView->RefreshFileList();
            // 如果从 1 到 2,则两个都要刷新。//TODO
            m_pWndUp->RefreshFileList();
            m_pWndDown->RefreshFileList();
        }
        CloseClipboard();
    }
}


void CMainFrame::OnEditCut() 
{
    CutOrCopyFiles(FALSE);
}

void CMainFrame::OnEditCopy() 
{
    CutOrCopyFiles(TRUE);
}

void CMainFrame::CutOrCopyFiles(BOOL bCopy)
{
    CString strName;
    vector<CString> vFileNames; // 存储选择的文件名
    
    // 首先将所有选择的文件名保存在 vFileNames 中
    m_pActiveView->GetSelectedFiles(vFileNames);
    int nFileCount = vFileNames.size();
    
    if (nFileCount > 0)
    {
        TCHAR* pszFiles;
        UINT nTotalLen = 0;
        
        pszFiles = new TCHAR[nFileCount * sizeof(TCHAR) * MAX_PATH];
        
        LPTSTR lpBuffer;
        UINT i;
        int nPos = 0;
        
        for(i = 0; i < nFileCount; ++i)
        {
            strName = vFileNames[i];
            const int nSize = strName.GetLength();
            
            lpBuffer = strName.GetBuffer(nSize);
            strcpy(&pszFiles[nPos], lpBuffer);
            
            strName.ReleaseBuffer();
            nPos += nSize + 1;
            nTotalLen += nSize + 1;
        }
        CClipboard::CutOrCopyFiles(pszFiles, nTotalLen, bCopy);
        
        delete[] pszFiles;
        
        m_pActiveView->RefreshFileList();
    }
}

// 删除所选择的文件
void CMainFrame::OnEditDelete() 
{
    CString strName;
    vector<CString> vFileNames; // 存储选择的文件名
    
    // 首先将所有选择的文件名保存在 vFileNames 中
    m_pActiveView->GetSelectedFiles(vFileNames);
    int nFileCount = vFileNames.size();
    
    if (nFileCount > 0)
    {
        UINT i;
        CShellFileOp op;
        
        op.SetProgressDlgTitle(MAINFORMCAPTION);
        op.SetOperationFlags (FO_DELETE, this,
            FOF_FILESONLY | FOF_NOCONFIRMATION |
            FOF_NOCONFIRMMKDIR | FOF_RENAMEONCOLLISION | FOF_ALLOWUNDO);
        
        
        for(i = 0; i < nFileCount; ++i)
        {
            strName = vFileNames[i];
            op.AddSourceFile(strName);
        }    	
        
        BOOL bSuccess;
        BOOL bAPICalled = FALSE;
        bSuccess = op.Go(&bAPICalled);
        
        m_pActiveView->RefreshFileList();
    }
}
// 拖放文件
void CMainFrame::DragFiles(CListCtrl* pSourListCtrl, HWND hWndDest)
{
    ASSERT (pSourListCtrl != NULL);
    ASSERT (hWndDest != NULL);
    
    // 判断源和目的地
    CChildView* pSourChildView;
    CChildView* pDestChildView;
    
    if (pSourListCtrl->m_hWnd == m_pWndUp->m_ListCtrl.m_hWnd)
    {
        pSourChildView = m_pWndUp;
        pDestChildView = m_pWndDown;
    }
    else
    {
        pSourChildView = m_pWndDown;
        pDestChildView = m_pWndUp;
    }
    if (pDestChildView->m_hWnd != ::GetParent(hWndDest))
    {
        return; // 目标窗口不对
    }
    
    // 目标路径
    CString strDestPath = pDestChildView->GetCurrentPath();
    
    if (strDestPath.IsEmpty())
    {
        return;
    }
    
    vector<CString> vFileNames; // 存储选择的文件名
    
    // 首先将所有选择的文件名保存在 vFileNames 中
    pSourChildView->GetSelectedFiles(vFileNames);
    int nFileCount = vFileNames.size();
    
    if (nFileCount <= 0)
    {
        return;
    }    
    
    int i;
    CString strFileName;
    //char* pFileName;
    
    CShellFileOp op;
    
    // 拖放视为复制文件
    op.SetOperationFlags (FO_COPY, this,
        FOF_FILESONLY | FOF_NOCONFIRMATION |
        FOF_NOCONFIRMMKDIR | FOF_RENAMEONCOLLISION );
    
    op.AddDestFile(strDestPath);
    
    for(i = 0; i < nFileCount; ++i)
    {
        strFileName = vFileNames[i];
        op.AddSourceFile(strFileName);
    }
    
    BOOL bSuccess;
    BOOL bAPICalled = FALSE;
    bSuccess = op.Go(&bAPICalled);
    
    if (bSuccess)
    {
        // 刷新 todo 效率
        m_pWndUp->RefreshFileList();
        m_pWndDown->RefreshFileList();
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -