2009-07-07 52 views
1

我創建了一堆表單,並且我想在應用程序關閉/啓動時保存並恢復其位置。Form.visible必須爲true才能讀取.left和.top?

但是,如果窗體不可見,那麼.top.left都是0.只有當它們可見時,纔會使用它們的「真實」值填充這些屬性。

現在我的雜牌是顯示每個窗體,保存信息,然後將其返回到之前的可見狀態:

 int i; 
     bool formVisible; 

     // Show all current forms and form positions in array frmTestPanels 
     i = 0; 
     while (frmTestPanels[i] != null) 
     { 
      formVisible = frmTestPanels[i].Visible; 
      frmTestPanels[i].Visible = true; 
      note(frmTestPanels[i].Text + "(" + frmTestPanels[i].Left.ToString() + ", " + frmTestPanels[i].Top.ToString() + ") visible: " + formVisible.ToString()); 
      frmTestPanels[i].Visible = formVisible; 
      i++; 
     } 
     note(i.ToString() + " forms present"); 

note()是一個簡單的函數,只是顯示的信息。

這當然會導致關閉時閃爍所有不可見的窗體(可能在啓動時也是如此?還沒有到那麼遠......),這是不可取的。

  • 是否有另一種方式來獲取窗體的頂部和左側,當它不可見?
  • 或者,有沒有更好的方式來保存和恢復表單狀態?

回答

1

您需要在窗體上捕捉關閉事件和最小化事件,並在該時間點存儲位置。

當表單被隱藏或最小化時,這些字段無效。

0

當用戶關閉表單而不是應用程序關閉時,如何保存表單位置?

+0

表單永遠不會被用戶關閉 - 這些表單會在應用程序的生命週期中創建並持續存在。當用戶「關閉」表單時,它僅僅將可見屬性設置爲false。在某些情況下,表單從不顯示 - 只有當用戶請求時才顯示。 – 2009-07-07 19:46:42

+0

即使不是關閉它的用戶,您仍然可以在FormClosing事件中保存位置... – 2009-07-07 19:48:40

+0

因此,如果form.visible = false,當窗體關閉時,我可以讀取.top和.left?即使是這種情況,我也會希望在不關閉表單的情況下保存表單狀態。 – 2009-07-07 19:50:09

0

難道你不能只爲每個表單的事件附加一個事件處理程序,並隨時跟蹤它們的位置嗎?無論如何他們的位置只有在他們可見時纔會改變,但這種方式在他們移動時會得到通知。然後,您可以在關閉時將每個表單位置的本地緩存轉儲到磁盤。

雖然我沒有創建表單的適當想法,但我認爲可以將它們顯示在指定的初始位置。畢竟有一個Form.StartupPosition屬性。和Form.Location。根據文件,這應該工作。

+0

單獨跟蹤這些信息是一種選擇,但我希望避免單獨處理這些數據。 – 2009-07-07 19:48:45

1

每當用戶解散/隱藏/關閉/使隱形/致命的窗體,保存其位置。而此時只有。如果用戶擺脫了表格,它一定是在屏幕上,你不必擔心它不可見。

另一方面,不要在用戶第一次要求之前創建表單。當每個表單被創建時,讀取其存儲的位置並相應地進行設置。

有了這個方案,如果一個窗體永遠不會顯示給用戶,它的位置永遠不會被恢復或保存。

0

如果用戶從未看到該表單,則Top和Left不是真的適用,是嗎?由於它們與視覺位置有關,並且沒有視覺位置...

一旦用戶至少顯示了一次窗體,您可以在隱藏它之前將Top和Left捕獲到局部變量中再次,當表單被釋放時使用這些局部變量來存儲位置。然後,您將有一個初始位置,以便下次顯示該表單。

相關問題