- 題名: Properties.Settingsでのフォーム状態保存で、挙動不審
- 日時: 2006/09/08 8:54:43
- ID: 17479
- この記事の返信元:
- (なし)
- この記事への返信:
- [17480] Re[1]: Properties.Settingsでのフォーム状態保存で、挙動不審2006/09/08 10:56:57
- ツリーを表示
■No17483に返信(takoさんの記事)
> 設定ファイルかレジストリあたりに保存するように自力でどうにかしたいと思います。せっかく便利そうな機能なのに残念です。
Settings が使用できないのは残念ですから次のようなコードを書きました。
最大化、最小化から元の大きさに戻す時、一旦戻った後で再度フォームのLocation, Sizeを指定する。これで一応上手く動いています。
しかし、実験ですので、実際にフォームに色々なコントロールが配置された場合のレスポンスなどを検証することが必要です。
private Rectangle fmrect; //Normal時のFormの位置とサイズ
private bool fone = false; //最大化、最小化でtrue にセット
private void Form1_Load(object sender, EventArgs e)
{
fmrect = new Rectangle(this.Location, this.Size);
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
fmrect = new Rectangle(this.Location, this.Size);
}
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Normal)
{
if (fone) //最大化、最小化の次の元の大きさのとき1回だけ通過する
{
Application.Idle += new EventHandler(FormSizeNormal);
fone = false;
}
}
else
fone = true;
}
//システムがアイドルになれば元の位置、サイズにフォームを変更する
protected void FormSizeNormal(object sender, EventArgs e)
{
Application.Idle -= this.FormSizeNormal;
this.Bounds = new Rectangle(fmrect.Location, fmrect.Size);
fone = false;
}
//次回起動時のために今回終了時のフォームの位置、サイズをディスクに保存
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.Save();
}
■No17500に返信(エツさんの記事)
> ■No17498に返信(エツさんの記事)
多分これで大丈夫と思います。
private Rectangle fmrect; //Normal時のFormの位置とサイズ
private bool fone = false; //最大化、最小化でtrue にセット
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Normal)
{
if (fone) //最大化、最小化の次の元の大きさのとき1回だけ通過する
{
Application.Idle += new EventHandler(FormSizeNormal);
fone = false;
}
}
else
{
if (!fone)
fmrect = new Rectangle(this.RestoreBounds.Location, this.RestoreBounds.Size);
fone = true;
}
}
//システムがアイドルになれば元の位置、サイズにフォームを変更する
protected void FormSizeNormal(object sender, EventArgs e)
{
fone = false;
Application.Idle -= this.FormSizeNormal;
this.Bounds = new Rectangle(fmrect.Location, fmrect.Size);
}
//次回起動時のために今回終了時のフォームの位置、サイズをディスクに保存
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.Save();
}
分類:[.NET]
Windowsアプリケーションの位置やサイズを保存するには?[2.0のみ、C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/438winsettings/winsettings.html
を参考に
PropertyBindingのLocationとClientSizeを保存設定にし、
Form_Closingに
Properties.Settings.Default.Save();
を追加しました。
一見すると正しく動いているようにみえます。Formの位置も大きさも復元します。
しかし、このフォーム、WindowStateを変化させると、挙動がおかしくなります。
たとえば、起動後にフォームを最小化しすぐもとに戻すと、フォームのサイズが超縮小状態になります。
フォームを最大化してすぐもとに戻すと、今度はフォームのサイズが勝手に巨大化します。
自分のどのプログラムでも、同じ現象になるのですが、原因がわかりません。
たぶんどっかのやり方が間違っているのかもしれませんが、どのHPを検索しても同じやり方がかいてあります。
もしかして、VisualStudioのバグ??
環境はMicrosoft Visual C# 2005 Express Editionを使用して、WindowsXP、.NET2.0を使用しております。