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

    KAB-studio.h


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

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

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

・６月表紙壁紙登場！
　毎月恒例、新しい表紙です。今回はワールドカップな火美ちゃん！　
……いまいちかも（汗）。ダウンロードは CG Gallery にて。
[ CG Gallery ]
http://www.kab-studio.com/CG/Gallery/


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

2002/05/26 (Sun)
　１１時過ぎ上がりで眠い。６月表紙壁紙。今回はあんまりかも。リブレッ
ト用メモリとおねてぃ DVD ２巻購入。プログラミングは TO_NUMBER() への
置き換え。創作系コメント。

2002/05/27 (Mon)
　仕様変更の修正とかをして９時半上がり。毎日スリーエフのチキンカツカ
レーを食べる。そして４０００円キャッシュバックって何？　今は２０００
円らしい。

2002/05/28 (Tue)
　体調悪くてかなりヤバい。もちろん何も見てないし。昨日の WBS が待ち
がいだらけだった。

2002/05/29 (Wed)
　今日は８時半上がり。午前中は資料作り、午後はプログラミング。端から
端まで数往復。エクスプローラー派？　フォルダ派？

2002/05/30 (Thu)
　１１時半上がり。気分がいいとここまでしてしまう……。 COMMIT のタイ
ミング変更。

2002/05/31 (Fri)
　ドキュメント作成とプログラムの修正。帰ってからはウイイレ対戦、ビリ
ヤード、麻雀（爆）。

2002/06/01 (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 8.18
ディスパッチ

「前回は脱線したけど、今回は元に戻って、ツリービューコントロールの通
知メッセージについて見ていきます」
『なんか、この前はプログラミング全然しなかったし……』
「それじゃあ今回はばりばりしてみようか」

#include <Windows.h>
#include <Commctrl.H>
#include <stdio.h>

#include "resource.h"

// ダイアログの初期化。
BOOL OnInitDialog( HWND p_hDlgWnd )
{
    TVINSERTSTRUCT stInsertItem;
    stInsertItem.hParent = TVI_ROOT;
    stInsertItem.hInsertAfter = TVI_LAST;
    stInsertItem.item.mask = TVIF_TEXT;
    stInsertItem.item.pszText = "１番目のアイテム";

    HWND hMainTreeWnd
        = GetDlgItem( p_hDlgWnd, IDC_TREE_MAIN );
    HTREEITEM h1stItem
        = (HTREEITEM)SendMessage
            ( hMainTreeWnd
            , TVM_INSERTITEM
            , 0
            , (LPARAM)&stInsertItem
            );

    stInsertItem.item.pszText = "２番目のアイテム";
    SendMessage
        ( hMainTreeWnd
        , TVM_INSERTITEM
        , 0
        , (LPARAM)&stInsertItem
        );

    stInsertItem.hParent = h1stItem;
    stInsertItem.item.pszText = "１−１番目のアイテム";
    SendMessage
        ( hMainTreeWnd
        , TVM_INSERTITEM
        , 0
        , (LPARAM)&stInsertItem
        );


    return TRUE;
}


// アイテムの選択が変更された時。
BOOL OnSelchangedTreeMain( NM_TREEVIEW *p_pstNmTreeView )
{
    char pchText[256];
    TVITEM stTvItem;
    stTvItem.mask = TVIF_TEXT;
    stTvItem.hItem = p_pstNmTreeView->itemNew.hItem;
    stTvItem.pszText = pchText;
    stTvItem.cchTextMax = 255;

    SendMessage
        ( p_pstNmTreeView->hdr.hwndFrom
        , TVM_GETITEM
        , 0
        , (LPARAM)&stTvItem
        );

    OutputDebugString( pchText );
    OutputDebugString( "\n" );

    return 0;
}


// OK ボタンが押されました。
BOOL OnOk( HWND p_hDlgWnd )
{
    EndDialog( p_hDlgWnd, IDOK );
    return TRUE;
}


// ダイアログプロシージャ。
BOOL CALLBACK DialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_INITDIALOG )
    {
        return OnInitDialog( p_hDlgWnd );
    }
    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 );
            }
        }
    }
    else if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == IDOK )
        {
            return OnOk( p_hDlgWnd );
        }
    }

    return FALSE;
}


