5.1 境界線
5.1.1 フォームのサイズ変更を禁止する
Form オブジェクトを生成してウィンドウを表示すると、ごく標準的な Windows アプリケーションウィンドウが表示されました。多くのアプリケーションの場合はこれで問題無いと考えられますが、ゲームアプリケーションの場合は世界観を重視するため、システムを感じさせるような部品を使いたくないと考えるかもしれません。
フォームの基本機能として、サイズを変更することができる境界線とタイトルバーがあります。サイズの変更は境界線をドラッグする方法と、最小化、最大化ボタンで変更することができます。ゲームプログラミングの場合、一般的には高速で安定した描画処理を保障するために画面サイズを固定します。ユーザーの任意のサイズ変更を防ぐには、境界線をサイズ変更不能な状態に設定しなければなりません。
フォームの境界線を変更するには Form クラスの FormBorderStyle プロパティを設定します。
public FormBorderStyle FormBorderStyle { get; set; }
このプロパティに設定できるのは System.Windows.Forms.FormBorderStyle 列挙体のいずれかのメンバです。この列挙体は、フォームの境界線スタイルを表しています。
[Serializable] [ComVisible(true)] public enum FormBorderStyle
デフォルトでは、サイズ変更が可能な境界線を表す Sizable メンバが設定されています。FormBorderStyle 列挙体で定義されているメンバは次のようなものがあります。
メンバ名 | 意味 |
---|---|
Fixed3D | 固定された 3D 境界線。 |
FixedDialog | 太い固定されたダイアログ スタイルの境界線。 |
FixedSingle | 固定された一重線の境界線。 |
FixedToolWindow | サイズ変更できないツール ウィンドウの境界線。 |
None | 境界線なし。 |
Sizable | サイズ変更できる境界線。 |
SizableToolWindow | サイズ変更できるツール ウィンドウの境界線。 |
ユーザーによる任意のサイズ変更をできないように設定するには、Fixed から始まるサイズ変更できない境界線を選択します。通常は FixedSingle メンバが適しているでしょう。
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は、Form クラスを継承する Test クラスのオブジェクトを生成し、FormBorderStyle プロパティを FixedSingle に設定して表示しています。実行時に表示されるウィンドウの境界線をドラッグしても、ウィンドウのサイズを変更することができないことを確認してください。
5.1.2 クライアント領域のサイズ
高度な描画処理を要求するゲームの画面は、一般的なディスプレイのサイズに合わせて4:3の関係で固定されることになるでしょう。これは、多くのビデオカードがサポートする 640 × 480 や、800 × 600 といった解像度でフルスクリーンを実現するためのものですが、必ずこれで無ければならないという制約はありません。
しかし、どちらにしても本格的なゲームを開発しようと拘っていけば、画面全体の制御をアプリケーションが行う必要が出てきます。このとき、画面全体のレイアウトを正しく行うためにもウィンドウのサイズ(または、ゲーム画面のサイズ)が固定される必要があります。しかし、ゲーム画面が描画されるのはウィンドウ全体ではなく、ウィンドウのクライアント領域です。
つまり、ゲーム画面の解像度が 640 × 480 の場合、これを描画するウィンドウのクライアント領域が 640 × 480 丁度である必要があるのですが、Control クラスの Width と Height、または Size プロパティを設定すると境界線を含めたウィンドウ全体のサイズとして設定されてしまいます。
境界線に依存せずにクライアント領域のサイズだけを設定したい場合、Form クラスの ClientSize プロパティからサイズを設定します。
public new Size ClientSize {get; set;}
ClientSize プロパティからサイズを設定した場合、フォーム全体のサイズとは別にクライアントのサイズが指定したサイズに設定されます。フォーム全体は、指定したクライアントサイズに加えて境界線とタイトルバーを含めたサイズとなります。
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は、フォームのサイズを Size プロパティではなく ClientSize プロパティから設定しています。Test クラスでは OnPaint() メソッドをオーバーライドして、フォーム全体のサイズと、クライアント領域のサイズを表示しています。