0

通常、私は以下の方法を使用して(優雅に)サイズ変更可能なフォームを作成します。

using System.Drawing;
using System.Windows.Forms;
namespace silly
{
    public class Form1 : Form
    {
        private GroupBox g;
        private Button b1, b2;
        public Form1()
        {
            Init();
        }
        private void Init()
        {
            //create and add controls.
            this.Controls.Add(g = new GroupBox());
            g.Controls.AddRange(new Control[] { 
                    b1 = new Button(),
                    b2 = new Button()});


            g.Text = "group";
            b1.Text = "b1";
            b2.Text = "b2!";


            b1.AutoSize = b2.AutoSize = true;


            g.Resize += new System.EventHandler(g_Resize);

        }

        private void g_Resize(object sender, System.EventArgs e)
        {
            b1.Size = b2.Size = new Size(g.ClientSize.Width, g.ClientSize.Height/2);
            b1.Location = Point.Empty;
            b2.Location = new Point(b1.Left, b1.Bottom);
        }
        protected override void OnResize(System.EventArgs e)
        {
            g.Size = this.ClientSize;
            g.Location = Point.Empty;
        }
    }
}

g.ClientSizeただし、プロパティがプロパティのように機能しないことにすぐに気付くでしょうForm.ClientSize。私がやっていることはPoint、値を追加することです。

private readonly static Point grp_zero = new Point(10, 20);

コンポーネントを適切に配置するのに役立ちます。この値を使用して、次のg_Resize方法でメソッドをリファクタリングできます。

b1.Size = b2.Size = new Size(g.ClientSize.Width - grp_zero.X * 2, 
    g.ClientSize.Height/2 - grp_zero.X - grp_zero.Y);
b1.Location = grp_zero;
b2.Location = new Point(b1.Left, b1.Bottom);

かなり良い結果が得られました。ただし、の最後にあるInit();場合、次のコードが見つかります。

            g.Font = new Font(g.Font.FontFamily, 28);

またはそのようなものは、grp_zeroサイズを変更する価値があります。

質問

この狂気に対する良い回避策はありますか?職業はなんですか?

試しDockてみましたが、ボタンがクライアント領域Anchorを埋めるようにすることができないようです。GroupBox私がここで求めている効果は、各ボタンがクライアント領域の半分を埋めることです。

前もって感謝します。

4

2 に答える 2

4

試しDockてみましたが、ボタンがクライアント領域Anchorを埋めるようにすることができないようです。GroupBox私がここで求めている効果は、各ボタンがクライアント領域の半分を埋めることです。

  1. にを追加TableLayoutPanelしますGroupBox
    1. Dockそのプロパティをに設定しますFill
    2. RowCount = 2そのとを設定しますColumnCount = 1
    3. RowStyles各行の塗りつぶしを50%に設定します。デザイナでデフォルトで実行されます。
  2. 2つのボタンをに追加しますTableLayoutPanel
    1. Dockプロパティをに設定しますFill
  3. 終わり!

また、デザイナーにもう一度チャンスを与えることをお勧めします-それは本当にとても良いことです!

于 2011-02-11T19:09:32.067 に答える
3

それでも手動レイアウトコードを使用する場合は、のDisplayRectangle代わりにプロパティを使用してClientRectangleください。私もLayoutイベントの方が好きResizeです。

private void g_Layout(object sender, System.LayoutEventArgs e)
{
    b1.Size = b2.Size = new Size(g.DisplayRectangle.Width, 
                                 g.DisplayRectangle.Height/2 - 1);

    b1.Location = new Point(g.DisplayRectangle.Left, 
                            g.DisplayRectangle.Top);

    b2.Location = new Point(g.DisplayRectangle.Left, 
                           g.DisplayRectangle.Top + g.DisplayRectangle.Height/2);
}

ただし、ドキュメントには次のように記載されていることに注意してください。

このAPIは.NETFrameworkインフラストラクチャをサポートしており、コードから直接使用することを目的としたものではありません。

于 2011-02-11T19:27:51.420 に答える