WisdomSoft - for your serial experiences.

コントロール

Windows フォームにおける全てのコントロールの基底クラスとなる Control クラスを紹介します。

UI部品の基底クラス

Windows フォームでは Form クラスを含めたあらゆる UI 部品(ラベル、ボタン、リストなど)が System.Windows.Forms.Control クラスから派生しています。このクラスが持つメンバを理解することで Windows フォームで扱う多くのコントロールを同じように制御できます。

System.Windows.Forms.Control クラス
System.Object
   System.MarshalByRefObject
     System.ComponentModel.Component
      System.Windows.Forms.Control

public class Control : Component, ISynchronizeInvoke, IWin32Window

Form クラスもまた Control クラスから派生しているため、Control クラスのプロパティやメソッドを用いて操作できます。

多くのコントロールで共通する代表的な設定は Text プロパティです。Text プロパティは、コントロールに関連付けられているテキストを表します。

Control クラス Text プロパティ
public virtual string Text {get; set;}

このプロパティに設定されている文字列がどのように表示されるかはコントロールの実装に依存します。ボタンであれば、ボタン上のコンテンツとして設定されている文字列が表示されるでしょう。

Form クラスの Text プロパティの場合、フォームのタイトルバーに表示するテキストを表します。Text プロパティに文字列を設定することで、ウィンドウのタイトルを変更できます。 

コード1
using System.Windows.Forms;

class Test
{
	public static void Main(string[] args)
	{
		Form form = new Form();
		form.Text = "Kitty on your lap";
		Application.Run(form);
	}
}
実行結果
コード1 実行結果

コード1は生成した Form オブジェクトの Text プロパティに文字列を設定しています。実行結果を見ると、正しくタイトルバー上に設定した文字列がテキストとして表示されていることが確認できます。

前景色と背景色

コントロールには前景色を表す ForeColor プロパティと、背景色を表す BackColor プロパティが用意されています。これらのプロパティがどのように反映されるかはコントロールの実装に依存しますが、例えばボタンなどのコントロールで表示されるテキストの色には ForeColor プロパティの値が用いられるでしょう。

Control クラス ForeColor プロパティ
public virtual Color ForeColor { get; set; }
Control クラス BackColor プロパティ
public virtual Color BackColor { get; set; }

これらのプロパティには System.Drawing.Color 構造体の値で前景色や背景色となる色を指定します。

Form オブジェクト自身は前景色を用いるような内容を持ちませんが、背景色を設定すればフォームの背景を指定した色で塗りつぶします。 

コード2
using System.Windows.Forms;
using System.Drawing;

class Test
{
	public static void Main(string[] args)
	{
		Form form = new Form();
		form.BackColor = Color.Red;
		form.ForeColor = Color.Blue;
		Application.Run(form);
	}
}
実行結果
コード2 実行結果

コード2ではフォームの背景色を赤に設定しているため、ウィンドウの内部が赤で塗りつぶされています。前景色も青に設定していますが、フォーム自身には前景色で塗るような内容が含まれていないため、この設定は使われていません。後述するボタンなど、内容を持つコントロールで有効なプロパティです。

位置とサイズ

全てのコントロールには、コントロールを表示する位置とサイズが設定されています。位置やサイズを設定または取得する方法は、いくつか存在します。

コントロールの位置は Location プロパティから設定または取得できます。

Control クラス Location プロパティ
public Point Location { get; set; }

このプロパティは System.Drawing.Point 構造体の値でコントロールの座標を表します。Point 構造体の X プロパティと Y プロパティに設定される値は、通常はピクセル単位となります。X 座標の値が大きいほど右に、Y 座標の値が大きいほど下に向かいます。

ウィンドウに配置されているボタンなどのコントロールは、ウィンドウの左上隅を原点とするクライアント座標となります。フォームの場合は、スクリーン全体の原点(通常は画面の左上隅)を基準にしたスクリーン座標となります。

ただし Form クラスのオブジェクトであるフォームは、初期位置の設定項目が独自に存在します。手動でスクリーン座標の位置を設定したい場合は StartPosition プロパティを変更しなければなりません。

Control クラス StartPosition プロパティ
[LocalizableAttribute(true)] 
public FormStartPosition StartPosition { get; set; }

このプロパティは System.Windows.Forms.FormStartPosition 列挙体でフォームを表示したときの初期位置を表します。 

