WinForms: нахождение размера минимизированной формы, не идя в FormWindowState. Нормальный

Существует ли простой способ определить размер Формы, которую он действительно имеет в WindowState=Normal, на самом деле не изменяя состояние Формы?

Вот то, что я делаю теперь (код C#):

public class MyForm: Form
{
     public void MyMethod()
     {
          // ...
          FormWindowState oldState = this.WindowState;
          this.WindowState = FormWindowState.Normal;

          Point windowLocation = this.Location;
          Size windowSize = this.Size;

          this.WindowState = oldState;
          //  ...
     }
}

Это - то, на что я хотел бы, чтобы код был похож:

public class MyForm: Form
{
     public void MyMethod()
     {
          // no state change here
          Point windowLocation = this.NormalStateLocation;
          Size windowSize = this.NormalStateSize;
     }
}

На самом деле существуют нет NormalStateLocation или NormalStateSize свойства в Windows Forms.

5
задан Doc Brown 20 May 2010 в 17:24
поделиться

2 ответа

Событие Load - это самый ранний возможный момент, чтобы узнать, каким будет "нормальный" размер формы. В этот момент все масштабирование, вызванное AutoSizeMode, и любые пользовательские переопределения размеров границ и надписей уже применены. Однако этот размер будет действителен только в том случае, если в дизайнере для WindowState не установлено значение Minimized. Вам придется подождать, пока форма хотя бы один раз не будет показана в состоянии Normal.

Также имейте в виду, что размер, который вы получите, будет поддельным, если вы работаете с включенными жирными границами Aero. Vista и Win7 намеренно возвращают размер окна, который был бы сообщен, если бы в более ранних операционных системах была запущена ваша программа. Если это действительно важно, вам придется использовать Editbin.exe, чтобы пометить вашу программу как совместимую с Vista.

Медвежьи ловушки там, постарайтесь избежать необходимости задавать этот вопрос. Вы всегда можете изменить расположение или размер окна, когда получите событие Resize.


Если это нужно только для того, чтобы запомнить расположение и размер формы, тогда вам нужно использовать Настройки. Используйте Project + Properties, вкладку Settings, чтобы добавить их. Вы не можете использовать автоматическую привязку ApplicationSettings, потому что вы не хотите сохранять расположение и размер формы, когда она сворачивается или разворачивается. Пусть это выглядит так:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void OnLoad(EventArgs e) {
        if (Properties.Settings.Default.Form1Size.Width > 0) {  // Valid?
            this.Size = Properties.Settings.Default.Form1Size;
            this.Location = Properties.Settings.Default.Form1Location;
        }
        base.OnLoad(e);
    }
    protected override void OnLocationChanged(EventArgs e) {
        if (this.WindowState == FormWindowState.Normal) 
            Properties.Settings.Default.Form1Location = this.Location;
        base.OnLocationChanged(e);
    }
    protected override void OnResize(EventArgs e) {
        if (this.WindowState == FormWindowState.Normal)
            Properties.Settings.Default.Form1Size = this.Size;
        base.OnResize(e);
    }
    protected override void OnFormClosed(FormClosedEventArgs e) {
        Properties.Settings.Default.Save();
        base.OnFormClosed(e);
    }
}
3
ответ дан 18 December 2019 в 10:42
поделиться

попробуйте это

    private Size _normalSize;
    private Point _location;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.LocationChanged += new EventHandler(Form1_LocationChanged);
        this.SizeChanged += new EventHandler(Form1_SizeChanged);
    }

    void Form1_SizeChanged(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Normal)
        {
            this._normalSize = this.Size;
        }
    }

    void Form1_LocationChanged(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Normal)
        {
            this._location = this.Location;
        }
    }
1
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: