2014-09-05 23 views
1

我有一個表單(父)。另外我還處理來自另一個流程的表單(子)。我需要始終在父窗體上顯示子窗體,並可以使用主窗體。設置所有者從另一個處理形式形成

它的工作原理,當我們致電:

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    private void MainForm_Shown(object sender, EventArgs e) 
    { 
     var childForm = new Form(); 
     childForm.Show(this); 
    } 
} 

而且,如果主窗體關閉,從另一個進程子窗體將繼續工作。

我嘗試使用pinvoke SetParent()函數,但它將子窗體設置爲MDI。

+0

你可以使用childForm.ShowDialog() – Bayeni 2014-09-05 13:35:58

+0

我不行。 hild表單已經打開並處於另一個進程中! – Nikolay 2014-09-05 13:42:12

+1

我回滾了你的編輯。請不要通過編輯現有的問題來提出新的問題。請一次處理一個問題。如果你想問一個新問題,那麼這樣做。 – 2014-09-08 10:20:56

回答

4

致電SetWindowLongPtr通過GWL_HWNDPARENT作爲索引。

SetWindowLongPtr(OwnedWnd, GWL_HWNDPARENT, OwnerWnd); 

您可能需要手動把在z順序所有者窗口的前面擁有窗口,因爲簡單地調用上面的功能不會讓這種情況發生。

+1

這就是SetParent()已經做的事情。 OP想把它變成一個子窗口,WS_CHILD樣式標誌。嗯。 – 2014-09-05 14:01:07

+1

@HansPassant號'SetParent'更改父級。這裏的代碼修改了所有者。不是說MS很容易知道名稱爲「GWL_HWNDPARENT」。但是這只是'CreateWindow'的重載'hWndParent'參數。在我看來,提問者想要修改所有者。這個單詞出現在問題標題中,然後有這個文本*我需要始終在父級*之上顯示子表單,這意味着所有者而不是父級。 – 2014-09-05 14:04:17

+1

@DavidHeffernan。它有幫助,但也有一些問題。當您調用SetWindowLongPtr子窗體從任務欄中消失時。如果您移除她的焦點並再次選擇,它會再次出現在任務欄中。如何使它在調用SetWindowLongPtr時不會從任務欄中消失? 我可以這樣做嗎,這個孩子的形式總是在主窗體的所有打開的子窗體之上? – Nikolay 2014-09-08 06:37:00