2.ウダウダ言わずにやってみよう!!
〜DirectX最初のプログラム〜



 タイトル通りです。つまり、"習うより慣れよ"、"百聞は一見に如かず"ということです。


 では、以下のプログラムを使ってDirectX最初のプログラムを作ってみましょう。DirectXを使うといっても、特に何かを使うわけではなく、DirectXでメッセージボックスと簡単なウィンドウを作るだけです。気楽にいきましょう。


 プログラムは100行程度の短いものです。まずは以下のプログラムをじっくり眺めましょう。


//dx02.cpp
//DirectX First Step
//Made by miya  2000.11.01

#define INITGUID
#include <windows.h>
#include <ddraw.h>


//ウィンドウクラス情報
static char szClass[] = "XmplHr2Class";
static char szCaption[] = "DirectX解説書 -第2章-";

//グローバルインターフェイスポインタ
LPDIRECTDRAW7         lpDD = NULL;          //DirectDrawオブジェクト
LPDIRECTDRAWSURFACE7  lpDDSPrimary = NULL;  //DirectDrawプライマリサーフェス
LPDIRECTDRAWCLIPPER   lpClip = NULL;        //DirectDrawクリッパーオブジェクト

//--------------------関数のプロトタイプ宣言--------------------//
LRESULT CALLBACK WindowProc (HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam);
static BOOL Init (HINSTANCE hInstance, int nCmdShow);


//--------------------メインウィンドウの構築--------------------//
int PASCAL WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow )
{
  MSG msg;    //Windowsメッセージ構造体

  //アプリケーションを初期化。失敗時に終了
  if (!Init (hInstance,nCmdShow))
    return FALSE;

  //終了までメッセージループを処理
  while (GetMessage (&msg, NULL, NULL, NULL)){
    TranslateMessage (&msg);
    DispatchMessage (&msg);
  }

  //最終メッセージを返して終了
  return (msg.wParam);
}


//--------------------メッセージループの組み立て--------------------//
LRESULT CALLBACK WindowProc (HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam)
{
  switch (msg){
    case WM_CREATE:
      if (FAILED (DirectDrawCreateEx (NULL,(LPVOID*)&lpDD,IID_IDirectDraw7,NULL ))){
        MessageBox (hWnd , "DirectDrawオブジェクトの生成に失敗" , szCaption , MB_OK);
        PostQuitMessage (0);
        break;
      }
      MessageBox (hWnd , "DirectDrawオブジェクトの生成に成功" , szCaption , MB_OK);
      lpDD->Release ( );
      break;
    case WM_DESTROY:
      if (!lpDD) lpDD->Release ( );
      PostQuitMessage (0);
      break;
    default:
      return DefWindowProc (hWnd , msg , wParam , lParam);
  }
  return 0;
}

