bussorenre Laboratory

bussorenre Laboratory

DirectX10 のTutorialを進めていく00

こんばんは。The Social Network見てきました。いやぁ素晴らしいですね。本当に。技術力の高さがすべてじゃないけど、ある人は強いです。あんまり公の場でしゃべるとアレなので言えませんが。

情報系の人必見です。まじで興奮します!!
http://www.thesocialnetwork-movie.com/


というわけで、昨日とは打って変わって。DirectX10のTutorialを始めることにしました。理由は、OpenGL4.0(GLUTを使わない)で開発する環境がどうしても作れなかったからです。

ただ、留学に行く前に一芸をつくって持っていきたい。一番わかりやすいのはグラフィックだけど、OpenGLは使えない・・・・・・・

俺にはDirectXがあるじゃないか……

きっと覚えている人はいませんが、昔DirectXを3年ほど本気でやってました。その頃は9でしたが。で、DX10が出たころに、ゲーム以外のプログラミングの世界を知って、大混乱、大暴れ、様々な迷走その他もろもろを繰り返し、2年半年ぶりにDirectXをいじることに。運命って怖い。

学科選択で真剣の真剣に悩んで、自分の過去5年間のプログラミング人生を振り返って。私はやはりグラフィック処理な人間。グラフィックの事は、特にDirectX使わせたら、今でも絶対立命館情理の誰にも負ける自信がない。

この春休み。留学に行くまでに、得意分野を伸ばすという方向で自信をつけよう。というわけでDirectX10です。挫折してから2年半。ついに本気だす。

DirectX SDK
http://goo.gl/JRBA

ってわけで、Tutorial00ですが。あっさりクリアしちゃいました。ウィンドウをつくるとかどうとかっていう内容だったので。めんどくさいのでクラス化して、本来なら100行かかるプログラムを20行で書けるように。これなら文句ない。

#include "windowclass.h"    // ウィンドウクラスの読み込み

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hToolbar=0;
    switch(msg){
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }
}

int WINMAIN()
{
    WindowClass wc;     // 自分で作ったクラス
    wc.InitApp(hInstance,(WNDPROC)WndProc);    // プログラム初期化
    wc.InitWindow(L"窓の タイトル\(^o^)/");  // ウィンドウ作成
    wc.MessageLoop_Normal();                   // メインループ
    return 0L;
}

クラスの中身は省略。続きを読む。に置きます。
さて、準備完了。one-Tutorial per one-dayで進めば、7まではきっと終わる。途中でInput処理を考えなきゃだけど。まぁそれはおいおいコピペすることにしよう。


#   Window.h			ウィンドウ関連クラス ver1.4(未実験)

#ifndef __WINDOW_H__
#define __WINDOW_H__
//----------------------------------------------------------
// Window表示に関するヘッダ
//----------------------------------------------------------

// ライブラリ読み込み
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"imm32.lib")

// 使わない関数削除
//#define WIN32_LEAN_AND_MEAN

// インクルードファイル
#include <windows.h>	// ウィンドウズ標準
#include <windowsx.h>	// ウィンドウズ補佐

// 定数
#define WINMAIN() WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int lpCmdShow)	// WinMain関数を簡略化

class WindowClass			// ウィンドウ関連を完全にオブジェクト化
{
private:
	LPCWSTR		ClassName;		// ウィンドウクラス
	WNDCLASSEX	wcex;			// ウィンドウクラスEx構造体
    MSG			msg;			// メッセージ構造体
	HACCEL		hAccel;			//アクセラレーターテープルハンドル

	// ウィンドウプロシージャ関数のポインタ
	LRESULT		(*WndProc)(HWND, UINT, WPARAM, LPARAM);

public:
	HWND		hWnd;			// ウィンドウハンドル
	HINSTANCE	hInst;			// インスタンスハンドル
	bool		Active;			// アプリケーションの状態
	WindowClass();		// コントラクタ
	~WindowClass();		// デストラクタ

	// ウィンドウ・クラスの登録用メソッド
	ATOM InitApp(
		HINSTANCE hInstance,						// インスタンスハンドル
		WNDPROC WP,									// ウィンドウプロシージャ
		HCURSOR hCur = NULL,						// カーソル
		LPCTSTR lpszMenuName = NULL,				// メニュー
		HICON hIcon = NULL,							// アイコン
		HICON hIconSm = NULL,						// アイコンミニ
		UINT style = CS_HREDRAW | CS_VREDRAW		// ウィンドウスタイル
	);

	// ウィンドウの生成用メソッド
	BOOL InitWindow(
		LPCWSTR lpTitle = L"WindowTitle",			// ウィンドウタイトル
		DWORD style = WS_OVERLAPPEDWINDOW,			// オーバーラップド
		int width = CW_USEDEFAULT,					// 横幅
		int height = CW_USEDEFAULT,					// 縦幅
		int nCmdShow = SW_SHOW,						// 表示モード
		int x = CW_USEDEFAULT,						// x座標
		int y = CW_USEDEFAULT						// y座標
	);

