2012-05-21 3 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

Мне нравится эта идея. –

Смежные вопросы