- ベストアンサー
メモ帳もどきの作成で固まる
当方は今、猫でもわかるプログラミングでメモ帳もどきを作ったんですが、メニューバーにある表示から情報ウィンドウのチェックを外して タイトルバーの×ボタンを押すとフリーズします。 キーボード入力はできるのですが何故かエディットウィンドウに|がでてきません。開くとかマウスの中央ボタンを押して引きずると元に戻るのですが、自分ではプロシージャにメッセージが届いていないような気がするんです。どうしてこうなるのでしょうか? 開発環境は MicrosoftVisualStdio.NET2003です。 OSはXP SP3
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
メッセージループ部分のソースコードとコールバック関数のソースコードを載せていただければ何かわかるかもしれません。
お礼
全部のソースを載せるのは無理ですね。 怪しいと思う部分を載せておきます。 また質問があれば載せますのでよろしくお願いします。 //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { ~~~~~~~省略~~~~~~ case WM_SIZE: if (bInfo) info_h = 50; else info_h = 0; MoveWindow(hEdit, 0, 0, LOWORD(lp), HIWORD(lp) - info_h, TRUE); if (bInfo) MoveWindow(hEdit2,150, HIWORD(lp) -50,LOWORD(lp) - 150,50,TRUE); break; メニューウィンドウで情報ウィンドウタグにクリックした時の処理 case IDM_INFO: GetWindowRect(hWnd, &rc); if(bInfo) { bInfo = FALSE; ShowWindow(hEdit2, SW_HIDE); } else { bInfo = TRUE; ShowWindow(hEdit2, SW_NORMAL); } GetClientRect(hWnd, &rc); SendMessage(hWnd, WM_SIZE,(WPARAM)SIZE_RESTORED,MAKELPARAM(rc.right, rc.bottom)); break; メニューが表示される時の処理 case WM_INITMENU: ~~~~~省略~~~~ mi.cbSize = sizeof(MENUITEMINFO); mi.fMask = MIIM_STATE; if (bInfo) { mi.fState = MFS_CHECKED; SetMenuItemInfo(hMenu, IDM_INFO, FALSE, &mi); } else { mi.fState = MFS_UNCHECKED; SetMenuItemInfo(hMenu, IDM_INFO, FALSE, &mi); } ~~~~~~~省略~~~~~ break;
補足
ソースを載せないと矢張り分かりにくいですね。 下記にソースを載せておきます。 ここはメッセージループ部分です。 while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { if(!TranslateAccelerator(hMain, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } メッセージループ部分です。他はかけないので別に載せます。 IDM_INFOで情報ウィンドウをクリックした時の処理が実行されます。 ウィンドウのエディットを消したり、表示したりできるんですが、 消したとき×ボタンを押すと固まってしまいます。