//--------------------ウィンドウの作成--------------------//
static BOOL Init (HINSTANCE hInstance, int nCmdShow)
{
  HWND hWnd;
  WNDCLASS wc;

  //ウィンドウクラスをセットアップし、登録
  wc.style          = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc    = (WNDPROC) WindowProc;
  wc.cbClsExtra     = 0;
  wc.cbWndExtra     = sizeof (DWORD);
  wc.hInstance      = hInstance;
  wc.lpszClassName  = szClass;
  wc.hIcon          = NULL;
  wc.hCursor        = LoadCursor (NULL , IDC_ARROW);
  wc.hbrBackground  = HBRUSH (COLOR_WINDOW + 1);
  wc.lpszMenuName   = NULL;
  if (!RegisterClass (&wc))	return FALSE;

  //ウィンドウを作成して表示
  hWnd = CreateWindow (szClass,              //クラス
                       szCaption,            //キャプション
                       WS_VISIBLE | 
                       WS_OVERLAPPEDWINDOW,  //スタイル
                       CW_USEDEFAULT,        //ウィンドウ原点の横座標
                       CW_USEDEFAULT,        //ウィンドウ原点の縦座標
                       400,                  //ウィンドウの幅
                       300,                  //ウィンドウの高さ
                       NULL,                 //親ウィンドウ
                       NULL,                 //メニュー
                       hInstance,            //インスタンス
                       NULL);                //パラメータ
  if (hWnd == NULL)	return FALSE;

  ShowWindow (hWnd,nCmdShow);
  UpdateWindow (hWnd);

  return TRUE;
}

 プログラムの解説は・・・省略しましょう。と、いうよりは、筆者がプログラムを全く理解していません(苦笑 しかし、全く解説が無いとこのページの意味が無いので、少しだけ解説しましょう。
 まずはWinMain関数よりInit関数が呼び出され、ウィンドウの初期化が開始されます。このInit関数自体はウィンドウ作成の基本なので、VC++をやった事のある人はこのような物を見た事があるかも知れませんね。
 続いてWindowProc関数がInit関数より呼び出されます。WindowProc関数ではDirectDrawの初期化、及びメッセージボックスの作成を行っています。
 WindowProc関数から戻ってくるとInit関数でウィンドウの作成。それが終わると、WinMain関数でプログラム終了までメッセージループが繰り返されます。


 以上、簡単ですがプログラムの解説をしました。この説明でわからない場合は、筆者にメールをください。もっとわかるようにこのページを書き直します。なにぶん、素人なもので・・・(汗


 それでは早速、上のプログラムを実行させてみましょう。
 [ファイル→新規作成]と選び、[プロジェクト]タブを選択。下の画面を表示させましょう。

 この中から、画面中で選択しているように、[Win32 Application]を選択します。プロジェクト名は適当でいいですが、このページのタイトルにちなんで、[dx02]としておきました。


 OKを押すと、下のような画面になります。



 この中から、[空のプロジェクト]を選択しましょう。OKを押すと、下の画面に移ります。

これで、プロジェクトが完成します。プロジェクトを作らずに、ソースファイルのみから作ろうとすると、外部リンクが出来ずにプログラムが実行されません。空のプロジェクトを作り、ワークスペースが作られないとプログラムは実行されないようです。


 続いて、プロジェクトに空のソースファイルを追加します。[ファイル→新規作成]を選び、[ファイル]タブを選択します。下の画面が表示されたら、リストの中から[C++ソースファイル]を選択しましょう。



 出来た空のソースファイルに上のソースをコピー&ペーストしましょう。これで準備完了です。
 それでは早速、プログラムを実行してみましょう。プログラムの実行は、[ビルド→実行]、又はF5キーを押しましょう。


 さて、実行結果は・・・あれ?エラーが発生しています。
  dx02.obj : error LNK2001: 外部シンボル "_DirectDrawCreateEx@16" は未解決です
  Debug/dx02.exe : fatal error LNK1120: 外部参照 1 が未解決です。
 ・・・どうやら、プロジェクトにライブラリを追加するのを忘れていました。プロジェクトに[ddraw.lib]を追加しましょう。詳しくは前回「1.DirectXプログラムのビルド方法」を参照して下さい。ちなみに、今の失敗はわざとです。ライブラリの追加を教えるためにやったものです。いや、本当に。勘弁して下さい。


 さて、気を取り直していきましょう。今度こそ、プログラムが実行できるはずです。実行すると、まず最初に左のようなメッセージボックスが表示されます。
 これが表示されたという事は、実行したパソコンで正しくDirectXが動いているという証拠です。OKを押すと、次の画面に移ります。


 真っ白な画面が表示されました。今回のプログラムはここで終わりですが、次回はこの画面にBMP画像を表示させて、簡単なイメージビューワーを作ってみましょう。


まとめ
・DirectXは簡単だ(と信じ込む)
・人のプログラムを見て勉強する
・プログラムの実行はプロジェクトの作成から

ファイル
dx02.lzh
 ├ readme.txt
 └ dx02.cpp
dx02_exe.lzh
 ├ readme.txt
 └ dx02.exe


電脳館
written by みや
First Write : 2000.11.01
Last Update : 2001.03.06



戻る


Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!