2014-11-05 148 views
2

有沒有一種簡單的方式來無模式顯示對話框,同時保留UI阻止模式對話框提供?如何在無模式對話框中模擬模態對話框UI行爲?

我想在顯示對話框時停止用戶與其他對話框/控件的交互,但讓應用程序繼續運行。有沒有辦法將對話框設置爲「獨佔焦點」或類似的東西? (應用程序主窗口)

+0

你用'EnableWindow(mainWnd,FALSE)'然後'CreateDialog(mainWnd,...)'嘗試過嗎? – rodrigo 2014-11-05 08:57:10

+0

我在MFC工作,但我認爲你的問題轉移 - 但我不知道從對話框啓動的地方獲得'mainWnd'是多麼容易。儘管根據這個提交答案。 – 2014-11-05 09:07:22

+0

那麼,你需要擁有者窗口來創建對話框。或者如果你使用默認的主窗口,只需使用'AfxGetMainWnd()'。我沒有作爲回答發佈,因爲我不知道它是否會工作或看起來很奇怪,只是一個想法... – rodrigo 2014-11-05 09:15:43

回答

2

不,沒有簡單的方法去做你想做的事。

如果你真的想走你描述的路線,我建議先閱讀Raymond Chen的博客上的整個'模態'系列。第一批在http://blogs.msdn.com/b/oldnewthing/archive/2005/02/18/376080.aspx

但是,這似乎是XY問題的一個實例。你試圖做什麼?獲取主應用程序以不斷更新自身?如果是這樣,我認爲(用我們提供的信息)調用AfxPumpMessage()將做你想做的。或者你想繼續處理主應用程序中的數據?然後你可以通過使用工作者線程爲自己節省一個傷害的世界。

1

未經檢驗的,但你可以嘗試做禁用所有者窗口,創建一個無模式對話框,然後在對話框關閉,重新啓用它:

要禁用主窗口:

AfxGetMainWnd()->EnableWindow(FALSE); 

要創建模式/非阻塞對話框:

dlg->Create(resId) 

並再次啓用它,在OnClose事件,或類似:

AfxGetMainWnd()->EnableWindow(TRUE); 

在我不知道的模式對話框中可能有其他細節。如果您願意調查,請閱讀MFC的CDialog::DoModal()的源代碼。如果我沒有記錯的話,這個MFC函數使用無模Win32 API CreateDialog*()來模擬一個模態阻塞對話框,以實現全局加速器,鉤子,消息等等。

+0

我認爲這基本上是_is_同樣的解決方案陳在博客Roel提供的鏈接(Old New Thing,Modality Part 1)中提供。 – 2014-11-06 09:03:11

-1

這裏可以回答你的問題:

您可以禁用應用程序中的所有其他控件,然後在對話框完成後重新啓用它們。

使用此回調

BOOL CALLBACK EnableDisableAllChildren (HWND hwnd, LPARAM lp) 
{ 
    ::EnableWindow (hwnd, (BOOL)lp); 

    return TRUE; 
} 

通過調用

EnumChildWindows (HWNDToYourApp, EnableDisableAllChildren, true); 

待辦事項Modaless對話框

EnumChildWindows (HWNDToYourApp, EnableDisableAllChildren, false); 

不同的東西來思考。

+0

當對話框管理器關閉對話框時,它將輸入焦點傳送到適當的窗口。潛在的候選人必須啓用。由於應用程序的所有子窗口在對話框關閉時仍然處於禁用狀態,因此您只需吹走最後一次重新獲得輸入焦點的機會。此應用程序不會公開可用的鍵盤接口。 – IInspectable 2014-11-06 19:17:51

+0

@IInspectable他可以在對話框本身的禁用和啓用 – 2014-11-07 00:41:27

+0

我對發佈的解決方案發表評論。如果它附帶一個免責聲明,「*必須修正以使其可行」*,則它不能成爲解決方案。雖然這個缺陷可以解決,但它不是唯一的:在對話框關閉時無條件地啓用所有子窗口也將啓用最初禁用的窗口,或者由於用戶與對話的交互而被禁用的窗口。解決方案變成了一個難題。 – IInspectable 2014-11-07 10:45:15