簡體   English   中英

最大化MDI子表單

[英]Maximize MDI child form

我正在研究一個傳統的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;
}

這個問題不容易解決,但我偶然發現了答案,而且很簡單; 默認情況下,將子窗體的windowstate設置為Normal。 然后確保在調用Show()方法重置子窗口的windowstate。

例:

private void ShowNewForm(object sender, EventArgs e)
{
  Form childForm = new Form();
  childForm.MdiParent = this;
  childForm.Text = "Window " + childFormNumber++;
  childForm.Show();
  childForm.WindowState = FormWindowState.Maximized;
}

您可以覆蓋要確保不會最小化的每個子表單的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

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;

這就是我如何克服同樣的問題,不記得我在哪里找到了代碼。

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
}

在我的應用程序中,我發現如果我只將這兩行放在它運行的表單加載事件中。 感謝sarvjeet的基本想法。 為你+1

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM