////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2002 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2002/11/18(Mon) No.183
    配信数： 3550 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００２年１１月１８日（月）の更新              */
http://www.kab-studio.com/

・ほとはー１話追加。
　三人合体ホットハーブに１話追加しました。パプリカが……。
[ 三人合体ホットハーブ ]
http://www.kab-studio.com/Comic/HotHerb/


////////////////////////////////////////////////////////////////////
/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2002/11/10 (Sun)
　ＡｉｒＨ” かなり不調。ほとはーとぷらとわ。 Ever17 の同人誌描きた
い。「冬コミ」。 Ever17 の子守歌……。ヨドバシとビックカメラ、どっち
に貯めるか。また継ながらない……。

2002/11/11 (Mon)
　Ever17 ４コマその１。キャラの魅力とかもあるのよー。お仕事は飽きて
ないのにかなり眠かった。ＡｉｒＨ”機種交換。でも不調直らず。 Ever17 
サントラに子守歌がない……。「ブルージェンダー」。

2002/11/12 (Tue)
　会社を休む。そして寝続ける。 Ever17 の４コマは勢いがないとダメ。

2002/11/13 (Wed)
　さすがに眠くない。お仕事はプログラムの修正が２０以上。帰りにスリッ
パ購入。「ＤＴＰ　ＷＯＲＬＤ」。来週の徹夜作業。１２８Ｋ、計算上は
６８Ｋくらい？

2002/11/14 (Thu)
　お仕事はびくびく修正。「ロジック部」。塩天丼がおいしい。ボンバーマ
ンオンラインを始める。ポケモンの最終回がなんかヤダ。ほむぺの想い出。

2002/11/15 (Fri)
　お仕事はがたがたと。んで徹ゲー。今回はボンバーマン。日記単語の思惑
が外れる。回線はだいたい９０Ｋくらい出てるみたいです。

2002/11/16 (Sat)
　１２時に起きて、１時半に漏電の検査。問題なくて良かった。久々に豚汁
を作る。オンバトが遅れて「りぜるまいん」見られない？


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第五章　変化　−１１−

「これだけの医療設備が整ってはいるが、失敗してもおそらく助けられん
ぞ」
「一発勝負、後戻りはできないということですね」
　ベッドに横たわる行雄に、石和は最後の確認を取った。
「ふしぎなんです」
「何がだね？」
「全然、恐怖心が沸かないんです。それよりもなんていうか、子供の頃、初
めて模型飛行機を飛ばしたような、そんな奇妙な期待感しか抱かないんで
す」
「そうかね」
「なんか、今の世界が夢のような気がしてます。何もかも晴ればれとしてい
て、とても気持ちいい感じです」
「そうか……成功を祈るよ」
「はい」
　行雄はうなずき、石和は部屋を出る。出たところに、青年が立っていた。
「麻薬でも盛ったのか？」
「いいえ。心が痛みますか？」
「馬鹿を言え。君ほどではなくても、十分悪人のつもりだ」
「それはそれは……」
　青年と石和は歩き出す。暗く汚く窓のない通路は、石和の気分を悪くさせ
た。
「ひとつ聞く。君はなぜ、手術を受けん。失敗の可能性があるからか？」
「奴の持っていたデータ……」
「この前盗み取ってきたあれかね」
「……そのデータは十二分に役に立ちましたよ。失敗はあり得ませんね」
「では……」
「あんな奴の手助けなど……」
　青年は急に立ち止まり、石和はその後ろ姿を見つめる。
「確かに、左は自分の好き勝手にやっていた。だが……君と左は、仲がいい
と感じていたのだが、それほどまでに憎むようになった理由とは、なんなの
かね」
「理由、ですか……」
　石和は辛抱強く答を待った。
「……そんなもの、知りません」
「知らない？」
「知りません。ただ、ただ私は、彼を殺したいと欲している。それだけで、
十分ではないですか？」
「ではないと思うが」
「十分なんです！！」
　気付けば青年が銃を構えている。その顔は、引きつり強張っていた。
「奴は、左洋一は必ず殺さなければならないんですぅ！！　奴は、私の人生
を、心を、すべてをズタズタに……」
　ゆっくりと銃が降りていき、そして、青年は肩を落としてゆっくりと歩い
ていった。
「左洋一……君はもしかしたら、とんでもない悪人なのかもしれない
な……」
　そうは思いながらも、なぜか石和は感情を高ぶらせることがなかった。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『購読登録数、減ったね』
「減ったね。まぐまぐの方が４０くらい減ったみたいだけど」
『……なんで？』
「……登録フォームを直したって事は」
『解約フォームも直ったって事……じゃあ』
「それ以上言っちゃダメ」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 10.05
デフォルトウィンドウプロシージャ

