Dirext3DX UtilityLibrary を使う 2 ベースプロジェクト その2

65で使用したプロジェクトはWinMainが見えないのでその2としてWinmainその他が全部変更できるプロジェクトを作成する。

プロジェクトの作成の手順は

1 新規作成>Win32アプリケーション>空のプロジェクト を作成する。
2 プロジェクトの設定のリンクに dxguid.lib winmm.lib ddraw.lib d3dim.lib d3dxof.lib d3dframe.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
と設定する。

3 d3dframe.lib というファイル(VC++用)がDirectX7のサンプルの中にあるので探してきてプロジェクトのディレクトリにコピーする。
4 メインのソースの内容は以下のとおり。
 

///--------------------------------------------------------
// File: XFile.cpp
// Note: This code uses the D3D Framework helper library.
//---------------------------------------------------------
#define STRICT
#define D3D_OVERLOADS
#include <windows.h>
#include <commdlg.h>
#include <math.h>
#include <stdio.h>
#include "D3DApp.h"
#include "D3DTextr.h"
#include "D3DUtil.h"
#include "D3DMath.h"
#include "D3DFile.h"
//#include "resource.h"
 
#define IDM_LOADFILE 300
 
//------------------------------------------------------
// Name: class CMyD3DApplication
//------------------------------------------------------
class CMyD3DApplication : public CD3DApplication
{
 HRESULT LoadFile();
 
 protected:
 HRESULT OneTimeSceneInit();
 HRESULT InitDeviceObjects();
 HRESULT DeleteDeviceObjects();
 HRESULT Render();
 HRESULT FrameMove( FLOAT fTimeKey );
 HRESULT FinalCleanup();
 
 public:
 CMyD3DApplication();
 
 LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
};
 
//------------------------------------------------------
// Name: WinMain()
//------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
{
 CMyD3DApplication d3dApp;
 
 if( FAILED( d3dApp.Create( hInst, strCmdLine ) ) )
  return 0;
 
 return d3dApp.Run();
}
 
//------------------------------------------------------
// Name: CMyD3DApplication()
//------------------------------------------------------
CMyD3DApplication::CMyD3DApplication()
:CD3DApplication()
{
 m_strWindowTitle = TEXT( "XFile: Loading .X files in D3DIM" );
 m_bAppUseZBuffer = TRUE;
 m_bShowStats = TRUE;
 m_fnConfirmDevice = NULL;
}
 
//------------------------------------------------------
// 初期化
//------------------------------------------------------
HRESULT CMyD3DApplication::OneTimeSceneInit()
{
 
return S_OK;
}
 
//------------------------------------------------------
// シーンを組み立てる(演算)
//------------------------------------------------------
HRESULT CMyD3DApplication::FrameMove( FLOAT fTimeKey )
{
 
 return S_OK;
}
 
//------------------------------------------------------
// 描画
//------------------------------------------------------
HRESULT CMyD3DApplication::Render()
{
 // Clear the viewport
 m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,// 最初にクリア
 0x000000ff, 1.0f, 0L );
 
 return S_OK;
}
 
//------------------------------------------------------
// オブジェクトの初期化
//------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
 // Load a DirectX .X file the first time around
 static BOOL bFirstInstance = TRUE;
 
 return S_OK;
}
 
//------------------------------------------------------
// オブジェクトの消去
//------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
 D3DTextr_InvalidateAllTextures();
 
 return S_OK;
}
 
//------------------------------------------------------
// 終了
//------------------------------------------------------
HRESULT CMyD3DApplication::FinalCleanup()
{
 return S_OK;
}
 
//-------------------------------------------------------
// オブジェクトのサイズ変更
//-------------------------------------------------------
BOOL CalcFileObjectSizeCB( CD3DFileObject* pObject, D3DMATRIX* pmat,
VOID* pContext )
{
 // Keep enumerating file objects
 return FALSE;
}
 
//-------------------------------------------------------
// ファイルのロード
//-------------------------------------------------------
HRESULT CMyD3DApplication::LoadFile()
{
 // Return successful
 return S_OK;
}
 
//-------------------------------------------------------
// Name: MsgProc()
// Desc: App custom WndProc function for handling mouse and keyboard input.
//-------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam )
{
switch( uMsg )
{
case WM_COMMAND:
 // Handle menu and key commands
 switch( LOWORD(wParam) )
{
 
case IDM_LOADFILE: //-----メニューのIDがここに来る
 Pause( TRUE );
 LoadFile();
 Pause( FALSE );
 break;
}
 break;
 
case WM_LBUTTONDOWN:
 break;
 
case WM_LBUTTONUP:
 // The user released the left mouse button
break;
}
 
// Fall through to the app's main windows proc function
return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
}
 

まず、アイコンを作成する方法は

1 挿入>リソース>アイコン  で新規作成する。  か、
2 挿入>インポート>アイコンをインポート  かどちらか。
3 アイコンができたら、一度閉じて、rc という拡張子がついたウィンドウをファイル>名前を付けて保存を選択する。名前はそのままで良い。
4 resource.h と、何とか.rc というファイルが出来るので両方ともプロジェクトに追加する
5 リビルドする。

以上で、アイコンが作成されて実行ファイルのアイコンが変更される。

メニューを作成する方法は、

1 挿入>リソース>MENU を選択する
2 メニュー部分をダブルクリックしてFILEとする。
3 ポップアップメニューにload file とENDを入力する。別の名前でも良いが。以下の感じ。



4 IDに適当な名前を付ける。
5 d3dapp.cpp というファイルがあなたのコンピュータのどこかにあるので、探してきてプロジェクトのディレクトリにコピーする。
6 d3dapp.cpp に #include "resource.h" を追加する。
7 d3dapp.cpp の中に HRESULT CD3DApplication::Create( HINSTANCE hInst, TCHAR* strCmdLine )
という関数があるので、その中の青い部分をコメントにして赤い部分を追加する。
 

// Register the window class
/* WNDCLASS wndClass = { 0, WndProc, 0, 0, hInst,
LoadIcon( hInst, MAKEINTRESOURCE(IDI_MAIN_ICON) ),
LoadCursor( NULL, IDC_ARROW ),
(HBRUSH)GetStockObject(WHITE_BRUSH),
NULL, _T("D3D Window") };
RegisterClass( &wndClass );
*/

 
WNDCLASS wndClass;
 
wndClass.style =CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc =WndProc;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =0;
wndClass.hInstance =hInst;
wndClass.hIcon =LoadIcon( hInst, MAKEINTRESOURCE(IDI_MAIN_ICON) );
wndClass.hCursor =LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName ="IDR_MENU1"; //----- ここにメニューの名前を入れる
wndClass.lpszClassName ="D3D Window";

 
if (!RegisterClass(&wndClass))
return FALSE;

 
// Create the render window
m_hWnd = CreateWindow( _T("D3D Window"), m_strWindowTitle,
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, 0L,
LoadMenu( hInst, MAKEINTRESOURCE(IDR_MENU1) ), //-----ここのメニュー名も作った名前に変更
hInst, 0L );
UpdateWindow( m_hWnd );
 

また、メニューをプロジェクトに追加するためにメニューの名前を作ったメニュー名に変更しておく。

最後にプロジェクトに d3dapp.cpp を追加する。
これをビルドして実行するとメニューが追加されている。
オブジェクト指向のVC++の作法を無視した乱暴な方法なのでよろしくないのだが。