2009-08-19 60 views
4

模態對話框我如何編程方式檢測如果我MFC應用程序目前正在顯示一個模式對話框或屬性表?目前我正在使用以下內容,但我覺得代碼也會觸發無模式對話框。檢測在MFC

bool HasModalDialog(const CWnd* pWnd) 
{ 
    const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL; 
    while (pChildWnd) 
    { 
     if (pWnd == pChildWnd->GetTopLevelParent() && 
     (pChildWnd->IsKindOf(RUNTIME_CLASS(CDialog)) || 
     pChildWnd->IsKindOf(RUNTIME_CLASS(CPropertySheet)))) 
     { 
     return true; 
     } 

     pChildWnd = pChildWnd->GetNextWindow(GW_HWNDPREV); 
    } 

    return false; 
} 

用法:

HasModalDialog(AfxGetMainWnd()) 

任何人得到的檢測模態對話框一個替代方式?

+0

我看不到您的代碼實際檢測到模態對話框。如果CDialog或CPropertySheet是「創建」d,那麼它將是非模態的,並且您的代碼仍然會返回true。 – Goz 2009-08-19 12:41:23

+0

@Goz:這是代碼遭受的問題。 – dalle 2009-08-19 13:17:09

回答

3

你試過CWnd::GetLastActivePopup

我沒有測試過這個,看看它是否會爲僅模式對話框工作。


編輯1:根據Raymond ChenGetLastActivePopup應該返回當前活動的模態對話框。

編輯2:也許是另一種方法來檢索當前模式窗口將修改代碼以檢查是否有殘疾父母/所有者 - 模式對話框應該總是disable their owner之前顯示。

0

如果只檢測你的應用程序中的窗口,那麼你可以派生自己的CDialog和CPropertySheet的,把一個簡單的布爾在那裏,跟蹤它是否是模式與否。

bool HasModalDialog(const CWnd* pWnd) 
{ 
    const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL; 
    while (pChildWnd) 
    { 
     if (pWnd == pChildWnd->GetTopLevelParent()) 
     { 
     if (pChildWnd->IsKindOf(RUNTIME_CLASS(CMyDialog)) 
     { 
      return ((CMyDialog*)pChildWnd)->IsModal(); 
     } 

     if (pChildWnd->IsKindOf(RUNTIME_CLASS(CMyPropertySheet)) 
     { 
      return ((CMyPropertySheet*)pChildWnd)->IsModal(); 
     } 
     } 
     pChildWnd = pChildWnd->GetNextWindow(GW_HWNDPREV); 
    } 

    return false; 
} 

必須有另一種方式做到這一點,但是,這是我能想到的把我的頭頂部的唯一途徑。

+0

不幸的是,需要從這些新類派生所有對話框,並且這對MFC中已經存在的對話框類不起作用。 – dalle 2009-08-20 06:42:56

+0

確實不是。你將不得不爲自己製作自己的類包裝器......會是一團糟...... – Goz 2009-08-20 08:04:41

0

我已經嘗試了很多方法來解決這個問題,爲什麼我需要這個,因爲我正在處理聲明所有對話框的指針,以便在heapmemory中分配指針(TDialog * d = new TDialog),這是OWL代碼I把它轉換到MFC我想自動刪除這些指針只有在對話框是模態它是不是在堆中分配的,所以我需要檢查它在我的解決方案很容易覆蓋的DoModal在我的繼承類,並設置一個標誌isModal到如果未使用DoModal顯示,則爲true如果isModal將在構造函數中初始化時仍爲null_ptr