2010-10-14 18 views
4

可以在窗口可見後切換窗口模式與非模態窗口嗎?將窗口設置爲可見模式後

這就是我需要的......調用傳遞窗口句柄的方法,並設置是否希望它是模態的。

如果可能的話,任何樣品都會有很大幫助!

.net,C++等

謝謝!編輯: 爲什麼? 在這種情況下,我使用TWAIN掃描圖像,並且「某些」數據源不會將其對話框顯示爲模式,即使我將其設置爲此模式,並且如果它不是模態,用戶可能會混淆背景窗口...

回答

0

你不能用標準的WinAPI來做到這一點,而且我確信你不能用.NET框架來做到這一點。您可以通過創建您自己的消息泵例程來僞造它,該例程在從非模態切換到模態時被調用。 但是,這聽起來像是對錯誤問題的回答。你能否澄清爲什麼你需要它在模態和非模態之間切換?

0

對於.NET Framework,我知道沒有辦法實現這樣的行爲。您在.NET中創建非模態或模態表單的方式是分別通過Form.Show()Form.ShowDialog()方法顯示它。

我不明白你需要展示它非模態的事實,然後使它成爲模態。你試圖完成什麼?也許進一步的細節可以幫助我們幫助你,或者找到另一種方式來幫助你找到更好的解決方案,我希望。

0

我想知道爲什麼OP問這個問題,但它讓我思考。我有一些可能是尋找答案的開始。

我創建了兩種形式:Form1和Form2。 Form1有一個按鈕; Form2有一個文本框。

我試圖Form1的以下代碼:

private void button_Click(object sender, EventArgs e) 
    { 
     form2.Show(this);    
     System.Threading.Thread thread = new System.Threading.Thread(showModal); 
     thread.Start(); 
    }   

    private void showModal() 
    { 
     System.Threading.Thread.Sleep(2000); 
     form2.Visible = false; 
     form2.ShowDialog(this); 
    } 

當Form1中的按鈕被點擊時,它顯示窗體2作爲一個非模態對話框;它等待兩秒鐘;然後隱藏Form2,然後將其顯示爲模式框。如果在切換之前在Form2的文本框中鍵入,則文本將被保留。但是,當我點擊Form2右上角的x時,我無法關閉它。由於它是模式,我必須通過任務管理器停止程序來終止程序。

2

窗口模態主要由窗口句柄所有權驅動。禁用父窗口並設置本地消息循環是次要僞像。

將模式窗口句柄的所有者設置爲應用程序主窗口會創建單擊主窗口時將焦點發送到模態子窗口的行爲。如果沒有正確設置所有者,可以在顯示「模式」窗口時關注主窗口,這不是模態行爲。

我似乎隱約記得,您還需要禁用所有者窗口,以防止在模態窗口處於活動狀態時單擊按鈕或在所有者窗口上選擇菜單中的鼠標單擊。

模態窗口通常也與本地消息循環相關聯,但這與窗口的模態UI行爲以及與執行代碼的模態狀態有關的一切無關。在Form.ShowDialog()內部運行一個本地消息循環使得該函數調用與模態窗口生存期同步 - 它阻止該函數返回調用者,直到模態窗口關閉。

當創建子窗口句柄時,設置窗口句柄的所有者只能是一個。子窗口句柄存在後,所有者不能更改。請參閱MSDN上的Owned Windows

因此,您不能簡單地翻轉開關並製作非模態窗口模式。

最好的辦法是摧毀窗戶把手,並與所需的所有者重新創建它。這可以在很少或沒有屏幕閃爍的情況下完成,但更大的問題是保留窗口上的子控件的任何本地狀態(編輯框中的文本,複選框狀態等)。銷燬窗口將丟失子窗口中的任何狀態信息,因此您需要確保首先提取所有狀態,然後重新創建窗口句柄,然後再恢復子窗口數據。