今まで出てきたButtonとか、TextBoxなどのコントロールにはAnchorの他に、Dockというプロパティがあります。これを設定することにより親フォームの大きさが変更になると、そのクライアント領域のどこかにくっついて伸び縮みします。
たとえば、クライアント領域に上辺をDockに設定すると、そのコントロールは上辺いっぱいに広がってくっつきます。Anchorと同時には設定できません。もしした場合は、後からの設定が有効です。
DockプロパティはSystem.Windows.Forms名前空間で定義されています。
public virtual DockStyle Dock { get; set; }
プロパティ値のDockStyle列挙体のメンバと意味は次の通りです。
| メンバ | 意味 |
|---|---|
| Bottom | 格納する側の下端にドッキングされる |
| Fill | 格納する側の4辺にドッキングされる |
| Left | 格納する側の左端にドッキングされる |
| None | ドッキングされない |
| Right | 格納される側の右端にドッキングされる |
| Top | 格納される側の上端にドッキングされる |
では、DockをBottomに設定した2つのコントロールがあったらどうなるのでしょうか。 重なり合ってしまうのでしょうか。後から設定した方が、より下端に行き、その上に次のコントロールがくっつきます。
何はともあれ、サンプルを見てみましょう。
// dock01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class dock01
{
public static void Main()
{
MyForm mf = new MyForm();
MyTextBox mt = new MyTextBox();
mt.Parent = mf;
MyButton mb1 = new MyButton();
mb1.Parent = mf;
MyClsButton mcls = new MyClsButton();
mcls.Parent = mf;
Application.Run(mf);
}
}
class MyForm : Form
{
public MyForm()
{
Text = "猫でもわかるC#プログラミング";
BackColor = SystemColors.Window;
}
}
class MyButton : Button
{
public MyButton()
{
Text = "押す";
BackColor = SystemColors.Control;
Dock = DockStyle.Bottom;
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
MessageBox.Show(Parent.Controls[0].Text,
"猫C#",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
class MyClsButton : Button
{
public MyClsButton()
{
Text = "消す";
BackColor = SystemColors.Control;
Dock = DockStyle.Bottom;
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
Parent.Controls[0].Text = "";
Parent.Controls[0].Focus();
}
}
class MyTextBox : TextBox
{
public MyTextBox()
{
Dock = DockStyle.Top;
Font = new Font("MS ゴシック", 26);
}
}
テキストボックスは上端に、2つのボタンは下端にドッキングします。「消す」ボタンの方が後から、設定しているので一番下端が「消す」ボタン、その上に「押す」ボタンが来るはずです。
テキストボックスは上端に、「消す」ボタンが一番下端に、その次に「押す」ボタンが来ていますね。
親フォームのサイズが変更になると、自動的に子コントロールのサイズも変更されます。
さて、このプログラムでは「押す」ボタンと「消す」ボタンが別々のクラスとして書かれていますが、これを一つのクラスにして書き直してみてください。
Update 16/Nov/2006 By Y.Kumei