2012-10-19 63 views
3

我有一個表格需要坐在另外兩個表格之上。它也應該儘量減少以上兩種形式之一。我發現,這個作品所描述的,當我做Form.Show(null)是什麼意思?

form.Show(null);

然而,如上所述form.Show()不起作用。爲什麼?我意識到我通過一個所有者作爲參數,但所有者爲空。那麼爲什麼表單行爲正確?

回答

10

請注意,Show()是Control類上的方法,而Show(IWin32Window)是Form類上的方法。這是Show(IWin32Window)方法的烘焙行爲 - 如果所有者爲空,則將活動窗口用作所有者。 Control.Show()沒有所有者的概念。您可以通過MS reference源代碼或反編譯器進行確認。

IntPtr hWndActive = UnsafeNativeMethods.GetActiveWindow(); 
IntPtr hWndOwner = owner == null ? hWndActive : Control.GetSafeHandle(owner); 
+2

該死的,你很快.. –

+0

@ P.Brian他只是說,如果你使用'Show(this)'例如,它會顯示新窗口爲當前窗口的*子*。否則,當你使用'Show(null)''Show()'時,它將沒有父窗口。在某些情況下,父窗口很有用,例如,當您希望阻止用戶在顯示子窗口時與父窗口進行交互時。 – 2012-10-19 20:50:13

+0

@Desolator - 這也是我的假設。顯然(從答案中)Show()和Show(null)根本不調用同一個邏輯。 –

2

當您作爲所有者窗口傳遞null時,您強制顯示(所有者)方法重載去尋找所有者本身。它會選擇活動窗口。這通常是你想要的,但並非總是如此。沒有什麼好的理由讓這個幸運輪子旋轉。

我沒有看到「show()不起作用」的部分問題。如果您不帶參數調用Show(),則表單將不會擁有所有者。

+0

我正在運行非託管代碼的第三方應用程序。我想設置爲Parent的窗口在Application.OpenForms中不可用。但是......這個「活動窗口」技巧確實起作用,並且似乎能夠抓取一個非託管窗口作爲父窗口。 –