Максимизировать MDI дочернюю форму - PullRequest
8 голосов
/ 07 января 2012

Я работаю над устаревшим приложением WinForms MDI, и у меня возникли проблемы с тем, чтобы дочерние формы вели себя так, как я хочу. Моя цель - максимизировать дочернюю форму всегда (закреплена).

Проблема в том, что даже если я установлю MaximizeBox на false, кнопка максимизации / изменения размера появится в панели инструментов MDIs и позволит пользователю изменить размер (открепить) дочернюю форму. Единственный способ избежать этого - установить ControlBox на false, но затем кнопка закрытия исчезнет (это не то, что я хочу).

Я уже пытался использовать фиксированный FormBorderStyle и максимизировать дочернюю форму при запуске события resize, но ни один из моих подходов не сработал.

Есть ли какое-то сверхсекретное свойство, которое я пропустил или это просто невозможно?

С наилучшими пожеланиями и заранее спасибо

Обновление

Я написал унылый метод (спасибо @rfresia) для обработки моей дочерней формы, он может помочь другим, кто сталкивается с той же проблемой:

//All child forms derive from ChildForm
//Parent MDI Form implementation
//...
private void ShowForm(ChildForm form)
{
    //Check if an instance of the form already exists
    if (Forms.Any(x => x.GetType() == form.GetType()))
    {
        var f = Forms.First(x => x.GetType() == form.GetType());
        f.Focus();
        f.WindowState = FormWindowState.Maximized;
    }
    else
    {
        //Set the necessary properties (any other properties are set to default values)
        form.MdiParent = this;
        form.MaximizeBox = false;
        form.MinimizeBox = false;
        form.WindowState = FormWindowState.Maximized;
        Forms.Add(form);
        form.Forms = Forms;
        form.Show();
        form.Focus();
        //Lets make it nasty (some forms aren't rendered properly otherwise)
        form.WindowState = FormWindowState.Normal;
        form.WindowState = FormWindowState.Maximized;
    }
}
//...

//ChildForm implementation
//...
public List<Form> Forms { get; set; }
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    Forms.RemoveAll(x => x.GetType() == GetType());
}

protected override void OnResize(EventArgs e)
{
    WindowState = FormWindowState.Maximized;
}

Ответы [ 5 ]

15 голосов
/ 02 октября 2012

Проблему было нелегко решить, но я случайно нашел ответ, и он довольно прост; по умолчанию установите для состояния окна дочерней формы значение Normal. Затем убедитесь, что вы сбрасываете состояние окна дочернего окна ПОСЛЕ , когда вызываете метод Show().

Пример:

private void ShowNewForm(object sender, EventArgs e)
{
  Form childForm = new Form();
  childForm.MdiParent = this;
  childForm.Text = "Window " + childFormNumber++;
  childForm.Show();
  childForm.WindowState = FormWindowState.Maximized;
}
13 голосов
/ 07 января 2012

Вы можете переопределить OnResize для каждой дочерней формы, которую вы хотите убедиться, что она не сворачивается.Или создайте BaseForm и наследуйте от него все дочерние формы.

protected override void OnResize(EventArgs e)
{
   this.WindowState = FormWindowState.Maximized;
}

Кроме того, вы можете использовать координаты X, y, но OnResize должно быть достаточно.Поместите это в конструктор дочерней формы:

   this.WindowState = FormWindowState.Maximized;

   Point NewLoc = Screen.FromControl(this).WorkingArea.Location;
   //Modifiy the location so any toolbars & taskbar can be easily accessed.
   NewLoc.X += 1;
   NewLoc.Y += 1;
   this.Location = NewLoc;

   Size NewSize = Screen.FromControl(this).WorkingArea.Size;
   //Modifiy the size so any toolbars & taskbar can be easily accessed.
   NewSize.Height -= 1;
   NewSize.Width -= 1;
   this.Size = NewSize;

   this.MinimumSize = this.Size;
   this.MaximumSize = this.MinimumSize;

Я получил код для X, Y отсюда: http://bytes.com/topic/c-sharp/answers/278649-how-do-i-prevent-form-resizing

4 голосов
/ 14 октября 2016
form1 obj = new form1 ();
obj.MdiParent = MDIGracular.ActiveForm;
obj.StartPosition = FormStartPosition.CenterParent;
obj.WindowState = FormWindowState.Minimized;
obj.Dock = DockStyle.Fill;
obj.Show();
obj.WindowState = FormWindowState.Maximized;
2 голосов
/ 24 сентября 2012

Вот так я преодолел ту же проблему, не могу вспомнить, где я нашел код.

private const int WM_SYSCOMMAND = 0x112;
private const int SC_MINIMIZE = 0xF020;
private const int SC_MAXIMIZE = 0xF030;
private const int SC_CLOSE = 0xF060;
private const int SC_RESTORE = 0xF120;

protected override void WndProc(ref Message msg)
{
  if ((msg.Msg == WM_SYSCOMMAND) && 
    (((int)msg.WParam == SC_MINIMIZE) || ((int)msg.WParam == SC_MAXIMIZE) ||
    ((int)msg.WParam == SC_CLOSE)) || ((int)msg.WParam == SC_RESTORE))
    {
      //do nothing
    } // end if
    else
    {
      base.WndProc(ref msg);
     } // end else
}
0 голосов
/ 01 сентября 2017

В моем приложении я обнаружил, поместил ли я только две эти строки в событие загрузки формы, это сработало.Спасибо sarvjeet за основную идею.+1 для вас

this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Maximized;
...