System.Windows.Forms.FormStartPosition 列挙体
[ComVisibleAttribute(true)] 
public enum FormStartPosition
表1 FormStartPosition 列挙体のメンバ
メンバ 説明
CenterParent 親フォームの中央。
CenterScreen スクリーンの中央。
Manual Location プロパティで指定された座標。
WindowsDefaultBounds Windows によって決定される既定の位置とサイズ。
WindowsDefaultLocation Windows によって決定される既定の位置。

StartPosition プロパティに設定されているデフォルトの値は WindowsDefaultLocation メンバです。Location プロパティでフォームの座標を指定したい場合は Manual メンバの値に変更してください。

コード3
using System.Windows.Forms;
using System.Drawing;

class Test
{
	public static void Main(string[] args)
	{
		Form form = new Form();
		form.StartPosition = FormStartPosition.Manual;
		form.Location = new Point(0, 0);
		Application.Run(form);
	}
}

コード3は X 座標と Y 座標がともに 0 の原点にフォームを表示します。

コントロールのサイズを変更するには、幅と高さを設定します。幅は Width プロパティから、高さは Height プロパティから設定または取得できます。値の単位は座標と同じくピクセルです。

Control クラス Width プロパティ
[BrowsableAttribute(false)]
public int Width { get; set; }
Control クラス Height プロパティ
[BrowsableAttribute(false)]
public int Height { get; set; }

もしくは幅と高さを 1 つの値とする Size プロパティから設定または取得することも可能です。 

Control クラス Size プロパティ
public Size Size { get; set; }

Size プロパティは、幅と高さからなる System.Drawing.Size 構造体の値で表されます。 

System.Drawing.Size 構造体
[SerializableAttribute]
[TypeConverterAttribute(typeof(SizeConverter))]
[ComVisibleAttribute(true)]
public struct Size

Width プロパティまたは Height プロパティから幅や高さを個別に設定する方法と、Size プロパティから幅と高さを同時に設定する方法が選択できます。どちらから設定しても、結果は両方のプロパティに反映されます。

また Size 構造体は値型なので、Size プロパティから取得したオブジェクトの値を変更しても、間接的にコントロールのサイズに影響を及ぼすことはありません。 

コード4
using System.Windows.Forms;
using System.Drawing;

class Test
{
	public static void Main(string[] args)
	{
		Form form = new Form();
		form.Width = 400;
		form.Height = 100;
		Application.Run(form);
	}
}
実行結果
コード4 実行結果

コード4は表示するフォームのサイズを変更し、縦に短く横に長いフォームを表示します。 

位置とサイズは Location プロパティと Size プロパティで個別に設定する以外に Bounds プロパティを用いて同時に設定または取得することもできます。

Control クラス Bounds プロパティ
[BrowsableAttribute(false)]
public Rectangle Bounds { get; set; }

このプロパティは System.Drawing.Rectangle 構造体でコントロールの位置とサイズを表すピクセル単位の長方形領域を指定します。

コード5
class Test
{
	public static void Main(string[] args)
	{
		Form form = new Form();
		form.StartPosition = FormStartPosition.Manual;
		form.Bounds = new Rectangle(0, 0, 400, 100);
		Application.Run(form);
	}
}
 

コード5はスクリーン座標の原点から幅 400 ピクセル、高さ 100 ピクセルのフォームを表示します。

サイズはコントロールの左上隅からピクセル単位での幅と高さになりますが、座標計算や判定のためにコントロールの右端や下の座標を取得したいこともあるでしょう。コントロールの四隅の位置を取得することも可能で、左は Left プロパティ、右は Right プロパティ、上は Top プロパティ、下は Bottom プロパティで表されます。

Control クラス Left プロパティ
[BrowsableAttribute(false)]
public int Left { get; set; }
Control クラス Right プロパティ
[BrowsableAttribute(false)]
public int Right { get; }
Control クラス Top プロパティ
[BrowsableAttribute(false)]
public int Top { get; set; }
Control クラス Bottom プロパティ
[BrowsableAttribute(false)]
public int Bottom { get; }

これらのプロパティは読み取り専用なので、設定することはできません。

事実上、Left プロパティは Location プロパティの X 座標に等しく、Top プロパティは Y 座標に等しい値となります。また、Right プロパティの値は X 座標 + 幅であり、Bottom プロパティの値は Y 座標 + 高さとなります。