// WinMain() 。
int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    DialogBox
        ( p_hInstance
        , MAKEINTRESOURCE( IDD_MAIN )
        , NULL
        , DialogProc
        );

    return 0;
}

『……長すぎ』
「実はこれまでとほとんど変わらないんだけどね。前はダイアログプロシー
ジャに全部詰め込んでいたけど、それを他の関数に分けただけ」
『 OnOk() とかに？』
「そゆこと。実際にダイアログプロシージャを見てみると分かるけど」
『メッセージを受け取ったら、それに合わせて関数を呼び出すのね。 MFC 
みたい』
「 MFC の方が高度だけどね。こういう仕組みを〈ディスパッチ〉って言い
ます」
『でぃすぱっち？』
「英語で dispatch 、受け取った各種情報を適切な場所へ送付することを言
います。あと送付する人のことを〈ディスパッチャー〉って言います」
『ってことはこのダイアログプロシージャがディスパッチャー？』
「そういうこと。ダイアログプロシージャ内に全部のコードを書くと」
『それはかなり汚いね……』
「だからそういう機能を外に出して、ダイアログプロシージャがメッセージ
を適切な関数へとディスパッチする」
『それがこれなのね』
「 MFC でハンドラ関数が呼ばれるのはこのディスパッチのシステムがしっ
かりできてるから。これって結構大きいかもね」
『たぶんあたしには作れない……』
「あ、もしかして言ってなかったかもしれないけど、これからも MFC は
使っていくからね」
『え？　もう MFC って使わないんだと思った』
「 MFC のメリットは大きいからね。これまでの勉強は、 MFC を理解するた
めのものってこともあるから」
『確かに、 MFC と照らし合わせて、って多かったね』
「ま、最終的には MFC 使わない方向に行くだろうけど」
『やっぱし……』
「と、今回最後は、ちょっと難しそうな、通知メッセージの部分」

    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 );
            }
        }
    }

『これって、ツリービューコントロールの通知メッセージを受け取ってる部
分？』
「そう。まず、ツリービューコントロールなんかの〈新しい〉コントロール
は、通知メッセージが WM_COMMAND じゃなく WM_NOTIFY で送られてきま
す」
『その WPARAM に、通知メッセージを送ってきたコントロールの ID が入っ
てるのね。これは LOWORD いらないんだ」
「うん、 LPARAM まるごと使ってるから。で、この時点でツリービューコン
トロールの通知メッセージってことが分かっているので、 LPARAM に入って
る NM_TREEVIEW へのポインタを受け取ります」
『これってようするに Version 8.15 ( No.157 ) の 
CMfcDialogDlg::OnSelchangedTreeMain() と同じことしてるんだよね』
「そうそう、 LPARAM から NMHDR のポインタへはこのメンバ関数が呼ばれ
る前にされちゃってるけど、してる事は同じ」
『で、変換して……？』
「 NM_TREEVIEW::hdr メンバ変数は NMHDR 型で、この中に通知メッセージ
の基本的な情報が入ってるんです」
『あ、 code って hdr のメンバ変数ね。これを見ると……通知メッセージ
そのものが入ってるんだ！』
「そゆこと。〈ツリービューコントロールの選択を変更した〉っていう意味
の TVN_SELCHANGED が入ってるかどうか確認してから、関数にディスパッチ
してるってわけ」
『そこまで調べなきゃ、間違ったメッセージをディスパッチしちゃうかもし
れないってことねー』

/*
    Preview Next Story!
*/
「次回で今回のダイアログプロシージャの話も完結」
『仕組みは簡単だと思うんだけど、細かいとこ複雑だよね』
「それはこれからもそうかも」
『レベル高〜い』
「複雑なのを分解してひとつひとつ見ることが大事かもね」
『今回のディスパッチみたいに？』
「そゆこと」
『というわけで次回』
＜ Version 8.19 MFC を使わずにアイテムを取得！ ＞
「につづく！」
『で、そのあとは？』
「今度は SDI ！」
『 SDI ？』


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

・KAB-studio.h 縮刷版更新
　１６０号になったので 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
*/
////////////////////////////////////////////////////////////////////