「前回はメッセージループについて見てみました」
『ちょっと飛ばしてたけどね』
「あとでちゃんと復習するから大丈夫。で、今回は、メッセージループから
送られてきたメッセージの処理」
『つまりウィンドウプロシージャね』
「そゆこと。というわけで Version 10.03 ( No.181 ) で紹介したウィンド
ウプロシージャについてもう一度見てみます」

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_DESTROY )
    {
        // ×ボタンが押されました。
        PostQuitMessage( 0 );
        return 0;
    }

    // 標準的な処理をします。
    return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );
}

『なんかかなりシンプルだね』
「 Version 8.10 ( No.152 ) とかのダイアログプロシージャに比べると、
ってこと？」
『そうそう。あのときとかメッセージいっぱいあったじゃない』
「もちろん、ウィンドウもいろんなメッセージを受け取るようにしたらああ
いふうにごちゃごちゃしてくるけど」
『そっか、そうなっちゃうんだね……あ、でも、なんかウィンドウ閉じるの
は面倒そうじゃないね』
「そうだね、あのときはボタンの ID とか調べたりしなきゃいけなかったか
らね。ウィンドウの場合、閉じるときには右上の×ボタンを押したとき、だ
から」
『ボタンの ID は関係ないわけね。で、実際に押されたときはどうなる
の？』
「そうだね……今回は色々実験してみようか。まず」

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    // 標準的な処理をします。
    return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );
}

『お、なんかえらいシンプルに！』
「これで実行して、ウィンドウ閉じてみて」
『ほい。あれ？　ちゃんと閉じたよ』
「よく見てみて」
『へ？　ちっちゃいウィンドウでも残ってる？』
「いや、そうじゃなくて……アプリ自体は終了してないでしょ」
『あ！　ホントだ、 VC がまだデバッグモードになってる』
「つまり、ウィンドウプロシージャの」

    if( p_uiMessage == WM_DESTROY )
    {
        // ×ボタンが押されました。
        PostQuitMessage( 0 );
        return 0;
    }

「の部分は、ウィンドウを閉じるためじゃなくて、ウィンドウが閉じたとき
にアプリを終了させるための部分なんです」
『おー』
「ウィンドウが閉じたときには WM_DESTROY が送られてきます。そこで 
PostQuitMessage() を呼び出します」
『あ、このへんは前回やったね』
「そう、ここからはメッセージループの話。この API を呼ぶと WM_QUIT が
メッセージループに送られて、それを GetMessage() が受け取ると」
『 0 を返して、それが if にひっかかって抜けるわけね』
「そゆこと。ちなみにこの PostQuitMessage() に渡した数字が、 WM_QUIT 
の WPARAM に入れられます」
『ん？　どゆこと？』
「ほら、前の最後で」

    return stMsg.wParam;

『あー、これが WM_QUIT の WPARAM で、つまり PostQuitMessage() の引数
なんだ』
「ってことは、 WinMain() の戻り値は PostQuitMessage() に渡した値って
こと。まぁ WinMain() の戻り値自体はあまり意味ないけど、ここでその戻
り値を決められるってことで」
『ウィンドウでエラーが起きたときとか、ここに違う数字渡せばいいのね』
「そゆこと。で、話を戻すと」
『ようするに、あの部分はウィンドウ閉じるのとは無関係、と』
「そうそう、つまりウィンドウを閉じること自体は自動だけど、ウィンドウ
が閉じたときにアプリを閉じさせるのは、実際にコードとして書かなきゃい
けないってこと」
『めんどいねー』
「確かに簡単なアプリならそうだけど、たとえばウィンドウをいっぱい作る
アプリなら」
『そっか、そういうときだと、今表示されてるウィンドウがいくつあるとか
調べて、全部なくなったときだけアプリを終了する、みたいな？』
「そういう処理が必要な場合もあるからね。だから、この辺は自動じゃなく
て手動になってるわけ」
『わからなくもないけど、めんどいのはめんどい……』
「まーね。でも、ウィンドウを閉じるのは自動だったでしょ？」
『あ、そういえば』
「そういう部分もあるってこと。今度はその部分を見てみます。ウィンドウ
が自動的に閉じるのは、ずばり、この API のおかげです」

    return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );

