下のコードをコンパイルしても、
WinMain KillTimer hr=ERROR_INVALID_WINDOW_HANDLE (0x00000578)
というエラーメッセージが出てうまく通りません。
エラーを無視する意味でKillTimerをせずにやってしまえば、特に問題ないのですが、後々問題が出てきても怖いので、直したいです。
メッセージ処理ループの手前でKillTimerを行うと、エラーは出ませんし、
メッセージ処理ループのすぐ後でSetTimerを行うと、SetTimerでエラーが出るので、
ループでおかしくなるのかな、と思いました。
プログラムをシェイプアップしてもエラーがとれませんし、
もしかして根本的な間違いがあるのでしょうか・・・?
#include <windows.h>
#include <dxerr9.h>
#define kWCLASS_NAME "WndClass" // ウィンドウクラス名
#define kWINDOW_NAME "Wnd" // ウィンドウ名
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow )
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= WndProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInst;
wcex.hIcon= NULL;
wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName= kWCLASS_NAME;
wcex.hIconSm= NULL;
RegisterClassEx(&wcex);
/* --- メイン・ウィンドウの作成 --- */
HWND hWnd;
hWnd = CreateWindow(kWCLASS_NAME, kWINDOW_NAME, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
/* --- ウィンドウの表示 --- */
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
/* --- タイマのセット --- */
if ( SetTimer( hWnd, 1, 1000, NULL ) == 0 ) // WM_TIMERはWndProcで処理
{ DXTRACE_ERR( "WinMain SetTimer", GetLastError() ); return -1; }
/* --- メッセージ処理ループ --- */
MSG msg;
ZeroMemory( &msg, sizeof( msg ) );
while ( msg.message != WM_QUIT ) // PostQuitMessage()が呼ばれたら終了
{
if ( !GetMessage( &msg, NULL, 0, 0 ) )
{ msg.message = WM_QUIT; }
else
{ TranslateMessage( &msg ); DispatchMessage( &msg ); }
}
/* --- タイマの破棄 --- */
if ( KillTimer( hWnd, 1 ) == 0 )
{ DXTRACE_ERR( "WinMain KillTimer", GetLastError() ); return -1; }
/* --- 終了処理 --- */
// ウィンドウクラスの登録解除
if ( UnregisterClass( kWCLASS_NAME, hInst ) == 0 )
{ DXTRACE_ERR( "WinMain UnregisterClass", GetLastError() ); return -1; }
return 0;
}
No.1ベストアンサー
- 回答日時:
メッセージループ抜けた後では、ウィンドウは破棄済みなのでは?
となると、そのウィンドウハンドルは無効なのでエラーになるものと思われます。
WM_CREATEでSetTimerして、WM_DESTROYでKillTimerすればよろしいのでは?
この回答への補足
めちゃ早い回答ありがとうございますw
確かにWM_CREATEでSetTimerやってるコードをよく見かけますが、そういう意味があったんですかね?
納得なので今すぐやってみようと思うのですが、
違うプログラムでメッセージループの後にKillTimerを実行してもエラーにならなかったので、
それについてはどうなのかな、とか思ったりします。
有難う御座いました。うまくできました。
正直1日費やしてわからなかったです・・・
言い訳としては、書籍についていたコードがその通りに間違ってて、
他にも自分と同じように勘違いする人がいないか多少心配です。
(DirectXの最近出た本です、心当たりのある人は間違えないで!!)
はたまた、こんな誤りに気づかない人はDirectXに手を出していないという話でしょうか。汗
あと、補足に書いた話ですが、今自分で試すとエラーとして出たので、
聞かなかったことにして下さい。汗汗
有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エディットボックスの背景の色...
-
この列挙体でsysjanの関数はあ...
-
画像を表示したいのですが……
-
不明なエラー
-
エラー Run-Time Check Failur...
-
COMPORTマルチスレッドで例外発生
-
子ウインドウの作成と破棄について
-
エディットコントロール入力時...
-
音量調節
-
WM_CREATE について
-
プログラミングでエラーが出ま...
-
Enterキーを押されたら次の処理...
-
fgetsなどのときのstdinのバッ...
-
マイナスからプラスへ転じた時...
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
「an=(n-1)/(n+1)のときlim[n→∞...
-
c言語で、繰り返し文の中で、0....
-
C言語での引数の省略方法
-
正負を反転させて出力するプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
ダイアログプログラムでEnterキ...
-
キャレットの現在位置の表示 (W...
-
PeekMessageについて
-
ウィンドウ非表示に時に表示し...
-
C#のswitch文を簡略化したいの...
-
C言語win32api、エディットボッ...
-
音量調節
-
LoadImageを使用し、タイトルバ...
-
プログラミングでエラーが出ま...
-
エディットコントロール入力時...
-
ウィンドウハンドルがメッセー...
-
ボタンの色(WINAPI)
-
画像を表示したいのですが……
-
WINAPIでキーから文字列を入力...
-
エラー Run-Time Check Failur...
-
エディットボックスの背景の色...
-
Win32APIでアイコンファイルを...
-
WM_KEYDOWNでPrtScを捕まえる方...
おすすめ情報