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

    KAB-studio.h


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

    送信日： 2003/02/24(Mon) No.195
    配信数： 3230 ( 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/

2003/02/16 (Sun)
　ほとはー完成してない。毎日描かないと下手になる……。お仕事はスパ
ゲッティ。ちょっとだけ ANUBIS 。もっと ADA と変な会話したい。

2003/02/17 (Mon)
　さくっとほとはー追加。それが３時まで。お仕事はリリース直前でひーこ
ら。これからが見えてきて少し面白そうなことに。ほとはーのヒット数が
ちょっと少ない？　やっぱりまめに描かないと。ネタはあるからあとは描く
だけ。

2003/02/18 (Tue)
　デバッグ三昧。秀丸に慣れまくって VC が使いづらい。使い始めたのかな
り前か。ＨｘＨコンプ開始。美鳥の日々がわて的大ヒット。

2003/02/19 (Wed)
　サーブレットって複雑。設定とかよくわかんない。 Java のコンパイル時
の参照方法も良く分からない。 Ever17 のドラマＣＤ、微妙だ……。ゲーム
の方をもう一度したいなぁ。 Let It Be!! 完結。ほとはーと方向性似て
る？

2003/02/20 (Thu)
　イヤな修正をすることになってブルー。いつの間にか休出も普通に。帰り
に Java WORLD 購入。家で Java するために。 ATOK16 も到着。

2003/02/21 (Fri)
　バグかと思ったら作り込みに発展。家のマシンとかに Tomcat とか導入。
KabKi 作り開始。残業休出多いけど、超過時間は８０時間くらい。１９イン
チディスプレイ購入予定。ほとはーは更新できるかどうか微妙……。

2003/02/22 (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.17
ステータスバーをクリック！

「今回は、ステータスバーをクリックしたときのメッセージを受け取ってみ
ます」
『……それって意味ある？』
「あんまりないかも。どちらかというと、前に使った【通知メッセージ】の
復習の方が大きいかも」
『通知メッセージって、 Version 5.29 ( No.094 ) とか 
Version 8.10 ( No.152 ) とかに出てきたのだね』
「そう、コントロールがなにか操作された時に送られてくるメッセージ。ス
テータスバーはコントロールのひとつだから」
『同じように通知メッセージが送られてくるってことね』
「そういうこと。じゃあ、まずは試してみましょう。この前のステータス
バーを作った部分を次のように修正してください」

HWND g_hStetusBarWnd;
const int ID_STATUS_BAR = 5001;    // まずここを追加。

// ウィンドウが作られます。
LRESULT OnCreate
    ( HWND p_hWnd
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    // ステータスバーを作ります。
    g_hStetusBarWnd = CreateStatusWindow
        ( WS_CHILD | WS_VISIBLE
        , "テスト"
        , p_hWnd
        , ID_STATUS_BAR    // ここを修正。
        );
    if( g_hStetusBarWnd == NULL )
    {
        // ステータスバーが作られませんでした。
        return -1;
    }

    // 分割するコードはあってもなくてもいいです。

    return 0;
}

『ほとんど変わんないね』
「 CreateStatusWindow() の第４引数に渡す ID を別にしただけだからね。
さっきも言ったように、ステータスバーはコントロールのひとつ。さて問
題。コントロールにはどんなのがある？」
『どんなのって、いっぱいあるよね。ボタンとかエディットボックスとか』
「そうそう。そういうのに ID ってあったでしょ」
『あ！　この ID_STATUS_BAR は、ステータスバーっていうコントロールの 
ID ってことなんだ』
「そういうこと。だから、この ID_STATUS_BAR の値は他のコントロールと
重ならないようにね」
『それってどう調べるの？』
「メニューの【表示】−【シンボルブラウザ】のダイアログで確認できる
から。ちなみに、ここで値をセットすることもできるよ」
『どういうこと？』
「右側の【新規作成】ボタンを押して、 ID を ID_STATUS_BAR に、値を
5001 にして登録すれば」

const int ID_STATUS_BAR = 5001;    // まずここを追加。

「の行は削除できるから」
『……つまり？』
「つまり、ボタンとかに使う ID を、別に何にも使わずに ID だけ登録でき
るってこと」
『あ、そっか、それをそのままステータスバーに使えるわけね』
「このシンボルブラウザなら割り当てられてる ID を確認してから登録でき
るから、他と間違えて同じ値をつけることがなくて安心かも」
『同じ値を付けることってできるの？』
「うん、シンボルブラウザでも普通にできるから。それをすると、最悪、ス
テータスバーを押すのと〈終了〉コマンドが一緒になっちゃって」
『アプリが閉じちゃう』
「ってこともあり得るから。さて、今度はステータスバーをクリックしたと
きのメッセージを受け取るように、ウィンドウプロシージャを修正します」

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_CREATE )
    {
        return OnCreate( p_hWnd, p_wParam, p_lParam );
    }
    else if( p_uiMessage == WM_DESTROY )
    {
        return OnDestroy();
    }
    else if( p_uiMessage == WM_RBUTTONUP )
    {
        return OnRButtonUp( p_hWnd, p_wParam, p_lParam );
    }
    else if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == ID_MENU_TEST )
        {
            return OnMenuTest( p_hWnd, p_wParam, p_lParam );
        }
    }
    else if( p_uiMessage == WM_NOTIFY )    // ここから下を追加。
    {
        if( p_wParam == ID_STATUS_BAR )
        {
            NMHDR *pNmhdr = (NMHDR*)p_lParam;
            if( pNmhdr->code == NM_CLICK )
            {
                // クリックされました。
                OutputDebugString( "クリックされました。\n" );
                return 0;
            }
        }
    }

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

