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

VC++ 實用技巧總結(二):視窗管理、對話框與框架視窗進階

     編輯:VC 教學

(26) 如何以程式碼正確結束應用程式?

最標準的方式是向主視窗發送 WM_CLOSE 訊息,觸發 CWnd::OnClose,讓使用者有機會決定是否儲存資料:

AfxGetMainWnd()->SendMessage(WM_CLOSE);

若需依視窗標題關閉特定應用程式,可封裝輔助函式:

void TerminateWindow(LPCTSTR pszCaption) {
    CWnd* pWnd = CWnd::FindWindow(NULL, pszCaption);
    if (pWnd) pWnd->SendMessage(WM_CLOSE);
}

注意:FindWindow 依賴視窗標題,若標題動態變更(如記事本開啟不同檔案)則失效。更穩健的做法是列舉系統工作清單或使用程序 ID 比對。

(27) 建立與使用無模式對話框的完整流程

MFC 以同一 CDialog 衍生類支援模式與無模式,但生命週期管理截然不同:

  1. 覆寫 OnOK/OnCancel,改呼叫 DestroyWindow() 而非 EndDialog()。
  2. 覆寫 PostNcDestroy 執行 delete this,釋放 C++ 物件(無模式對話框建立函式立即返回,呼叫端無法得知何時刪除)。
  3. 建立時呼叫 Create() 而非 DoModal(),並以 new 配置物件於堆積上。
void CMainFrame::OnSampleDialog() {
    CSampleDialog* pDlg = new CSampleDialog;
    ASSERT_VALID(pDlg);
    BOOL bResult = pDlg->Create(IDD_DIALOG_SAMPLE);
    ASSERT(bResult);
}

void CSampleDialog::OnOK() {
    if (!UpdateData(TRUE)) return;
    DestroyWindow();
}
void CSampleDialog::OnCancel() { DestroyWindow(); }
void CSampleDialog::PostNcDestroy() { delete this; }

(28) 防止主框架視窗標題列自動顯示作用中文件名稱

覆寫 PreCreateWindow,移除 FWS_ADDTOTITLE 風格位:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
    cs.style &= ~FWS_ADDTOTITLE;
    return CMDIFrameWnd::PreCreateWindow(cs);
}

同理,關閉 MDI 子視窗的 FWS_ADDTOTITLE 後,可自行呼叫 SetWindowText 設定自訂標題。

(29) 取得工具列與狀態列指標

MFC 預設以子視窗形式建立,控制 ID 固定:

  • 狀態列:AFX_IDW_STATUS_BAR
  • 工具列:AFX_IDW_TOOLBAR
CStatusBar* pStatus = (CStatusBar*)GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar* pTool = (CToolBar*)GetDescendantWindow(AFX_IDW_TOOLBAR);

取得指標後可動態調整樣式、按鈕、窗格文字等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved