WisdomSoft - for your serial experiences.

5.1 境界線

フォームの周囲に表示される境界線を設定します。この設定でユーザーによるフォームのサイズ変更を禁止し、固定サイズのウィンドウを表示できます。

5.1.1 フォームのサイズ変更を禁止する

Form オブジェクトを生成してウィンドウを表示すると、ごく標準的な Windows アプリケーションウィンドウが表示されました。多くのアプリケーションの場合はこれで問題無いと考えられますが、ゲームアプリケーションの場合は世界観を重視するため、システムを感じさせるような部品を使いたくないと考えるかもしれません。

フォームの基本機能として、サイズを変更することができる境界線とタイトルバーがあります。サイズの変更は境界線をドラッグする方法と、最小化、最大化ボタンで変更することができます。ゲームプログラミングの場合、一般的には高速で安定した描画処理を保障するために画面サイズを固定します。ユーザーの任意のサイズ変更を防ぐには、境界線をサイズ変更不能な状態に設定しなければなりません。

フォームの境界線を変更するには Form クラスの FormBorderStyle プロパティを設定します。

Form クラス FormBorderStyle プロパティ
public FormBorderStyle FormBorderStyle { get; set; }

このプロパティに設定できるのは System.Windows.Forms.FormBorderStyle 列挙体のいずれかのメンバです。この列挙体は、フォームの境界線スタイルを表しています。

System.Windows.Forms.FormBorderStyle 列挙体
[Serializable]
[ComVisible(true)]
public enum FormBorderStyle

デフォルトでは、サイズ変更が可能な境界線を表す Sizable メンバが設定されています。FormBorderStyle 列挙体で定義されているメンバは次のようなものがあります。

表1 FormBorderStyle のメンバ
メンバ名 意味
Fixed3D 固定された 3D 境界線。
FixedDialog 太い固定されたダイアログ スタイルの境界線。
FixedSingle 固定された一重線の境界線。
FixedToolWindow サイズ変更できないツール ウィンドウの境界線。
None 境界線なし。
Sizable サイズ変更できる境界線。
SizableToolWindow サイズ変更できるツール ウィンドウの境界線。

ユーザーによる任意のサイズ変更をできないように設定するには、Fixed から始まるサイズ変更できない境界線を選択します。通常は FixedSingle メンバが適しているでしょう。

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

public class Test : Form
{
	static void Main() 
	{
		Form form = new Test();
		form.FormBorderStyle = FormBorderStyle.FixedSingle;
		Application.Run(form);
	}
}
実行結果
コード1 実行結果

コード1は、Form クラスを継承する Test クラスのオブジェクトを生成し、FormBorderStyle プロパティを FixedSingle に設定して表示しています。実行時に表示されるウィンドウの境界線をドラッグしても、ウィンドウのサイズを変更することができないことを確認してください。

5.1.2 クライアント領域のサイズ

高度な描画処理を要求するゲームの画面は、一般的なディスプレイのサイズに合わせて4:3の関係で固定されることになるでしょう。これは、多くのビデオカードがサポートする 640 × 480 や、800 × 600 といった解像度でフルスクリーンを実現するためのものですが、必ずこれで無ければならないという制約はありません。

しかし、どちらにしても本格的なゲームを開発しようと拘っていけば、画面全体の制御をアプリケーションが行う必要が出てきます。このとき、画面全体のレイアウトを正しく行うためにもウィンドウのサイズ(または、ゲーム画面のサイズ)が固定される必要があります。しかし、ゲーム画面が描画されるのはウィンドウ全体ではなく、ウィンドウのクライアント領域です。

つまり、ゲーム画面の解像度が 640 × 480 の場合、これを描画するウィンドウのクライアント領域が 640 × 480 丁度である必要があるのですが、Control クラスの Width と Height、または Size プロパティを設定すると境界線を含めたウィンドウ全体のサイズとして設定されてしまいます。

境界線に依存せずにクライアント領域のサイズだけを設定したい場合、Form クラスの ClientSize プロパティからサイズを設定します。

Form クラス ClientSize プロパティ
public new Size ClientSize {get; set;}

ClientSize プロパティからサイズを設定した場合、フォーム全体のサイズとは別にクライアントのサイズが指定したサイズに設定されます。フォーム全体は、指定したクライアントサイズに加えて境界線とタイトルバーを含めたサイズとなります。

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

public class Test : Form
{
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint (e);
		Font font = new Font(Font.Name, 20);
		Brush brush = new SolidBrush(ForeColor);
		e.Graphics.DrawString(
			"Width=" + Width + ",Height=" + Height, font, brush, 0, 0
		);
		e.Graphics.DrawString(
			"CWidth=" + ClientSize.Width + ",CHeight=" + ClientSize.Height,
			font, brush, 0, font.Height
		);
	}

	static void Main() 
	{
		Form form = new Test();
		form.FormBorderStyle = FormBorderStyle.FixedSingle;
		form.ClientSize = new Size(400, 300);
		Application.Run(form);
	}
}
実行結果
コード2 実行結果

コード2は、フォームのサイズを Size プロパティではなく ClientSize プロパティから設定しています。Test クラスでは OnPaint() メソッドをオーバーライドして、フォーム全体のサイズと、クライアント領域のサイズを表示しています。