2009-05-13 2 views
1

FormBorderStyle = FixedToolWindowで単純なテストフォームを作成し、マウスを押すとFixedToolWindowとSizableToolWindowの間で切り替わるボタンが追加されました。FixedとSizableの間のFormBorderStyleでの奇妙な動作

これらの2つの間でFormBorderStyleを切り替えると、私のアプリケーションに多くの問題を引き起こす不思議な効果が生じるようです。問題は、ウィンドウがサイズが変わっているように見えることができないことです。私はちょうど境界を変更したい、私は同じままにするために、フォームのサイズが必要です。

private void button1_Click(object sender, System.EventArgs e) { 
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) { 
     System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE"); 
     FormBorderStyle = FormBorderStyle.SizableToolWindow; 
    } else { 
     System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED"); 
     FormBorderStyle = FormBorderStyle.FixedToolWindow; 
    } 
} 

そして、私はこの使用をデバッグする:私は、スイッチボタンを押したときに

private void Settings_SizeChanged(object sender, System.EventArgs e) { 
    System.Diagnostics.Debug.WriteLine(this.Size); 
} 

そして、ここでは出力です:

SWITCHING: FIXED -> SIZABLE 
{Width=373, Height=169} 
{Width=383, Height=179} 
SWITCHING: SIZABLE -> FIXED 
{Width=383, Height=179} 
{Width=373, Height=169} 

例えば、ここでボタンのコードです

この現象を修正するにはどうすればよいですか?そして、 "修正"することによって、可能ならば、これが起こらないようにすることを意味します。私は私のフォームのサイズを指定することができるようにしたいと思います。

また、Formクラスのサブクラス化による解決策は、このような方法でこの問題を解決するためのアイデアがあれば誰にとっても最適な解決策になります。

編集:
問題を示すために少しビデオを作成しました。最初のテストでは、フォームのサイズが実際には変更されず(視覚的に)、フォームの位置のみが少し変化します。デバッグ出力に見られるように、Sizeプロパティの値は変更されます。 2番目のテストでは、Sizeプロパティの値が変更され、ウィンドウサイズ自体も変更されるというデバッグ出力が表示されます。

こちらをご覧ください:
http://screencast.com/t/0vT1vCoyx2u

答えて

2

をあなたの問題は、場所の変更、ないサイズです。このコードは、ビデオに見られる問題を解決します。

 private void Form1_DoubleClick(object sender, EventArgs e) 
     { 
      Point _location = this.PointToScreen(this.ClientRectangle.Location); 
      if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow) 
      { 
       this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
      } 
      else 
      { 
       this.FormBorderStyle = FormBorderStyle.SizableToolWindow; 
      } 
      Point _newloc = this.PointToScreen(this.ClientRectangle.Location); 
      Size _diff = new Size(_newloc) - new Size(_location); 
      this.Location -= _diff; 
     } 

これらの2つの境界線を切り替えるときに表示されるレンダリングされたフォームの問題は、DWMのバグです。

+0

ありがとうございますが、これは実際に私の全面的な問題を解決するのに役立ちません。だからこそ私はもう一つの質問を作りました。それはもっと関連しているからです。興味があれば、私がそこに残したコメントをチェックしてください。私はこれが将来的に当てはまると思うなら、この答えを正しいもの(この質問のために)としてマークします。当分の間、それはもはや関連性がありません。 –

+0

あなたはこの問題を無視してあなたの新しいものに注意を払うだけでなく、これが*解決しないことを詳しく解説できますか? (リファクタリングが可能なときは、最初から書き直してはいけません!) この議論をリファクタリングしてください。書き直しはしないでください。 – bsneeze

+0

いいえ、できません。ごめんなさい。あなたが他の質問で私を助けたくなければ、大丈夫です。それはあなたの選択ですが、この質問はもはや意味がなく、私はここに戻っていません。あなたのすべての協力に感謝します。 –

1

私は何が起こっているのか疑いはWindowsフォームが境界線のサイズを変更しながら、同じクライアントのサイズ(すなわち、内側の面積)を維持していることです。これは一般に、ウィンドウがあなたが置いたコンテンツに正しく適合することを保証するので、良いことです。

同じ外形寸法を維持したい場合は、境界線タイプを変更する前にサイズを変数に保存してから戻すことができます。彼らはおそらく、少しちらつきでしょう。

+0

は動作しませんでした、それは実際になりますそれを悪化させる。 :/ –

0

これは私のためにうまく働いた:

private Size _size; 
    private void Form1_DoubleClick(object sender, EventArgs e) 
    { 
     _size = this.Size; 
     if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow) 
     { 
      this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
     } 
     else 
     { 
      this.FormBorderStyle = FormBorderStyle.SizableToolWindow; 
     } 
     this.Size = _size; 
    } 
+0

フォームのサイズは変わりません... –

+0

このソリューションとalbahariがうまくいかない場合は、要件について私たちに話していないことがあります。 – bsneeze

+0

私が助けを求めているなら、私は何かを隠していますか?私が言うことができるのは、その解決法が機能しないということです。ボタンを押すとウィンドウのサイズは変わります... –

0

私はこの同じ問題を抱えていました。 FormBorderStyleを設定するとクライアントのサイズが変わりますが、すぐにclientrectangleプロパティに入れられないようです。上記のコードはほとんど私のために働いたが、ちょうどストアのサイズではなく、clientsizeを保存するようにしてください。もちろん、上記の例では、 "this"がclientsizeへの参照だったかもしれません - わかりませんでした。とにかく購入、これは私の仕事:

_frmFilter.Height = 300 点心_sizeとしてサイズ= .ClientSize _frmFilter.FormBorderStyle = FormBorderStyle.FixedToolWindow _frmFilter.ClientSize = _size

+1

あなたのコードもどこで使うのか分かりませんが、もっと良い例がありますか?コードをフォーマットしてください:) –