ウィンドウの生成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nayo

ウィンドウの生成について

#1

投稿記事 by nayo » 16年前

最近自分でDirectX9のライブラリを作りたいなと思い、作り始めたのですが
ウィンドウの生成部分で早速ひっかかりました

というのもウィンドウを閉じてもプログラムが生きたままという状況です
デバッグして調べると、どうもウィンドウプロシージャにHWNDを上手く渡せていないようでした
(常にウィンドウがまだ作成されていないと判断されている)

また、GetPropなどの関数の引数がデバッグモードとリリースモードで
LPCWSTRとLPCSTRと変わってしまい、困っています

はじめてのことばかりで苦戦しています
問題のウィンドウクラスの部分を添付しておきました
環境はVisual C++ Express Edition で言語はC++、OSはWindows Vistaです

nayo

Re:ウィンドウの生成について

#2

投稿記事 by nayo » 16年前

今少し試したところ
LPCWSTRとLPCSTRと変わってしまうのはプロジェクトの設定の文字セットが原因でした
これについては解決です

Justy

Re:ウィンドウの生成について

#3

投稿記事 by Justy » 16年前


>というのもウィンドウを閉じてもプログラムが生きたままという状況です

 んー、多分プロシージャの中で、WM_DESTROYのメッセージに対する処理、
つまり PostQuitMessage(0) を呼んでいないので、WM_QUITが来ず、
終了しないのではないでしょうか?



>どうもウィンドウプロシージャにHWNDを上手く渡せていないようでした

 ??

nayo

Re:ウィンドウの生成について

#4

投稿記事 by nayo » 16年前

自分がよく理解してないようで申し訳ないです…
プロシージャをクラス内に入れてしまいたかったので色んなサイトを回りながら参考に書いたのですが
どうもどこか間違えてしまってるようです
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 );
}



上の赤で表示下部分が毎回実行されて、青の部分までたどりついていないような状況です
もう少し考えてみます

Justy

Re:ウィンドウの生成について

#5

投稿記事 by Justy » 16年前


>上の赤で表示下部分が毎回実行されて、青の部分までたどりついていないような状況です

 なるほど。
 では、SetProp()はどこかでしていますか?
 していないと GetProp()で Window *は取れないので。

 pTargetWndが NULLであろうが、非NULLであろうが動くようにするのであれば、
その赤い if分の上に uMsgが WM_DESTROYだったら PostQuitMessage()をするだけで
動くような気がします。

nayo

Re:ウィンドウの生成について

#6

投稿記事 by nayo » 16年前

SetProp( m_hWndMain, PROP_NAME, (HANDLE)this );

という一行をInitWindow()関数の最後あたりに追加したら無事動作しました
SetPropを行わないとGetPropはできなかったのですね

この度は本当にありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る