コメント付ける派?付けない派?


もうすぐ,院試の結果発表なのでドキドキな今日この頃.
DirectDrawをクラス化する前に,ウインドウを初期化しようと思った.
・・・・・・
詰まった.

とりあえず,「ウインドウを作る」メソッドを作るとこまではフツーにできたが,
問題は,コールバック関数をどうするかだ.

コールバックは OS の方から呼ばれる関数だよねぇ・・・
んじゃ,プログラム開始の時からメソッドが存在してないといけない気がするから,
ウインドウプロシージャをstaticで作るよねー.

ありま,staticな関数の中じゃ,staticなメンバ変数しかアクセスできないじゃん.
さーて,どうしましょ.

とにかく,staticなウインドウプロシージャの中で,ウインドウのポインタを取得できればよくて.
そのポインタを使って各メッセージを処理したい.

イメージとしてはこんな感じ.

//------------------------------------------------------------------------------//
//    ウインドウクラス                                                          //
//------------------------------------------------------------------------------//
class Window
{
protected :
    HWND m_hWnd ;

    LRESULT Dispatch ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
public :
    static LRESULT CALLBACK WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
}

//------------------------------------------------------------------------------//
// コールバック                                                                 //
//------------------------------------------------------------------------------//
LRESULT CALLBACK Window::WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    // こんな感じでハンドルわたしたら ウインドウのポインタ取得できたらいいなー.
    Window * wnd = ::GetWindowPointer ( hWnd );

    // ウインドウごとに処理
    wnd->Dispatch ( hWnd, message, wParam, lParam );    
}

//------------------------------------------------------------------------------//
// イベントの処理                                                               //
//  こんな感じでメッセージを処理していこうかなー.                               //
//------------------------------------------------------------------------------//
LRESULT Window::Dispatch ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch ( message ) {
        case WM_PAINT :
            ......
        break ;

        case WM_DESTROY :
            ......
        break ;
    }
}
で,一応ハンドル渡したらウインドウポインタ渡すっていうのはできました.

んが,ウインドウ継承して使いたいなー,と思ったので, Dispatch を virtual にしたら,
落ちます.なんでー?

ムカムカー!! また勘違いしてるのかー!ワシは・・・!?
むふー!!
ポインタの渡し方がまずかったのか?
コールバックの中で virtual関数使ったら駄目なのか?

うーむ,というわけで,ウインドウのクラス化がうまくいかないのでゲームつくりもストッピな今日この頃・・・
ダレカ・タスケテー!


< Back to Diary.