	// メッセージループメソッド
	int MessageLoop_Normal();						// 引数いらず

	// メッセージループメソッド(アクセラレータ付き)
	int MessageLoop_Accelerator(LPCWSTR lptableName);// アクセラレータテーブルのリソースのアレ

	// ファイルオープン(保存などは含まない)
	int FileOpen(
		bool bSave,									// セーブモードならtrue
		LPTSTR lpFileName,							// 保存先ファイルネーム
		LPTSTR lpFileTitle,							// ファイルネームオンリー
		LPCTSTR lpFileFilter,						// ファイルフィルタ
		int nFilterIndex							// フィルタインデックス
	);
};

#endif



#   Window.cpp			ウィンドウ関連クラス	ver1.4


// インクルード
#include "Window.h"

//----------------------------------------------------------
// タイトル:コントラクタ
// 説明		:ウィンドウ表示に関する変数の初期化をします。
// 戻り値	:なし
//----------------------------------------------------------
WindowClass::WindowClass()
{
	memset(this,0,sizeof(WindowClass));	// 初期化
	ClassName	= L"WClass";			// ウィンドウクラス
	return;
}

//----------------------------------------------------------
// タイトル:デストラクタ
// 説明		:ウィンドウ表示に関する変数の開放をします。
// 戻り値	:なし
//----------------------------------------------------------
WindowClass::~WindowClass()
{
	return;
}

//----------------------------------------------------------
// タイトル:アプリケーションの初期化
// 説明		:ウィンドウ・クラスの登録をします。
// 戻り値	:RegisterClassEx(&wcex)
//----------------------------------------------------------
ATOM WindowClass::InitApp(HINSTANCE hInstance,WNDPROC WP,HCURSOR hCur,LPCTSTR lpszMenuName,HICON hIcon,HICON hIconSm,UINT style)
{
	hInst = hInstance;

	// 各メンバの設定
	wcex.cbSize			= sizeof(WNDCLASSEX);	// 構造体のサイズ
	wcex.style			= style;				// クラスのスタイル
	wcex.lpfnWndProc	= WP;					// ウィンドウプロシージャー
	wcex.cbClsExtra		= 0;					// 補助メモリ
	wcex.cbWndExtra		= 0;					// 補助メモリ
	wcex.hInstance		= hInst;				// インスタントハンドル
	wcex.hIcon			= hIcon;				// アイコン
	wcex.hIconSm		= hIconSm;				// 小さいアイコン
	wcex.hCursor		= hCur;					// カーソル
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);// 背景ブラシ
	wcex.lpszMenuName	= lpszMenuName;			// メニュー名
	wcex.lpszClassName	= ClassName;			// クラス名

	return (RegisterClassEx(&wcex));
}

//----------------------------------------------------------
// タイトル:インスタンスの初期化
// 説明		:ウィンドウの生成をします。
// 戻り値	:成功の場合、"true"を返します。
//----------------------------------------------------------
BOOL WindowClass::InitWindow(LPCWSTR lpTitle,DWORD style,int width,int height,int nCmdShow,int x,int y)
{
	hWnd = CreateWindow(
			ClassName,		// ウィンドウクラス
			lpTitle,		// タイトルバーにこの名前が表示されます
			style,			// ウィンドウの種類
			x,				// X座標
			y,				// Y座標
			width,			// 幅
			height,			// 高さ
			NULL,			// 親ウィンドウのハンドル、親を作るときはNULL
			NULL,			// メニューハンドル、クラスメニューを使うときはNULL
			hInst,			// インスタンスハンドル
			NULL);
	if (!hWnd)
		return FALSE;
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	return true;
}

//----------------------------------------------------------
// タイトル:メッセージループ(通常)
// 説明		:メッセージループを回します。
// 戻り値	:(int)msg.message
//----------------------------------------------------------
int WindowClass::MessageLoop_Normal()
{
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);				// 仮想キーメッセージの変換
        DispatchMessage(&msg);				// ウインドウプロシージャへ転送
    }
	return (int)msg.message;
}

//----------------------------------------------------------
// タイトル:メッセージループ(アクセラレータ)
// 説明		:メッセージループを回します。
// 戻り値	:(int)msg.message
//----------------------------------------------------------
int WindowClass::MessageLoop_Accelerator(LPCWSTR lptableName)
{
	hAccel = LoadAccelerators(hInst,lptableName);
    if (hAccel == NULL)
        MessageBox(hWnd,L"アクセラレータテーブルの取得に失敗",L"Error", MB_OK | MB_ICONWARNING);
    while (GetMessage(&msg, NULL, 0, 0)) {
        if (!TranslateAccelerator(hWnd, hAccel, &msg)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
	return (int)msg.message;
}