最近自分でDirectX9のライブラリを作りたいなと思い、作り始めたのですが
ウィンドウの生成部分で早速ひっかかりました
というのもウィンドウを閉じてもプログラムが生きたままという状況です
デバッグして調べると、どうもウィンドウプロシージャにHWNDを上手く渡せていないようでした
(常にウィンドウがまだ作成されていないと判断されている)
また、GetPropなどの関数の引数がデバッグモードとリリースモードで
LPCWSTRとLPCSTRと変わってしまい、困っています
はじめてのことばかりで苦戦しています
問題のウィンドウクラスの部分を添付しておきました
環境はVisual C++ Express Edition で言語はC++、OSはWindows Vistaです
ウィンドウの生成について
Re:ウィンドウの生成について
>というのもウィンドウを閉じてもプログラムが生きたままという状況です
んー、多分プロシージャの中で、WM_DESTROYのメッセージに対する処理、
つまり PostQuitMessage(0) を呼んでいないので、WM_QUITが来ず、
終了しないのではないでしょうか?
>どうもウィンドウプロシージャにHWNDを上手く渡せていないようでした
??
Re:ウィンドウの生成について
自分がよく理解してないようで申し訳ないです…
プロシージャをクラス内に入れてしまいたかったので色んなサイトを回りながら参考に書いたのですが
どうもどこか間違えてしまってるようです
上の赤で表示下部分が毎回実行されて、青の部分までたどりついていないような状況です
もう少し考えてみます
プロシージャをクラス内に入れてしまいたかったので色んなサイトを回りながら参考に書いたのですが
どうもどこか間違えてしまってるようです
LRESULT Window::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // thisポインタを得る LRESULT lret; Window *pTargetWnd = ( Window* )GetProp( hWnd, PROP_NAME ); // もしウィンドウが未生成なら if( pTargetWnd == NULL ) { // デフォルトのウィンドウプロシージャを呼び出す return DefWindowProc( hWnd, uMsg, wParam, lParam ); } // ウィンドウプロシージャ本体を呼び出す lret = pTargetWnd->WindowProc( hWnd, uMsg, wParam, lParam ); // もしウィンドウを破棄していたら if( uMsg == WM_NCDESTROY ) { // 終了手続き pTargetWnd->Detach(); } // プログラムの状態を返す return lret; } LRESULT Window::WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // プログラム状態に応じて switch( uMsg ) { case WM_DESTROY: // ウィンドウ終了時 PostQuitMessage( 0 ); // ウィンドウの終了を通知→PeekMessage関数 return 0; // 0の値を返す } // このプログラムで規定された処理外ならデフォルトの処理を行ってその値を返す return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
上の赤で表示下部分が毎回実行されて、青の部分までたどりついていないような状況です
もう少し考えてみます
Re:ウィンドウの生成について
>上の赤で表示下部分が毎回実行されて、青の部分までたどりついていないような状況です
なるほど。
では、SetProp()はどこかでしていますか?
していないと GetProp()で Window *は取れないので。
pTargetWndが NULLであろうが、非NULLであろうが動くようにするのであれば、
その赤い if分の上に uMsgが WM_DESTROYだったら PostQuitMessage()をするだけで
動くような気がします。
Re:ウィンドウの生成について
SetProp( m_hWndMain, PROP_NAME, (HANDLE)this );
という一行をInitWindow()関数の最後あたりに追加したら無事動作しました
SetPropを行わないとGetPropはできなかったのですね
この度は本当にありがとうございました
という一行をInitWindow()関数の最後あたりに追加したら無事動作しました
SetPropを行わないとGetPropはできなかったのですね
この度は本当にありがとうございました