回答編集履歴
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 | 
            +
            ```
         | 
