none
SplitContainerのFixedPanelがFixしない RRS feed

  • 質問

  •   いつもお世話になっております。
    環境WinXp、VS2005、C#2.0

    SplitContainerが予想外の動きをして困っております。

    実装手順は以下の通りです。
    ・フォームにSplitContainerのみ貼り付け
    ・Dock.Fill
    ・FixedPanel=Panel2
    ・Orientation=Horizontal
    ・スプリッタを真ん中あたりに。
    ・IsSplitterFixed=true
    ・BorderStyle=Fixed3D

    これで実行し、フォームのサイズがタイトルバーだけになるまでResize、
    もとのサイズに戻す、再び、タイトルバーだけになるまでリサイズ・・・

    この運動を繰り返しているとFixedのはずのPanel2の
    高さがちょっとづつ小さくなって行き、
    最後にはタイトルバーの高さぐらいにまでなります。
    FixedPanelというのはResizeされてもサイズ変化しない
    というのが認識でしたが違うのでしょうか。
    宜しくお願い致します。

    2009年2月25日 16:11

回答

  • !(^^)!ふ~ さん の発言:

    SplitContainerコントロール側で、潰れないように頑張っても、土台のフレームサイズが小さくなって
    しまうので、抵抗できないようです。そこで、フレームのResizeイベントで、フレームが適当
    なサイズで小さくならないように制限を設けることにしました。

    フレームじゃなくて、フォームの最小サイズを制限するというアプローチですか?
    そのアプローチなら、MinimumSizeプロパティで良さそうに思えます。


    タイトルバーだけになるまで縮めるということが現実的にないのであれば、最小サイズ(MinimumSize)を設定することで回避は可能だと思います。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年3月5日 1:53
    2009年2月28日 7:40
    モデレータ
  • こんにちは!(^^)!ふ~です。

    >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;  
            }  
        }  
    }  
     
    以上
    • 編集済み !(^^)!ふ~ 2009年2月28日 8:29 Azuleanさんご指摘 フレームをフォームに訂正する
    • 回答としてマーク sk7474 2009年3月5日 1:53
    2009年2月28日 4:59

すべての返信

  • こんにちは!(^^)!ふ~です。

    >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;  
            }  
        }  
    }  
     
    以上
    • 編集済み !(^^)!ふ~ 2009年2月28日 8:29 Azuleanさんご指摘 フレームをフォームに訂正する
    • 回答としてマーク sk7474 2009年3月5日 1:53
    2009年2月28日 4:59
  • !(^^)!ふ~ さん の発言:

    SplitContainerコントロール側で、潰れないように頑張っても、土台のフレームサイズが小さくなって
    しまうので、抵抗できないようです。そこで、フレームのResizeイベントで、フレームが適当
    なサイズで小さくならないように制限を設けることにしました。

    フレームじゃなくて、フォームの最小サイズを制限するというアプローチですか?
    そのアプローチなら、MinimumSizeプロパティで良さそうに思えます。


    タイトルバーだけになるまで縮めるということが現実的にないのであれば、最小サイズ(MinimumSize)を設定することで回避は可能だと思います。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年3月5日 1:53
    2009年2月28日 7:40
    モデレータ
  • こんばんは!(^^)!ふ~です。

    >そのアプローチなら、MinimumSizeプロパティで良さそうに思えます。

    なるほど、そうですね。「Form1のMinimumSizeプロパティで適切な値を設定する。」これが簡単で便利です。
    splitContainer1.SplitterDistance のプロパティとForm1のMinimumSizeプロパティの関係を適切に保てば良いようです。
    2009年2月28日 8:49
  • ふ~さん、Azuleanさん、ご回答ありがとうございました。
    MinimumSizeで解決いたしました。
    2009年3月1日 3:59
  •  こんにちは。中川俊輔です。

    ふ~さん、Azuleanさん、回答ありがとうございます。

    Myonさん、フォーラムのご利用ありがとうございます。
    有用な情報と思われたため、ふ~さん、Azuleanさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年3月5日 1:56