2008-11-07 83 views
3

我使用C++/CLI接口層將C#WPF對話框添加到現有的C++ MFC應用程序。我有事情的工作,除了我有模態的問題。例如:混合MFC和WPF:模態對話框

  1. MFC應用程序顯示使用ShowDialog的WPF對話框。按預期工作。
  2. WPF對話框使用DoModal顯示MFC對話框。 WPF對話框隱藏在基本C++應用程序後面,除非手動更改IsEnabled,否則不會被禁用。不理想,但它的工作原理。
  3. 現在,MFC對話框已關閉。由於某些原因,基礎MFC應用程序已啓用,因爲WPF對話框尚未關閉,所以仍應禁用它。這很糟糕,因爲它現在允許用戶在WPF對話框仍然打開的時候做些瘋狂的事情。

我有一種感覺,如果我可以正確設置父對話框,它會工作得更好。但到目前爲止,我還沒有能夠將MFC對話框的父級設置爲WPF對話框,反之亦然。而且,我甚至不知道這是否能解決問題。

任何想法?

回答

4

打開CDialog時,訣竅是使用WindowsInteropHelper獲取父級WPF對話框的HWND。然後,可以使用CWnd :: Attach將該HWND包裝在CWnd類中以傳遞給CDialog的構造函數。

我遇到的問題是我已經構建了CDialog,但尚未顯示。只有當你的目標子窗口已經有一個有效句柄時才能使用SetParent的各種版本。我不得不在我的CDialog類中編寫一個新函數來設置m_wndParent,這是它最終創建對話框時用作父級的參數。那麼一切都很好!

以某種方式創建MFC對話框中的WPF對話框「正常工作」。這是魔法。

2

當顯示WPF對話框時,您是否使用HwndSource class來包裝WPF窗口?如果是這樣,您可能可以使用WPF窗口::SetParent以及使用HwndSource.Handle屬性來設置子子項的父項。

+0

不,我發現只有當我想將WPF控件嵌入MFC/Win32窗口時,才需要使用HwndSource。這可能是值得一試的......我會添加一個關於我所做嘗試的編輯 – Joe 2008-11-08 04:29:41