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

MFC 模態對話框接連呼叫 DoModal 失敗原因分析

     編輯:VC 教學

問題現象

CMyApp::InitInstance()
{
    CMyDialog1 dlg1;
    m_pMainWnd = &dlg1;
    int result = dlg1.DoModal(); // 正常

    CMyDialog2 dlg2;
    result = dlg2.DoModal();   // 回傳 -1 失敗
    // 追蹤發現訊息佇列中出現 WM_QUIT
}

根本原因

  1. MFC 要求 m_pMainWnd 指向擁有有效視窗控制代碼的物件。若無效,MFC 會自我發送 WM_QUIT 終止應用程式。
  2. 當 m_pMainWnd 指向 dlg1 時,MFC 視其為主視窗。使用者關閉對話框 1 時,MFC 認為使用者要結束程式,因為主視窗已關閉。
  3. InitInstance() 在第二個 DoModal() 後會返回,而 m_pMainWnd 在精靈生成碼中已被使用,不應如範例般重複指派。

正確做法

  • 若需連續顯示多個模態對話框,不要 將 m_pMainWnd 指向第一個對話框。
  • 建立一個隱藏的主視窗(如 CFrameWnd 或單純 CWnd)作為 m_pMainWnd,再依序呼叫各對話框 DoModal()。
  • 或採用無模態對話框 (Create) 配合訊息迴圈管理。

核心觀念

m_pMainWnd 決定應用程式生命週期。模態對話框關閉時若為主視窗,應用程式即結束。連續多個模態對話框需共用一個持久的主視窗物件。

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