首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 對話框彈出子對話框並初始化 CListCtrl 的正確做法

     編輯:程式設計綜合問答

在 MFC 中,點擊按鈕以 DoModal() 彈出子對話框時,若子對話框包含 CListCtrl 需初始化欄位,必須實例化子對話框類別而非基類 CDialog,並確保 OnInitDialog() 被正確呼叫。

錯誤代碼

void CMFCPaikeDlg::OnBnClickedOk() {
    CDialogEx::OnOK(); // 這會關閉父對話框!
    CDialog dlg(IDD_DIALOGCLASS); // 錯誤:用基類建立,無法呼叫子類 OnInitDialog
    dlg.DoModal();
}

正確代碼

// 父對話框按鈕處理
void CMFCPaikeDlg::OnBnClickedOk() {
    // 不要呼叫 CDialogEx::OnOK(),除非確要關閉父視窗
    CClassEditDlg dlg; // 使用子對話框實際類別名
    if (dlg.DoModal() == IDOK) {
        // 使用者按確定後的處理
    }
}

// 子對話框類別定義
class CClassEditDlg : public CDialogEx {
    // ...
    CListCtrl m_listCtrl;
    
    virtual BOOL OnInitDialog() {
        CDialogEx::OnInitDialog();
        // 初始化 ListCtrl 欄位
        m_listCtrl.InsertColumn(0, _T("ID"), LVCFMT_CENTER, 80);
        m_listCtrl.InsertColumn(1, _T("Name"), LVCFMT_CENTER, 120);
        // 可在此填充測試資料
        return TRUE;
    }
};

關鍵點總結

  1. 實例化具體子類別:CClassEditDlg dlg; 而非 CDialog dlg(IDD...)。只有具體類別才有 OnInitDialog 覆寫與成員變數 m_listCtrl。
  2. 不要在按鈕處理中呼叫 CDialogEx::OnOK():那會關閉「父對話框」,導致程式流程異常。
  3. 資源 ID 一致:子對話框類別建構子通常傳入 IDD,或在類別向導建立時自動關聯。
  4. DDX_Control 綁定:確保 DoDataExchange 中有 DDX_Control(pDX, IDC_LIST1, m_listCtrl);,否則控制項未綁定,操作會斷言失敗。

進階:模態 vs 模擬對話框

  • DoModal():模態,阻塞父視窗,回傳 IDOK/IDCANCEL。
  • Create(IDD, this) + ShowWindow(SW_SHOW):非模態,父視窗可繼續操作,需自行管理銷毀。

正確實例化子對話框類別並確保 DDX 綁定,是 MFC 子視窗初始化控制項的核心步驟。

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