Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト
Visual Studio 2005
MSDN Home > Visual Studio > Visual Studio 2008 Express Edition > 学習情報 > XNA > 第 02 回 - コラム
ホーム Web インストール 製品の特徴 製品の機能 サポート 前のバージョン
XNA で作る、あなただけのマインスイーパ

XNA Framework 第 02 回 - コラム

赤坂玲音

   

メニューバーを表示する

ゲームに特化した 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 用の機能やネットワーク機能を駆使したゲームを開発することもできます。



Top of Page Top of Page
Visual Studio 2008 Express

Microsoft