回答編集履歴
2
修正例の単純化
answer
CHANGED
@@ -14,7 +14,6 @@
|
|
14
14
|
ret = GetMessage( &msg, NULL, 0, 0 );
|
15
15
|
if( ret == -1 ) break;
|
16
16
|
DispatchMessage( &msg );
|
17
|
-
if( ret == 0 ) break;
|
18
|
-
if( ret == WM_DESTROY ) break;
|
17
|
+
if( ret == WM_DESTROY ) break; /* WM_QUITではない */
|
19
18
|
}
|
20
19
|
```
|
1
加筆修正
answer
CHANGED
@@ -1,12 +1,20 @@
|
|
1
|
-
疑問にすべて答えることはできませんが、断片的なヒントだけでもと。
|
2
|
-
|
3
|
-
|
1
|
+
プロセスが終了しなかった理由ですが、「文字通り」プログラムが終了していなかったからです。
|
4
2
|
ShowColorWindow関数をご覧ください。
|
5
3
|
```C
|
6
4
|
while( true ){
|
7
5
|
GetMessage( &msg, NULL, 0, 0 );
|
8
6
|
DispatchMessage( &msg );
|
9
7
|
}
|
10
|
-
```
|
8
|
+
```どのようなときにこのループは終了しますか?
|
11
|
-
というのが答えです。ウインドウが破棄されても
|
9
|
+
というのが答えです。ウインドウが破棄されてもここから出られず、return文に到達しなかったため、プログラムが終了しなかったのです。
|
12
|
-
なので、メッセージIDをチェックして
|
10
|
+
なので、メッセージIDをチェックしてループを抜ける処理を追加すると正しく動作するようになります。
|
11
|
+
```C
|
12
|
+
int ret;
|
13
|
+
while( true ){
|
14
|
+
ret = GetMessage( &msg, NULL, 0, 0 );
|
15
|
+
if( ret == -1 ) break;
|
16
|
+
DispatchMessage( &msg );
|
17
|
+
if( ret == 0 ) break;
|
18
|
+
if( ret == WM_DESTROY ) break;
|
19
|
+
}
|
20
|
+
```
|