首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Visual C++ 進階實戰經驗(下):無模式對話框、外部程式調用、磁碟資訊與自訂刪除樹

     編輯:VC 教學

技巧一:自訂操作提示對話框(無模式、支援動畫/取消)

模仿 Windows 檔案複製/刪除的飛行動畫對話框。

關鍵類別設計 CModel

class CModel : public CDialog {
public:
    CModel(CWnd* pParent = NULL); // 無模式建構函數
    BOOL Create();                // 呼叫 CDialog::Create
    CWnd* m_pParent; int m_nID;
protected:
    virtual void PostNcDestroy() { delete this; CDialog::PostNcDestroy(); }
};

呼叫端管理

// 標頭檔
CModel* m_pDlg = NULL;

// 開啟
if(!m_pDlg) { m_pDlg = new CModel(this); m_pDlg->Create(); GetDlgItem(IDC_BTN)->EnableWindow(FALSE); }
else m_pDlg->SetActiveWindow();

// 關閉
if(m_pDlg) { m_pDlg->DestroyWindow(); m_pDlg = NULL; }

技巧二:以進程方式調用外部程式(以 ARJ 壓縮為例)

優於自寫 DLL:成熟穩定、免維護、命令列參數靈活。

流程

  1. CreateBat() 產生批次檔,內含 ARJ 命令 + DIR > flag.tmp 作完成標記
  2. RunBat() 用 CreateProcess 執行批次檔
  3. OnTimer 輪詢 flag.tmp 存在與否,存在則終止進程、清理

技巧三:取得磁碟機詳細資訊

  • FindDriverInfo():列舉所有磁碟機,篩選軟碟機加入下拉清單
  • EmptyDiskSpace():清空磁碟、取得容量與序號(內部呼叫自訂 DeleteTree)
  • SetVolumeLabel():設定磁碟區標籤(最多 11 字元,不分大小寫)

技巧四:自訂 DeleteTree 遞迴刪除目錄樹

Win32/MFC 均無對應 API,但組合 FindFirstFile/RemoveDirectory/DeleteFile 易於實作,比呼叫外部命令更高效、可控。

BOOL DeleteTree(LPCTSTR path) {
    CFileFind find; BOOL b = find.FindFile(CString(path)+_T("\\*.*"));
    while(b) {
        b = find.FindNextFile();
        if(find.IsDots()) continue;
        if(find.IsDirectory()) DeleteTree(find.GetFilePath());
        else DeleteFile(find.GetFilePath());
    }
    return RemoveDirectory(path);
}

選擇原則

  • 演算法複雜、成熟工具存在(壓縮/解壓、編譯器)→ 呼叫外部進程
  • 邏輯簡單、需緊密整合、效能敏感(刪除樹、磁碟掃描)→ 自寫函式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved