101 case WM_CLOSE:
102 id = MessageBox(hWnd,"終了する?","",MB_YESNO);
103 if(id == IDYES)DestroyWindow(hWnd);
104 break;
105 case WM_DESTROY:
106 PostQuitMessage(0);
107 break;
103行目が実行されたら、WM_DESTROY が発生します。
そしたらそのまま104、105、106行目が順に実行されるんですか?
それとも、103が実行されたら104が実行される前に、
新しいプロセスで WM_DESTROY が入った WndProc( ) が
実行されて、それと同時に104が実行されて break で
ループが終了するんですか?
No.1ベストアンサー
- 回答日時:
まず、プロセスというのは、この場合は関係なくて、
DestroyWindow を実行すると、内部で WndProc が呼び出されるのと同等な流れになると考えていいです。
DispatchMessage→WndProc(WM_CLOSE)→102→103→WndProc(WM_DESTROY)→106→107→return→104→return
とういうように、WM_CLOSE のメッセージを処理している途中で、WM_DESTROY が実行されます。
ありがとうございます。
プロセスとスレッドがよく分かってないんです。
103行目が実行されたら、そこで、プロセスかスレッドの
ような流れAが止まって、新しい流れBが WndProc(WM_DESTROY) で
動作して、Bによって101から104は読み込まれるけど
実行されず、105で case が当てはまって 106 が実行されて
107が読み込まれて、ソースには書いてないけど WndProc( ) の
最後の return 0 が実行されてBが終了し、Aの続きが再開されて、
104から順に読み込まれて、WndProc( ) の最後の return 0 が
実行されてAが終了する。
これで合っていますか?
No.3
- 回答日時:
あまり複雑な事は考えないほうがいいと思います。
実際にはもっと複雑なんでしょうけど、WndProcを呼ぶ形としては
次の種類があると思います。
1.SendMessageのように戻りを取得するもの
2.PostMessageのようにメッセージキューに送信するだけのもの
1の場合には、inthefloiさんが言ってるように間接的にWndProc関数を呼び出す
ような感じになります。
もしWndProc内から行った場合には再起呼び出しと同じようになると思います。
実際には違いますがこう考えてはどうでしょう
100 LONG DestroyWindow(...)
101 {
102 return WndProc(WM_DESTROY,...)
103 }
104
105 LRESULT CALLBACK WndProc(...)
106 {
107 switch( uMsg )
108 {
109 case WM_CLOSE:
110 DestroyWindow(hWnd);
111 break;
112 case WM_DESTROY:
113 PostQuitMessage(0);
そうすると
WndProc(110)
DestroyWindow(102)
WndProc(113)
DestroyWindow(103)
WndProc(111)
みたいな感じになると思います。
No.2
- 回答日時:
>これで合っていますか?
なぜスレッドにこだわるのかがわかりません。
DestroyWindow の中でカレントスレッドを一時停止させて、新しいスレッドを作成して、WndProc を呼び出すのなら、カレントスレッドがそのまま WndProc を呼び出した方が無駄な事をしないぶんだけ有利です。
>Bによって101から104は読み込まれるけど実行されず
申し訳ないのですが、読み込まれるというのが何を意味しているのか私にはわかりません。switch-case を別の書き方をしてみると、
switch (m)
{
case WM_CLOSE:
// 処理A
break;
case WM_DESTROY:
// 処理B
break;
}
↓
if (m == WM_CLOSE) {
// 処理A
}
else if (m == WM_DESTROY) {
// 処理B
}
となるわけだから、スレッドが作成されるかどうかに関係なく、実行されない部分は実行されません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- その他(車) 1.461秒で、0km/h→100km/h 3 2022/10/16 21:34
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
PowerPointで時計表示
-
VBA ステータスバー DoEvents
-
if(1){...}とはどういうことで...
-
C#でボタン名を変更しても動く
-
1つのVBAコードをすべてのコア...
-
ラベルの色がかわってくれない
-
条件に一致しない行を全て削除...
-
以下のコードを実行しても、オ...
-
一定時間ごとの実行
-
javascriptで最初のところに戻...
-
既存のwebサイトで、ローカルの...
-
VB.netの重複データ数カウント...
-
オーバーライドについて。
-
jQuery ui Datepicker 明日以降...
-
VBA SORT Applyでエラー
-
〔Excel:VBA〕マクロの実行が異...
-
VBScript タイマー
-
JavaScriptで、実行するたび値...
-
innerHTMLなどの反映タイミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
if(1){...}とはどういうことで...
-
VBA ステータスバー DoEvents
-
〔Excel:VBA〕マクロの実行が異...
-
PowerPointで時計表示
-
jQuery ui Datepicker 明日以降...
-
VB.netの重複データ数カウント...
-
VBA SORT Applyでエラー
-
デザイン時のVisible=Falseは実...
-
1つのVBAコードをすべてのコア...
-
C#でボタン名を変更しても動く
-
JavaScriptでショートカットキ...
-
ラベルの色がかわってくれない
-
リクエスト結果が一瞬しか表示...
-
eval()の危険性の具体例を教え...
-
resizeToメソッドが動作しません
-
CreateFile、CloseHandleの繰り...
-
GoTo文とかSelect文の処理の仕...
-
初心者です。gulpでコンパイル...
-
innerHTMLなどの反映タイミング
おすすめ情報