『あ、 WM_NOTIFY って前に出てきたね』
「そう、これが通知メッセージ。 Version 8.18 ( No.160 ) では、ダイ
アログプロシージャで通知メッセージを受け取ってます」

    else if( p_uiMessage == WM_NOTIFY )
    {
        if( p_wParam == IDC_TREE_MAIN )
        {
            NM_TREEVIEW* pstNmTreeView = (NM_TREEVIEW*)p_lParam;
            if( pstNmTreeView->hdr.code == TVN_SELCHANGED )
            {
                return OnSelchangedTreeMain( pstNmTreeView );
            }
        }
    }

『形式はかなり似てるね』
「通知メッセージそのものを比較するところくらいかな、違いは。一応、ひ
とつひとつ見ておこうか。まず、通知メッセージを受け取ったら、どの ID 
のコントロールからのメッセージか調べます」

        if( p_wParam == ID_STATUS_BAR )

『ここでさっきの、ステータスバーのコントロールが出てくるのね』
「そういうこと。ボタンとかならボタンの ID 。ステータスバーならス
テータスバーの ID ってこと」
『それで……ここは違うんだね』

            NMHDR *pNmhdr = (NMHDR*)p_lParam;

「ツリービューの時は LPARAM には NM_TREEVIEW 構造体のポインタが入っ
てたんだけど、 NM_CLICK の時は NMHDR 構造体のポインタが入ってるか
ら」
『 NM_CLICK が送られてきてるから NMHDR にキャストして……って、そ
れって変じゃん！！　だって、 NM_CLICK が送られてきたって分かるの、
キャストしたあとじゃない』
「そう、よく分かったね。これはあとでちゃんと説明するけど、構造体って
こういうことができるようになってるんです。 NM_TREEVIEW の中身は」

[ NMHDR ][ UINT ][ TVITEM ][ TVITEM ][ POINT ]

「って感じに入ってるんです。この最初の所に NMHDR があるでしょ」
『これがあるとどうなの？』
「もしツリーバーの通知メッセージで LPARAM に NM_TREEVIEW へのポイ
ンタが入っていたとしても、それを NMHDR のポインタに変えても問題な
いってこと」
『？？？』
「……これは来週、ちゃんとやった方がいいかも」
『げ』
「げってことはないでしょ」
『うー』
「話を戻して、キャストをしたら、どんな通知メッセージが送られてきたの
か調べます」

            if( pNmhdr->code == NM_CLICK )

『 NM_CLICK はクリックされたときの？』
「そう。正確には右クリックされた時に送られてくる通知メッセージ。これ
はステータスバーに限らずにいろんなコントロールから送られてくるから」
『それこそ、ちゃんと ID を調べないとまずいわけね』
「そういうこと。で、クリックされてたら」

                // クリックされました。
                OutputDebugString( "クリックされました。\n" );

「の所に入ります」
『これはテスト用で、何かするんだったらちゃんと関数作った方がいいんだ
よね』
「もちろん。その場合の引数はどうするか微妙だけど」
『そっか、 WPARAM と LPARAM にするか、 NMHDR のポインタにするか、
ってことね』
「その辺は好みによるかも。あ、あとひとつ補足。今回、ステータスバーを
作ったときに、前回のいくつかにわけるって部分は省きました」
『そういえばそうだね』
「で、どうも〈分けた中のどれをクリックしたか〉は取得できないみたいで
す」
『げ、そうなんだ』
「マウスの位置を取得して、それでどれがクリックされたか調べるしかない
かもね」
『そんなことできんの？』
「カーソル位置を取得する API は？」
『 GetCursorPos() ！』
「分割するときには左側からのサイズを渡すんだから」
『あ、あの配列の数字ねー。あ、できちゃいそう』
「そういうこと」

/*
    Preview Next Story!
*/
『やっぱり API って便利じゃないね』
「この辺はノウハウの方が重要かもね」
『つまりカーソル位置を知るための API は、みたいな？』
「そういうこと」
『でもそこまでまだ気が回らないなー』
「そのためには基礎をもっと勉強しないと」
『基礎ねー』
「というわけで次回」
＜ Version 10.18 構造体の構造 ＞
『につづく！』
「というわけで基礎を学びましょう！」
『う”、そういうの苦手なんだけど……』


////////////////////////////////////////////////////////////////////
/*                ２００３年３月３日（月）の更新                  */
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 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

