2011-02-24 68 views
7

我正在爲第三方MFC應用程序編寫Win32插件DLL。該DLL需要顯示一個模態對話框。當我使用DialogBox()或其他簡單的Win32 API(例如,我嘗試編寫自己的模式循環)執行此操作時,主應用程序的窗口不會重繪所有元素:它重繪標準元素,但不重繪客戶區。無模式對話框顯示得很好。MFC應用程序和非MFC模式對話框

Screenshot

我懷疑這是因爲MFC並不是真的對Win32感模式對話框。它只能有一個消息循環,並且在DialogBox()中有一個單獨的循環破壞了其精巧的機器。這是解釋這個的a CodeProject article。但是這個CodeProject文章已經9歲了,所以也許事情發生了變化。有人可以對此有所瞭解嗎?該應用程序使用MFC 8(即mfc80.dll)。

更新。這是一個鏈接到original question;它可能包含一些額外的信息。

更新2。感謝大家;我非常感謝所有的建議,它能幫助我全面瞭解事情的整體狀況。我要探索的第一條路徑是使用本機MFC的「模態」對話框。 (由於我是從Python完成的,我將使用MFC的Python綁定,pywin32)。這需要一些時間;準備就緒後,我會更新結果。

+0

+1好問題,我會有興趣看到答案! – 2011-02-24 15:56:33

+0

另請參閱http://stackoverflow.com/questions/5058929其中這個問題是後續(或多或少)。 – 0xC0000022L 2011-02-24 20:28:17

+0

可以請您使用Spy ++(附帶Visual Studio)或其他類似的應用程序(我知道一個可以在http://www.catch22.net/software/winspy找到)來了解「控制檯「窗戶不僅僅是一個小孩窗戶?! – 0xC0000022L 2011-02-24 20:35:02

回答

4

每個線程都可以有一個消息循環。將模態對話框放入單獨的線程中,並通過禁用父窗口來模擬Windows的標準行爲。

編輯:經過一番討論(見下文),看起來父代碼行爲不正確。

不過,我認爲有可能的解決方法。其中一個可以是覆蓋錯誤窗口內容的父窗口(對於模態對話框,但是目前表現不正確的窗口),但是從內存中的DC重繪它以模仿正確的行爲。當然,父窗口仍然必須被禁用。另一種解決方案可能是對父窗口進行子類化,以糾正行爲。由於插件可以在同一個進程中運行,因此實現應該很簡單。

+0

這不太可能工作,因爲此插件是由主機應用程序同步調用的。 – 2011-02-24 19:20:59

+0

@David Heffernan:對,基於原始問題的哪一部分?此外,主機應用程序是否同步調用它並不重要,因爲插件可以在其調用中被寫入以阻塞(如主機應用程序所期望的),直到包含消息循環(並執行所有對話工作)的線程退出。 – 0xC0000022L 2011-02-24 19:39:19

+0

@STATUS基於它必須在主循環中阻止主應用程序無法重繪的事實。 – 2011-02-24 19:42:21