放課後にプログラムの部活みたいなのをやれればいいねーみたいな話になったので、そのときちょこっとだけ教えられるようにとWIN32API周りを復習しております。
何度やっても初期化のあたりは忘れるので、今超適当に組んだコードを保存しておく。今後はこいつのコピペで済ませよう…。
01 | #include <windows.h> |
02 | #include <tchar.h> |
03 |
04 | //定数など |
05 | namespace |
06 | { |
07 | const TCHAR * APPNAME = _T( "01CreateWindow" ); |
08 | const int APP_W = 400; |
09 | const int APP_H = 300; |
10 | } |
11 |
12 | //メッセージ処理 |
13 | LRESULT CALLBACK MyWndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) |
14 | { |
15 | switch (msg) |
16 | { |
17 | case WM_DESTROY: |
18 | PostQuitMessage(0); |
19 | return 0; |
20 | } |
21 | return DefWindowProc(hWnd, msg, wp, lp); |
22 | } |
23 |
24 | //エントリポイント |
25 | int WINAPI _tWinMain( HINSTANCE hInst, HINSTANCE , TCHAR *, int ) |
26 | { |
27 | //ウィンドウクラスの登録 |
28 | WNDCLASS wc; |
29 | memset (&wc, 0, sizeof (wc)); |
30 | wc.hbrBackground = ( HBRUSH )GetStockObject(WHITE_BRUSH); |
31 | wc.hCursor = ( HCURSOR )LoadCursor(NULL, IDC_ARROW); |
32 | wc.hIcon = ( HICON )LoadIcon(NULL, IDI_APPLICATION); |
33 | wc.lpfnWndProc = MyWndProc; |
34 | wc.hInstance = hInst; |
35 | wc.lpszClassName = APPNAME; |
36 |
37 | //クラス登録 |
38 | if (!RegisterClass(&wc)) |
39 | { |
40 | //メッセージなどを出して終了 |
41 | exit (1); |
42 | } |
43 |
44 | //ウィンドウサイズの調整 |
45 | RECT r; |
46 | SetRect(&r, 0, 0, APP_W, APP_H); |
47 | AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE); |
48 |
49 | //ウィンドウの作成 |
50 | HWND hWnd = CreateWindow(APPNAME, APPNAME, |
51 | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, |
52 | r.right - r.left, r.bottom - r.top, |
53 | NULL, NULL, hInst, NULL); |
54 |
55 | //作成できない場合のエラー処理 |
56 | if (!hWnd) |
57 | { |
58 | //メッセージなどを出して終了 |
59 | exit (1); |
60 | } |
61 |
62 | //ウィンドウの表示 |
63 | ShowWindow(hWnd, SW_SHOW); |
64 |
65 | //メインループ |
66 | while ( true ) |
67 | { |
68 | //メッセージ処理 |
69 | MSG msg; |
70 | while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) |
71 | { |
72 | DispatchMessage(&msg); |
73 | } |
74 | //終了時はループからぬける |
75 | if (msg.message == WM_QUIT) break ; |
76 |
77 | //この辺にメインロジックを書く |
78 | } |
79 | return 0; |
80 | } |
PeekMessageを使っているのは、今後このスケルトンをゲーム用に拡張していくため。GetMessageとかは使わないです。ポーリングも自前でできればいいけど、面倒なときはメインループの末端にSleep(1)とか入れとけばいい。次回はDirect3D9の初期化でもやるか。