2010年3月31日水曜日

ウィンドウ表示とメッセージ処理

そろそろ新学期ということで、かわいいかわいい後輩も入ってくるそうです。

放課後にプログラムの部活みたいなのをやれればいいねーみたいな話になったので、そのときちょこっとだけ教えられるようにとWIN32API周りを復習しております。

何度やっても初期化のあたりは忘れるので、今超適当に組んだコードを保存しておく。今後はこいつのコピペで済ませよう…。
01#include <windows.h>
02#include <tchar.h>
03 
04//定数など
05namespace
06{
07    const TCHAR* APPNAME = _T("01CreateWindow");
08    const int APP_W = 400;
09    const int APP_H = 300;
10}
11 
12//メッセージ処理
13LRESULT 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//エントリポイント
25int 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の初期化でもやるか。

0 件のコメント:

コメントを投稿