『そういえば最後にこの関数を呼んでるよね』
「この API は【デフォルトウィンドウプロシージャ】って言います」
『デフォルトはあのデフォルトだよね』
「そう。つまり〈標準のウィンドウプロシージャ〉ってこと。ウィンドウっ
て、実はものすごく膨大な量のメッセージが大量に送られてきてます」
『 Version 5.28 ( No.093 ) で見たよ』
「そうそう、 Spy++ で見れば分かるけど、ものすごい量のメッセージがど
んどん送られてくるんです。で、そのすべてに対応してたら大変だから、標
準的な処理でいいメッセージは、そのままデフォルトウィンドウプロシー
ジャに渡しちゃうんです」
『それがさっきの呼び出してる部分？　そういえば、引数とか戻り値とか全
部同じなんだね』
「そりゃ、ウィンドウプロシージャなんだから。デフォルトウィンドウプロ
シージャの中にはそれぞれのメッセージに対応した標準的な処理をしてくれ
ます。逆に言うと……」

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    return 0;
}

『呼んでないと……あ、ウィンドウが作られもしない』
「でしょう。そういう初期化部分も肩代わりしてくれてるから」
『特にメッセージを受け取らなくても表示できちゃうわけねー』
「で、その標準的な機能のひとつに、ウィンドウを閉じる、というのがあり
ます」
『だから勝手に閉じてくれるんだね』
「というわけで、今度は閉じさせないようにしてみます。ウィンドウを閉じ
たときには WM_CLOSE ってメッセージが送られてきます」
『そのまんまだね』
「で、これをデフォルトウィンドウプロシージャに渡さないようにしてみます」

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_DESTROY )
    {
        // ウィンドウが閉じました。
        PostQuitMessage( 0 );
        return 0;
    }
    else if( p_uiMessage == WM_CLOSE )
    {
        // ×ボタンが押されました。
        return 0;
    }

    // 標準的な処理をします。
    return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );
}

『 WM_CLOSE を受け取ってそこでウィンドウプロシージャから抜けるわけ
ね』
「とりあえず試してみて」
『ほい。お、閉じなくなった！！』
「デフォルトウィンドウプロシージャに WM_CLOSE が渡されないから、ダイ
アログが閉じないんです」
『つまり DefWindowProc() に WM_CLOSE を渡すとウィンドウが閉じるって
ことねー』
「そういうこと。さらに、ウィンドウが閉じるってことは、そのときに一緒
に WM_DESTROY が送られてきます」
『あ、そっか！　それを受け取って、アプリを終わらせるわけね』
「そゆこと。順番的には……」

１：ウィンドウを閉じる（ｘボタンを押す）。
２： WM_CLOSE が送られてくる。
３： DefWindowProc() が受け取ると、ウィンドウを閉じる。
４：ウィンドウが閉じられると、 WM_DESTROY が送られる。
５：それを受け取って PostQuitMessage() を呼び出す。
６：メッセージループから抜けて、アプリが終了する。

「という感じになります」
『ふ、複雑……』
「確かにねー。ウィンドウを閉じる部分と、アプリを終了する部分とが別々
で、しかも関連してるからね」
『……そういえば、 WM_DESTROY のコメントが違ってるね』
「うん、変えました。単純に、ウィンドウが閉じたときにアプリを終了させ
る、ってことなら WM_CLOSE のことは気にする必要ないでしょ。それなら」
『 WM_DESTROY が〈×ボタンを押したとき〉なわけね。でも正確には〈ウィ
ンドウを閉じたとき〉なのよねー』
「このへんは複雑だから、プログラムを色々試したり、図を書いたりして頭
の中でイメージできるようにね」

/*
    Preview Next Story!
*/
『でもさ、イメージってできてなきゃいけない？』
「？」
『アクセル踏むときに、車の仕組みを考える必要はないでしょ？』
「そりゃ乗る人はね。作る人は必要でしょう」
『必要？　車を作る人が、エンジンの仕組みとかまで知ってなきゃダメ？』
「知ってなきゃだめ……だと思う」
『そうかなー』
「というわけで次回」
＜ Version 10.06 キー入力メッセージの置き換え ＞
『につづく！』
「だから教えてくから」
『おうぼうー』


////////////////////////////////////////////////////////////////////
/*                ２００２年１１月２５日（月）の更新              */
http://www.kab-studio.com/

・ほとはー１話追加予定。
　三人合体ホットハーブに１話追加予定です。ちょっと３章に時間掛かり過
ぎてるんでがんばります。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.com/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.com/Info/MailMagazine/

    (C)KAB-studio 1999 - 2002 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

