トップ回答者
SplitContainerのFixedPanelがFixしない

質問
-
いつもお世話になっております。
環境WinXp、VS2005、C#2.0
SplitContainerが予想外の動きをして困っております。
実装手順は以下の通りです。
・フォームにSplitContainerのみ貼り付け
・Dock.Fill
・FixedPanel=Panel2
・Orientation=Horizontal
・スプリッタを真ん中あたりに。
・IsSplitterFixed=true
・BorderStyle=Fixed3D
これで実行し、フォームのサイズがタイトルバーだけになるまでResize、
もとのサイズに戻す、再び、タイトルバーだけになるまでリサイズ・・・
この運動を繰り返しているとFixedのはずのPanel2の
高さがちょっとづつ小さくなって行き、
最後にはタイトルバーの高さぐらいにまでなります。
FixedPanelというのはResizeされてもサイズ変化しない
というのが認識でしたが違うのでしょうか。
宜しくお願い致します。
回答
-
!(^^)!ふ~ さん の発言:フレームじゃなくて、フォームの最小サイズを制限するというアプローチですか?
SplitContainerコントロール側で、潰れないように頑張っても、土台のフレームサイズが小さくなって
しまうので、抵抗できないようです。そこで、フレームのResizeイベントで、フレームが適当
なサイズで小さくならないように制限を設けることにしました。
そのアプローチなら、MinimumSizeプロパティで良さそうに思えます。
タイトルバーだけになるまで縮めるということが現実的にないのであれば、最小サイズ(MinimumSize)を設定することで回避は可能だと思います。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク sk7474 2009年3月5日 1:53
-
こんにちは!(^^)!ふ~です。
>FixedPanelというのはResizeされてもサイズ変化しないというのが認識でしたが違うのでしょうか。
確かに実際に操作して見ますと、おっしゃる通りで、パネルの高さが潰れて行きます。
SplitContainerコントロール側で、潰れないように頑張っても、土台のフォームサイズが小さくなって
しまうので、抵抗できないようです。そこで、フォームのResizeイベントで、フォームが適当
なサイズで小さくならないように制限を設けることにしました。<プロパティの設定値>
・フォームにSplitContainerのみ貼り付ける
・Dock.Fill
・FixedPanel=Panel2
・Orientation=Horizontal
・スプリッタを真ん中あたりに。
・IsSplitterFixed=true
・BorderStyle=Fixed3D<ソースコード>
// ファイル名 Form1.cs using System; using System.Drawing; using System.Windows.Forms; namespace SplitContainer { public partial class Form1 : Form { static Size szFram; // フォームサイズを格納する。 static int Up_Height; // 上側の固定パネルの高さを格納する。 static int Down_Height; // 下側の固定パネルの高さを格納する。 public Form1() { InitializeComponent(); szFram = this.Size; // 上側パネルの高さを取得する Up_Height = this.splitContainer1.SplitterDistance; // 下側パネルの高さを取得する Down_Height = splitContainer1.Height - this.splitContainer1.SplitterDistance; Resize += new EventHandler(Form1_Resize); } void Form1_Resize(object sender, EventArgs e) { // 分割バーが移動できるか? if (!this.splitContainer1.IsSplitterFixed) return;//戻る(バーが移動する) int iHeight; // パネルの高さ、固定幅を格納する。 // パネル1(上側)を固定する if (this.splitContainer1.FixedPanel == System.Windows.Forms.FixedPanel.Panel1) { ////////////////////// // 上パネル高さ固定 // ////////////////////// iHeight = Up_Height; if (iHeight + splitContainer1.SplitterWidth > splitContainer1.Height - splitContainer1.Panel2MinSize) { this.Size = szFram; // 小さくならないようにフォームを固定する。 } } // パネル2(下側)を固定する else if (this.splitContainer1.FixedPanel == System.Windows.Forms.FixedPanel.Panel2) { ////////////////////// // 下パネル高さ固定 // ////////////////////// iHeight = Down_Height; if (splitContainer1.Panel1MinSize > splitContainer1.Height - (iHeight + splitContainer1.SplitterWidth)) { this.Size = szFram; // 小さくならないようにフォームを固定する。 } iHeight = splitContainer1.Height - iHeight; } // Noneの場合 else { iHeight = splitContainer1.SplitterDistance; } // 分割バーを移動する。 szFram = this.Size; splitContainer1.SplitterDistance = iHeight; } } }
すべての返信
-
こんにちは!(^^)!ふ~です。
>FixedPanelというのはResizeされてもサイズ変化しないというのが認識でしたが違うのでしょうか。
確かに実際に操作して見ますと、おっしゃる通りで、パネルの高さが潰れて行きます。
SplitContainerコントロール側で、潰れないように頑張っても、土台のフォームサイズが小さくなって
しまうので、抵抗できないようです。そこで、フォームのResizeイベントで、フォームが適当
なサイズで小さくならないように制限を設けることにしました。<プロパティの設定値>
・フォームにSplitContainerのみ貼り付ける
・Dock.Fill
・FixedPanel=Panel2
・Orientation=Horizontal
・スプリッタを真ん中あたりに。
・IsSplitterFixed=true
・BorderStyle=Fixed3D<ソースコード>
// ファイル名 Form1.cs using System; using System.Drawing; using System.Windows.Forms; namespace SplitContainer { public partial class Form1 : Form { static Size szFram; // フォームサイズを格納する。 static int Up_Height; // 上側の固定パネルの高さを格納する。 static int Down_Height; // 下側の固定パネルの高さを格納する。 public Form1() { InitializeComponent(); szFram = this.Size; // 上側パネルの高さを取得する Up_Height = this.splitContainer1.SplitterDistance; // 下側パネルの高さを取得する Down_Height = splitContainer1.Height - this.splitContainer1.SplitterDistance; Resize += new EventHandler(Form1_Resize); } void Form1_Resize(object sender, EventArgs e) { // 分割バーが移動できるか? if (!this.splitContainer1.IsSplitterFixed) return;//戻る(バーが移動する) int iHeight; // パネルの高さ、固定幅を格納する。 // パネル1(上側)を固定する if (this.splitContainer1.FixedPanel == System.Windows.Forms.FixedPanel.Panel1) { ////////////////////// // 上パネル高さ固定 // ////////////////////// iHeight = Up_Height; if (iHeight + splitContainer1.SplitterWidth > splitContainer1.Height - splitContainer1.Panel2MinSize) { this.Size = szFram; // 小さくならないようにフォームを固定する。 } } // パネル2(下側)を固定する else if (this.splitContainer1.FixedPanel == System.Windows.Forms.FixedPanel.Panel2) { ////////////////////// // 下パネル高さ固定 // ////////////////////// iHeight = Down_Height; if (splitContainer1.Panel1MinSize > splitContainer1.Height - (iHeight + splitContainer1.SplitterWidth)) { this.Size = szFram; // 小さくならないようにフォームを固定する。 } iHeight = splitContainer1.Height - iHeight; } // Noneの場合 else { iHeight = splitContainer1.SplitterDistance; } // 分割バーを移動する。 szFram = this.Size; splitContainer1.SplitterDistance = iHeight; } } } -
!(^^)!ふ~ さん の発言:フレームじゃなくて、フォームの最小サイズを制限するというアプローチですか?
SplitContainerコントロール側で、潰れないように頑張っても、土台のフレームサイズが小さくなって
しまうので、抵抗できないようです。そこで、フレームのResizeイベントで、フレームが適当
なサイズで小さくならないように制限を設けることにしました。
そのアプローチなら、MinimumSizeプロパティで良さそうに思えます。
タイトルバーだけになるまで縮めるということが現実的にないのであれば、最小サイズ(MinimumSize)を設定することで回避は可能だと思います。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク sk7474 2009年3月5日 1:53