ゲームに特化した Xbox 360 プラットフォーム上ではメニューバーの機能は存在しませんが、Windows
プラットフォームを対象としたゲームを開発する場合、多くの利用者が慣れ親しんでいるメニューバーの存在は重要です。アプリケーションが提供する機能を呼び出すとき、最初に確認するのがメニューでしょう。
XNA Framework では、ゲームを実行しているウィンドウを表す GameWindow クラスが存在しますが、このクラスは Windows
で標準的なウィンドウ機能へのアクセスは提供していません。メニューバーや、Windows 標準のコントロールを追加することは基本的にできない仕組みになっています。
つまり、XNA Framework の答えとしては Windows に依存したメニューやコントロールの機能は提供しないということになります。Windows
を対象としたゲームでメニューバーを表示したい場合は、Windows 用の API を使わなければなりません。
ここで必要になるのは、XNA Framework で生成した GameWindow オブジェクトと、Windows API
をどのように接続するかです。そこで GameWindow は、ウィンドウのハンドルを表す整数を返す Handle プロパティを提供しています。
■ GameWindow クラス Handle プロパティ
public virtual abstract IntPtr Handle { get; }
Handle プロパティが返す値は、ゲームを描画しているウィンドウのハンドルそのものです。C/C++ 言語による Windows
アプリケーションの経験者には HWND 型の値と説明した方が早いかもしれません。この値を用いることで、XNA Framework で生成したウィンドウを他の
API でも制御できるようになります。
C# 言語を用いてウィンドウにメニューバーを追加するには System.Windows.Forms 名前空間を使った、いわゆる Windows Form
アプリケーションの手法となります。
Windows Form アプリケーション開発では、Form クラスのオブジェクトがウィンドウを表します。GameWindow クラスの Handle
プロパティから取得できるハンドルを使って、Form オブジェクトを生成することで、XNA Framework と Windows Form
の間で同じウィンドウを参照することができるようになります。ウィンドウのハンドルから Form オブジェクトを生成するには Control クラスの
FromHandle() メソッドを使います。
■ System.Windows.Forms.Control クラス FromHandle() メソッド
public static Control FromHandle (
IntPtr handle
)
このメソッドは、handle パラメータに Windows
が管理しているコントロールのハンドルを指定します。この値はアプリケーション固有のものではなく、Windows によって管理されているものです。よって、XNA
Framework で生成したウィンドウのハンドルから、Windows Form 用のウィンドウを生成し、操作することができるのです。
Form オブジェクトを正しく生成することができれば、ここからメニューを追加する方法は Windows Form
アプリケーションの開発方法となります。ここからは、XNA Framework ではないため本稿の管轄外となるため割愛させていただきます。
■ Sample01 Test.cs
using System;
using System.Windows.Forms;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
public class Test : Game
{
public static void Main(string[] args)
{
using (Game game = new Test()) game.Run();
}
private MainMenu menuBar;
private MenuItem fileItem;
private MenuItem exitItem;
public Test()
{
exitItem = new MenuItem("終了(&X)", exitItem_onClick);
fileItem = new MenuItem("ファイル(&F)");
fileItem.MenuItems.Add(exitItem);
menuBar = new MainMenu();
menuBar.MenuItems.Add(fileItem);
}
protected override void Initialize()
{
Form form = (Form)Control.FromHandle(Window.Handle);
form.Menu = menuBar;
base.Initialize();
}
private void exitItem_onClick(object sender, EventArgs e)
{
Exit();
}
}
■ 実行結果

Sample01 は、Windows 用 XNA Framework ゲームに Windows Forms
のメニューバーを取り付けています。GameWindow クラスの Handle プロパティから、XNA Framework
が生成したウィンドウのハンドルを取得し、これを Windows Forms の FromHandle() メソッドから Form
オブジェクトに変換しています。こうすることによって、繋がりのない異なる API を組み合わせることができます。Windows に特化したゲームで、Xbox
360 プラットフォームへの移植を考慮する必要がない場合、.NET Framework が提供する Windows
用の機能やネットワーク機能を駆使したゲームを開発することもできます。