stg > main

main.hpp : ver090227

  1. #pragma once
  2.  
  3. #include "siki/d3d/gamewindow.hpp"
  4.  
  5. #include "resource.h"
  6.  
  7. namespace stg{
  8.  
  9. ATOM RegisterStg0Class(HINSTANCE hInstance);
  10. HWND InitInstance(HINSTANCE hInstance, int nCmdShow);
  11. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  12. INT_PTR CALLBACK About(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  13.  
  14. } // namespace stg
  15.  

main.cpp : ver090227

  1. // StgMain.cpp : アプリケーションのエントリ ポイントを定義します。
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <windows.h>
  7. #include <d3d9.h>
  8. #include <d3dx9.h>
  9. #include <boost/bind.hpp>
  10. #include <boost/function.hpp>
  11. #include <boost/lambda/lambda.hpp>
  12. #include <boost/lambda/if.hpp>
  13. #include "main.hpp"
  14. #include "game/stggame.hpp"
  15. #include "siki/util/bit.hpp"
  16. #include "siki/d3d/d3dutil.hpp"
  17. #include "siki/d3d/gamewindow.hpp"
  18.  
  19.  
  20. using namespace boost;
  21.  
  22. #define MAX_LOADSTRING 100
  23.  
  24. // グローバル変数:
  25. HINSTANCE hInst; // 現在のインターフェイス
  26. TCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト
  27. TCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名
  28.  
  29. /***
  30.  *** WinMain
  31.  ***
  32.  *** アプリケーションのエントリポイント
  33.  ***/
  34. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  35. LPTSTR lpCmdLine, int nCmdShow){
  36. int ret = 0;
  37.  
  38. // グローバル文字列を初期化
  39. ::LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  40. ::LoadString(hInstance, IDC_STG0, szWindowClass, MAX_LOADSTRING);
  41.  
  42. stg::RegisterStg0Class(hInstance);
  43.  
  44. // アプリケーションの初期化
  45. HWND hwnd = stg::InitInstance(hInstance, nCmdShow);
  46. if (!hwnd){
  47. return ret;
  48. }
  49.  
  50. /* ウィンドウの作成 */
  51. siki::d3d::GameWindow<stg::game::StgGame> window(hwnd);
  52.  
  53.  
  54. /* ループ開始 */
  55. try {
  56. HACCEL hAccelTable = ::LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_STG0));
  57. ret = static_cast<int>(window.MessageLoop(hAccelTable));
  58. } catch (...){
  59. /* 捕捉しきれていない例外あり */
  60. ret = -1;
  61. }
  62.  
  63. return ret;
  64. }
  65.  
  66.  
  67. namespace stg{
  68.  
  69.  
  70. /***
  71.  *** ATOM RegisterStg0Class(HINSTANCE hInstance)
  72.  ***
  73.  *** ウィンドウクラスを登録します。
  74.  ***
  75.  *** コメント:
  76.  ***
  77.  *** この関数および使い方は、'RegisterClassEx' 関数が追加された
  78.  *** Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。
  79.  *** アプリケーションが、関連付けられた
  80.  *** 正しい形式の小さいアイコンを取得できるようにするには、
  81.  *** この関数を呼び出してください。
  82.  ***/
  83. ATOM RegisterStg0Class(HINSTANCE hInstance){
  84. WNDCLASSEX wcex;
  85. wcex.cbSize = sizeof(WNDCLASSEX);
  86. wcex.style = CS_HREDRAW | CS_VREDRAW;
  87. wcex.lpfnWndProc = WndProc;
  88. wcex.cbClsExtra = 0;
  89. wcex.cbWndExtra = 0;
  90. wcex.hInstance = hInstance;
  91. wcex.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_STG0));
  92. wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW);
  93. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  94. wcex.lpszMenuName = MAKEINTRESOURCE(IDC_STG0);
  95. wcex.lpszClassName = szWindowClass;
  96. wcex.hIconSm = ::LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  97. return RegisterClassEx(&wcex);
  98. }
  99.  
  100. /***
  101.  *** 関数: InitInstance(HINSTANCE, int)
  102.  ***
  103.  *** 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。
  104.  ***
  105.  *** コメント:
  106.  ***
  107.  *** この関数で、グローバル変数でインスタンス ハンドルを保存し、
  108.  *** メイン プログラム ウィンドウを作成および表示します。
  109.  ***/
  110. HWND InitInstance(HINSTANCE hInstance, int nCmdShow){
  111. HWND hWnd = NULL;
  112.  
  113. hInst = hInstance; // グローバル変数にインスタンス処理を格納します。
  114.  
  115. hWnd = ::CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  116. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  117.  
  118. if (!hWnd){
  119. return NULL;
  120. }
  121.  
  122. ::ShowWindow(hWnd, nCmdShow);
  123. ::UpdateWindow(hWnd);
  124.  
  125. return hWnd;
  126. }
  127.  
  128. /***
  129.  *** 関数: WndProc(HWND, UINT, WPARAM, LPARAM)
  130.  ***
  131.  *** 目的: メイン ウィンドウのメッセージを処理します。
  132.  ***
  133.  *** WM_COMMAND - アプリケーション メニューの処理
  134.  *** WM_PAINT - メイン ウィンドウの描画
  135.  *** WM_DESTROY - 中止メッセージを表示して戻る
  136.  ***/
  137.  
  138. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
  139. int wmId, wmEvent;
  140. PAINTSTRUCT ps;
  141. HDC hdc;
  142.  
  143. switch (message){
  144. case WM_COMMAND:
  145. wmId = LOWORD(wParam);
  146. wmEvent = HIWORD(wParam);
  147. // 選択されたメニューの解析:
  148. switch (wmId){
  149. case IDM_ABOUT:
  150. ::DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  151. break;
  152. case IDM_EXIT:
  153. ::DestroyWindow(hWnd);
  154. break;
  155. default:
  156. return ::DefWindowProc(hWnd, message, wParam, lParam);
  157. }
  158. break;
  159. case WM_PAINT:
  160. hdc = BeginPaint(hWnd, &ps);
  161. // TODO: 描画コードをここに追加してください...
  162. ::EndPaint(hWnd, &ps);
  163. break;
  164. case WM_DESTROY:
  165. ::PostQuitMessage(0);
  166. break;
  167. default:
  168. return ::DefWindowProc(hWnd, message, wParam, lParam);
  169. }
  170. return 0;
  171. }
  172.  
  173.  
  174. /***
  175.  *** バージョン情報ボックスのメッセージ ハンドラです。
  176.  ***/
  177. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
  178. UNREFERENCED_PARAMETER(lParam);
  179. switch (message){
  180. case WM_INITDIALOG:
  181. return (INT_PTR)TRUE;
  182.  
  183. case WM_COMMAND:
  184. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){
  185. ::EndDialog(hDlg, LOWORD(wParam));
  186. return (INT_PTR)TRUE;
  187. }
  188. break;
  189. }
  190. return (INT_PTR)FALSE;
  191. }
  192.  
  193.  
  194. } // namespace stg
  195.  

[09/02/27 18:47][履歴][編集]
最終更新:2009年02月27日 18:47