2009-01-17 108 views
3

我有一個VB.NET MDI WinForms應用程序。我的用戶一直在抱怨窗體蠕變(他們稱之爲窗體),這是每次您在主MDI窗口中打開一個特定窗體的位置,它會在它之前加載的位置的右​​下方打開 - 也就是說它從在窗口的左上方,向下到右下方。MDI窗體'蠕變'(在MDI窗口中的位置改變)

我不得不同意他們,這是非常惱人的,有沒有什麼辦法來防止這種情況?加載形式的代碼是:

frmPurchaseInvoiceSelect.Show() 
frmPurchaseInvoiceSelect.MdiParent = Me 

我可以通過設置形式起步到「手動」位置稍微解決這個問題,但隨後他們就直接在屏幕的左上角彼此的頂部開。

任何其他的SO用戶都會遇到這個問題嗎?

+0

這是每一個應用程序是如何工作的。打開兩個計算器,或兩個記事本,你會看到它。 – Malfist 2009-06-12 20:26:38

回答

0

無論使用什麼語言,原因都是一樣的。當您打開第一個MDI窗口時,相對於MDI框架的起點爲0,0,因此它在框架內左上方打開。如果關閉窗口然後重新打開它,起點不再是0,0,而是基於打開窗口的方式(級聯等)的其他值。通常它會稍微低一點,並且在前一個窗口的右側關閉。問題的存在是因爲您或者工具沒有檢查是否將要打開的窗口是框架內唯一的窗口實例。如果窗口是唯一的實例,請在0,0處打開它,否則在相對於其他窗口的適當位置打開它。

該功能通常由您正在使用的MDI庫處理,或者如果沒有的話,您可以手動對其進行編碼。只需要幾行代碼就可以手動編寫代碼,所以實現起來應該是微不足道的。

3

嘗試

frmPurchaseInvoiceSelect.StartPosition = FromStartPosition.CenterParent

在MDI父的中心始終啓動。

有幾個選項,但它取決於你想從哪裏開始。我還沒有嘗試過,但是:

frmPurchaseInvoiceSelect.Location = windowPoint 
frmPurchaseInvoiceSelect.Size = windowSize 
frmPurchaseInvoiceSelect.StartPosition = FormStartPosition.Manual 

應該在您想要的位置開始窗體。

0

MBoy,

儘管SDI應用程序可能,但MDI應用程序通常不會顯示窗口居中。 在打開多個窗口的MDI應用程序中,用戶通常希望看到每個窗口的邊緣(級聯視圖),以便他/她可以單擊所需的窗口將其置於前面。這通常可以通過2種方式完成。知道有多少個窗口打開以及它們相對於MDI框架的位置。在最後一個窗口的右下方打開後續窗口。此功能通常在使用的語言或庫中提供。第二種方法是選擇(菜單或其他方式)以所需的方向顯示打開的窗口(級聯,平鋪或分層)。正如我之前提到的,如果MDI顯示功能沒有在語言/庫中自動提供,則需要手動編碼。這可以在每個MDI窗口打開但在可見之前調用的函數中完成。

1

請參閱我的question以及由此產生的答案,這可能會很好地幫助您解決此問題。你也可以看看我關於這個主題的非常詳細的blog條目。我的代碼是用Delphi編寫的,但你應該能夠將這些概念傳遞給VB。

1

以下解決這對我 frmUser.StartPosition = FormStartPosition.Manual 重新打開時,它停止「爬行」