C# Programming

Image

アンビエント プロパティについて

開発環境: Visual Studio 2003 

1.目次

2.目的

アンビエント(環境)プロパティについて説明します。

3.参考書

(1) MSDNのヘルプ

4.アンビエント プロパティ

アンビエントプロパティ(直訳して環境属性)と言っても、
何のことだか想像できないと思いますので、簡単な例で説明します。

まず、Windows.Forms アプリケーションを作って、
ボタンを1つツールボックスから追加してください。
次のような Windows.Forms ができたと思います。

Image

次に、Form1 のプロパティ から BackColor プロパティで適当な色を指定します。
すると、次のように、Form と ボタンの両方の背景の色が変わった
Windows.Forms ができたと思います。
Image

さて、ソースコードの InitializeComponent メソッドの中を確認してみてください。
次のようになっているはずです。

	private void InitializeComponent()
	{
		this.button1 = new System.Windows.Forms.Button();
		this.SuspendLayout();
		// 
		// button1
		// 
		this.button1.Location = new System.Drawing.Point(64, 72);
		this.button1.Name = "button1";
		this.button1.TabIndex = 0;
		this.button1.Text = "button1";
		// 
		// Form1
		// 
		this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
		this.BackColor = System.Drawing.Color.FromArgb(((System.Byte)(255)), 
		((System.Byte)(255)), ((System.Byte)(128)));
		this.ClientSize = new System.Drawing.Size(292, 266);
		this.Controls.AddRange(new System.Windows.Forms.Control[] {this.button1});
		this.Name = "Form1";
		this.Text = "Form1";
		this.ResumeLayout(false);
	}
このコードを見ると、ボタンの BackColor へ色を設定しているコードがありません。
にもかかわらず、ボタンの BackColor が変わるのは、
Form の親コントロールのプロパティを取得するという特殊な
アンビエントプロパティであるからです。

Form コントロールでは、次の4つのアンビエントプロパティがサポートされています。

アンビエントプロパティ
BackColor
Cursor
Font
ForeColor

このアンビエントプロパティがないと、すべての部品の面倒を見ないといけないので、
大変厄介なことになります。
知らず知らずのうちに、このアンビエントプロパティの恩恵にあずかっているんですね。
それでは次に、先ほどの Form へ メインメニューをドラッグアンドドロップしてみてください。
メインメニューのバックカラーは変更されないですよね。
また、Form のフォントを変更しても、メインメニューのフォントは変更されません。
これは、メインメニューがアンビエントプロパティをサポートしていないためです。
Image

注意: メインメニューのバックカラー、フォントを変更するには、
オーナー描画をするしかないようです。

注意: 
コントロールに Parent がなく、プロパティが設定されていない場合は、
コントロールは Site プロパティを通してアンビエント プロパティの値を決定しようとします。
コントロールが配置されておらず、そのサイトがアンビエント プロパティをサポートしていない場合、
またはアンビエントプロパティが設定されていない場合には、コントロール独自の既定値を使用します。