2012-05-21 35 views
4

這是這樣一個平凡的問題,我想我可以立即修復它,但沒有。 我的表單大小和位置保存在退出時的應用設置中,以便在下次應用運行時進行恢復。如果用戶在最小化時關閉表單,則無法恢復到正常狀態。窗體恢復爲最小化,並單擊任務欄按鈕不執行任何操作。我在FormClosing事件中保存位置和大小,但如果表單最小化,我將保存最小化的大小(160,40)和位置(-32000,-32000),這對於恢復表單完全不正確。我想迫使表單永遠不會恢復到最小化,而是最後正常的大小和位置。不知何故,我必須在表單最小化之前捕獲大小和位置,然後保存,然後在FormClosing中如果表單最小化,則不會保存大小和位置。這可能不是100%清楚,但我希望有人對此有所瞭解。如何還原最小化形式

的FormClosing處理程序:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     Settings.Default.WindowLocation = Location; 
     Settings.Default.WindowSize = Size; 
     Settings.Default.WindowState = WindowState; 
     Settings.Default.Save(); 
    } 

恢復代碼:

private void RestoreWindow() 
    { 
     Location = Settings.Default.WindowLocation; 
     if(Location.X == 0 && Location.Y == 0) 
      StartPosition = FormStartPosition.CenterScreen; 

     Size = Settings.Default.WindowSize; 

     WindowState = FormWindowState.Normal; 

     if(Size.Width > Screen.PrimaryScreen.WorkingArea.Width) 
     { 
      Location = new Point(0, Location.Y); 
      Size = new Size(Screen.PrimaryScreen.WorkingArea.Width, Size.Height); 
     } 

     if(Size.Height > Screen.PrimaryScreen.WorkingArea.Height) 
     { 
      Location = new Point(Location.X, 0); 
      Size = new Size(Size.Width, Screen.PrimaryScreen.WorkingArea.Height); 
     } 
    } 
+0

請發表您的Form_Closing事件處理程序代碼。謝謝。 – Maciej

+0

也看到了這個問題:http://stackoverflow.com/questions/2876240/winforms-finding-the-size-of-a-minimized-form-without-going-to-formwindowstate –

回答

4

你不應該保存Location或表單的Size如果不是在正常狀態:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Normal) { 
    Settings.Default.WindowLocation = Location; 
    Settings.Default.WindowSize = Size; 
    } 
    Settings.Default.WindowState = WindowState; 
    Settings.Default.Save(); 
} 

了還原窗口例程不作完整意義上的。爲什麼要保存位置,如果你是中心的形式?在最小化模式下啓動一個程序是可能不可取的,在這種情況下,我將它默認爲Normal:如果您需要恢復最後正常位置的窗口是

private void RestoreWindow() 
{ 
    this.Location = Settings.Default.WindowLocation; 
    this.Size = Settings.Default.WindowSize; 

    // check for size or location off-screen, etc. 

    if ((FormWindowState)Settings.Default.WindowState == FormWindowState.Minimized) 
    this.WindowState = FormWindowState.Normal; 
    else 
    this.WindowState = Settings.Default.WindowState; 
} 

,那麼你可以使用在OnResizeEnd覆蓋保存設置:

protected override void OnResizeEnd(EventArgs e) { 
    if (this.WindowState == FormWindowState.Normal) { 
    Properties.Settings.Default.Location = this.Location; 
    Properties.Settings.Default.Size = this.Size; 
    } 
    base.OnResizeEnd(e); 
} 

然後你關閉事件就是:

protected override void OnFormClosing(FormClosingEventArgs e) { 
    Properties.Settings.Default.WindowState = this.WindowState; 
    Properties.Settings.Default.Save(); 
    base.OnFormClosing(e); 
} 
+0

同意節約理念。第一次運行程序時,對中是一件非常重要的事情,可以忽略。 –

+0

這完全解決了這個問題,謝謝。 –

1

商店形式的在Form.Resize事件處理程序和Form.Move事件處理程序分別只有當Form.WindowState性能比FormWindowState.Minimized不同的局部變量的大小和位置。然後在FormClosing事件處理程序中將大小和位置變量的內容保存在設置中。

+0

我喜歡這個想法。 –

相關問題