Существует ли простой способ определить размер Формы, которую он действительно имеет в 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.
Событие 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);
}
}
попробуйте это
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;
}
}