2010年3月31日水曜日

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

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

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

何度やっても初期化のあたりは忘れるので、今超適当に組んだコードを保存しておく。今後はこいつのコピペで済ませよう…。
#include <windows.h>
#include <tchar.h>

//定数など
namespace
{
    const TCHAR* APPNAME = _T("01CreateWindow");
    const int APP_W = 400;
    const int APP_H = 300;
}

//メッセージ処理
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, msg, wp, lp);
}

//エントリポイント
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, TCHAR*, int)
{
    //ウィンドウクラスの登録
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = (HICON)LoadIcon(NULL, IDI_APPLICATION);
    wc.lpfnWndProc = MyWndProc;
    wc.hInstance = hInst;
    wc.lpszClassName = APPNAME;

    //クラス登録
    if(!RegisterClass(&wc))
    {
        //メッセージなどを出して終了
        exit(1);
    }

    //ウィンドウサイズの調整
    RECT r;
    SetRect(&r, 0, 0, APP_W, APP_H);
    AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE);

    //ウィンドウの作成
    HWND hWnd = CreateWindow(APPNAME, APPNAME,
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
        r.right - r.left, r.bottom - r.top,
        NULL, NULL, hInst, NULL);

    //作成できない場合のエラー処理
    if(!hWnd)
    {
        //メッセージなどを出して終了
        exit(1);
    }

    //ウィンドウの表示
    ShowWindow(hWnd, SW_SHOW);

    //メインループ
    while(true)
    {
        //メッセージ処理
        MSG msg;
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            DispatchMessage(&msg);
        }
        //終了時はループからぬける
        if(msg.message == WM_QUIT) break;

        //この辺にメインロジックを書く
    }
    return 0;
}
こんなのが出ます。
PeekMessageを使っているのは、今後このスケルトンをゲーム用に拡張していくため。GetMessageとかは使わないです。ポーリングも自前でできればいいけど、面倒なときはメインループの末端にSleep(1)とか入れとけばいい。次回はDirect3D9の初期化でもやるか。

0 件のコメント:

コメントを投稿