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

    KAB-studio.h


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

    送信日： 2002/11/25(Mon) No.184
    配信数： 3490 ( 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/17 (Sun)
　記憶があいまい。ぷらとわ書いたりはしたんだけど。マンガ家になるため
がんばります。ふらっとトンコツ。「爆笑オンエアバトル」。時代は変わっ
たなぁ……。予約限定商品ってどうなんでしょう。そしてＰＣでラジオ。

2002/11/18 (Mon)
　プロジェクトが平行に走ってててんてこまい。金曜に走らせるシステムの
テストとか。椅子チェック。カレンダーチェック。テレビは「ガイナ」制作
のぷちぷりユーシィがすごかった。

2002/11/19 (Tue)
　不具合がなんか根深そう……。別プロジェクトのテストが面倒だったり。
ブルージェンダーみつからず。「ＦＲ」。ポケモン翡翠＆琥珀。ドリキャス
で１８禁ゲーを出す意味って？

2002/11/20 (Wed)
　ブルージェンダー・ザ・ウォリアー、いいんだか悪いんだかわからん。お
仕事は意外とすんなりと。初エクセルマクロ。「 SQL*Plus 」。今月買うも
の。明日の徹夜作業の予定。

2002/11/21 (Thu)
（徹夜作業のためお休み）

2002/11/22 (Fri)
　３８．５時間起きっぱなし。残作業をしてから某データセンターにて徹夜
でシステムリプレース。問題発生。原因はわてに……。へろへろ？で７時上
がり。士朗正宗マウスいい感じ。１７００円のカレーに満足。まだ起きてい
られそう。そしてシエル先輩。いや、遠野家ルートは必須だし。

2002/11/23 (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.06
キー入力メッセージの置き換え

「今回はキー入力メッセージについて見ていきます」
『キー入力、って前にやったね』
「そう、今回は Version 9.17 ( No.178 ) で出てきた、WM_KEYDOWN や 
WM_KEYUP 、そして WM_CHAR についての話」
『たしか、普通の文字は WM_CHAR でいいんだけど、それだとカーソルキー
とかは送られてこない、って話だったよね』
「逆に、 WM_KEYDOWN と WM_KEYUP だと大文字小文字が区別できない、とか
ね」
『そうそう、そんな感じ』
「で、あのとき〈これは MFC の機能〉って言ったでしょ」
『……ってことは、 SDK だけだと自分でやらなくちゃいけないってこ
と！？』
「そういうこと。というわけで、まずはこのコードを試してみて」

// ウィンドウプロシージャ。
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_KEYDOWN )
    {
        // キーが押されました。
        OutputDebugString( "WM_KEYDOWN\n" );
    }
    else if( p_uiMessage == WM_KEYUP )
    {
        // キーが離されました。
        OutputDebugString( "WM_KEYUP\n" );
    }
    else if( p_uiMessage == WM_CHAR )
    {
        // 文字が入力されました。
        OutputDebugString( "WM_CHAR\n" );
    }

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

「これをビルドして実行してから、キー入力してみて」
『ほい。お、こんな感じになったよ』

WM_KEYDOWN
WM_CHAR
WM_KEYUP

『キーが押されて WM_KEYDOWN が送られてきて、次に WM_CHAR が送られて
きて、最後にキーが離されて WM_KEYUP が送られてくるんだね。あ、でも、
カーソルキーとかだと』

WM_KEYDOWN
WM_KEYUP

『ってなるね。文字じゃないからだよね』
「そういうこと。つまり、キーが押されたときには必ず WM_KEYDOWN と 
WM_KEYUP が送られてきて、もしそれが文字なら」
『 WM_CHAR も送られてくる、ってことなんだ』
「そういうこと。あ、ちなみに WM_KEYDOWN と WM_KEYUP は必ずしもペアで
送られてくるわけじゃないから」
『え、そうなの？』
「キーを押しっぱなしにしてみて」
『押しっぱなし……あ、 WM_KEYDOWN と WM_CHAR がいっぱい出てきた』
「キーリピートの時には WM_KEYDOWN と WM_CHAR が送られてきて、 
WM_KEYUP は送られてこないから」
『確かにキーは上げられてないものね』
「さて。話を戻して、 WM_CHAR が送られてくる部分について」
『そうそう、そこって自分でやらなきゃいけないって言ってたよね』
「でも、今は送られてきてるよね」
『あ、ってことは、もうそういう機能は入れてあるって事？』
「そういうこと。それはこの部分」

// メッセージループ。
int MessageLoop()
{
// 略
        // メッセージを変換します。
        TranslateMessage( &stMsg );
// 略
}

『この TranslateMessage() って関数？』
「そう、これが WM_CHAR を作ってるんです」
『……作ってる？』
「とりあえずこれをコメントアウトして試してみて」
『ほい。ビルドして実行……あ！　ホントだ、 WM_CHAR が送られてこな
い！！』
「 TranslateMessage() は WM_KEYDOWN を変換する API 。変換っていうの
とはちょっと違うかもしれないけどね」
『 WM_KEYDOWN は残ってるんでしょ？』
「そう、ちゃんとウィンドウプロシージャに送られてきてるからね。 
TranslateMessage() は、 WM_KEYDOWN が送られてくると、まずそのキーが
普通の文字になるかどうか調べます」
『普通のキーじゃない、カーソルキーとかだと無視するわけね』
「そう。逆に普通の文字だったら、それを文字に変換してメッセージキュー
に WM_CHAR として送ります」
『送ったら？』
「送ったら普通に関数から抜けて、次の DispatchMessage() に移って、あ
とはウィンドウプロシージャへ。あ、えーっと」
『？』
「これは実際に見てもらった方がいいかな。このコードを試してみて」

// メッセージループ。
int MessageLoop()
{
    BOOL bRes;
    MSG stMsg;

    // メッセージループです。
    while( 1 )
    {
        // メッセージをキューから取り出します。
        bRes = GetMessage( &stMsg, NULL, 0, 0 );
        if    ( 
                ( bRes == 0 )
            || 
                ( bRes == -1 )
            )
        {
            // 終了するのでループから抜けます。
            break;
        }

        if( stMsg.message == WM_KEYDOWN )
        {
            // キーが押されました。
            OutputDebugString( "WM_KEYDOWN in MessageLoop\n" );
        }
        else if( stMsg.message == WM_KEYUP )
        {
            // キーが離されました。
            OutputDebugString( "WM_KEYUP in MessageLoop\n" );
        }
        else if( stMsg.message == WM_CHAR )
        {
            // 文字が入力されました。
            OutputDebugString( "WM_CHAR in MessageLoop\n" );
        }

        // メッセージを変換します。
        TranslateMessage( &stMsg );
        // ウィンドウプロシージャに送ります。
        DispatchMessage( &stMsg );
    }

    return stMsg.wParam;
}

『さっきのに似てる……』
「ウィンドウプロシージャの中でやってたのをメッセージループの中でして
るだけだからね。ちなみにメッセージは MSG 構造体の message ってメンバ
変数に入ってるのでそれを調べてます」
『で、ビルドして実行……あ』

WM_KEYDOWN in MessageLoop
WM_KEYDOWN
WM_CHAR in MessageLoop
WM_CHAR
WM_KEYUP in MessageLoop
WM_KEYUP

「〈in MessageLoop〉って付いてるのがメッセージループの、付いてないの
がウィンドウプロシージャのだから」
『ってことは WM_KEYDOWN が WM_CHAR に変換されても、それは置いといて
そのまま WM_KEYDOWN がウィンドウプロシージャに送られて来るんだ』
「そういうこと。 TranslateMessage() は WM_CHAR をメッセージキューに
入れるだけだから。だから、メッセージキューの中身は、まず」

WM_KEYDOWN

「ってなってて、これを GetMessage() で取り出すとメッセージキューの中
は空になります。で、 WM_KEYDOWN が TranslateMessage() に渡されると」

WM_CHAR

「と、メッセージキューに WM_CHAR が入れられます」
『でもこの時はまだ WM_KEYDOWN の処理中ってことね』
「そういうこと。 WM_KEYDOWN の処理が終わって、メッセージループの次の
周で GetMessage() で WM_CHAR が取り出されます」
『ふ、複雑……この前の WM_DESTROY とかも複雑だったけど、これも……』
「確かに〈おまじない〉として何も考えずに TranslateMessage() を入れて
もいいんだけど、こういう仕組みになってるっていうことは憶えておいて」

/*
    Preview Next Story!
*/
『なんとなく、メッセージループの仕組みが分かってきたかも』
「なんとなくでいいから、イメージは持っておいてね」
『なんとなくでいいの？』
「今回のはね。次回のはちゃんと憶えておいて欲しいけど」
『ほほう』
「というわけで次回」
＜ Version 10.07 メッセージを待つ！ ＞
『につづく！』
「次回は重要！　ユーザーを困らせないためにもしっかり憶えて！」
『おおっ、なんか久々にそういうの出てきた！』


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

・お休みします。
　１２月１日午前８時〜２日午前８時までの間サーバーメンテナンスが行わ
れるため、ホームページの閲覧が行えなくなります。そのため、この日の更
新はありません。１２月表紙壁紙は１２月９日に掲載します。
　また、それに伴い KAB-studio.h の配信もお休みします。次の配信は１２
月９日となります。御了承ください。


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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
*/
////////////////////////////////////////////////////////////////////

