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

    KAB-studio.h


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

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

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

・KAB-studio.h 縮刷版更新
　１６０号になったので KAB-studio.h の縮刷版を更新します。もう４年目
に突入かぁ……。
　ダウンロードはダウンロードルームにて。
[ ダウンロードルーム ]
http://www.kab-studio.com/Freeware/index.html#MailMagazine


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

2002/06/02 (Sun)
　バグ発見で会社へ(泣)。原因は仕様とテーブルの差。ミスったなー。７時
に上がってかぶヘッダーの準備したり。テレビはあずまんが大王が良かっ
た〜。 Klez 系ウィルスと一緒に来たファイルは……。

2002/06/03 (Mon)
　毎月恒例ソルパック月例会議。戻ってからは定時上がり。方針変換、残業
代で設備投資して早く上がれたら創作活動に励もう。ということで１９イン
チディスプレイ購入。まだ来てないけど。久々ぷらとわ１話作成。

2002/06/04 (Tue)
　日本対ベルギーの試合は熱かった！　やっとふさわしくなったかな。仕事
は眠かった。眼鏡、新しいの買おうかなー。 999.9 っていい？

2002/06/05 (Wed)
　仕様変更でプログラム作り直し。見に行くファイルの方向が逆に。でも１
日で完成。帰りにハヤシ迷作劇場購入。バカっぽくていい。抱き枕は今度買
おう。今日もヒット数高い。うまく有料化に継なげたいけど……。

2002/06/06 (Thu)
　会社全体がのんびり？　空いた時間に tail コマンドっぽいのを作成。
結構便利。公開できないけど。初プレイは誠実モード。ペットは檻に飼いた
くないなぁ。

2002/06/07 (Fri)
　ログ出力の方法を変えなきゃいけなくて面倒。でも明日あさってお休
み！　DTM MAGAZINE 買って SSW に慣れておこう。アブトロニックってホン
トに筋肉が着くんだろうか。

2002/06/08 (Sat)
　朝から洗濯したりぷらとわ書いたり。 SSW インストール。作曲を始める
理由。１９インチモニター到着。ハヤシ迷作劇場１週目クリア。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
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.19
MFC を使わずにアイテムを取得！

「ではさっそく前回の続きを」
『あと関数が３つあったもんね』
「まずはその中の一番簡単なのから」

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

『 OK ボタンを押したら閉じるってヤツね』
「今回は OK ボタンだけだど、本当はｘボタンに対応するために IDCANCEL 
にも対応させた方がいいかな」
『 Version 8.09 ( No.151 ) のね』
「では次、ダイアログの初期化」

// ダイアログの初期化。
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;
}

『長い……けど、 Version 8.16 ( No.158 ) と同じね』
「あのときと同じことを３回してるってだけ」
『じゃ、最後のねー』

// アイテムの選択が変更された時。
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;
}

『どっかで見たような、そうじゃないような……』
「これは Version 8.15 ( No.157 ) の〈今選択されているアイテムの情報
を取得する方法〉を MFC を使わずにしているんです」
『そういえばちょっと似てる……けど結構違うかな』
「そうだね、まずこの OnSelchangedTreeMain() って関数から」
『前回のを見ると、選択してるアイテムを変えるとこの関数が呼ばれるよう
になってるんだよね』
「そう、 TVN_SELCHANGED 通知メッセージが送られてきたらディスパッチす
るようにしてるからね」
『その時の LPARAM が NM_TREEVIEW にキャストされて渡されてるのね。こ
の辺は Version 8.15 と同じ？』
「同じ。あのときは LPARAM は出てこなかったけど、実際にはこういうふう
に LPARAM から NM_TREEVIEW のポインタにキャストできるから」
『つまり LPARAM から NMHDR のポインタにもキャストできるわけね』
「そゆこと。次の TVITEM の準備は Version 8.15 のと同じ。そのあとの」

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

『これがつまり』

    m_cMainTree.GetItem( &stTvItem );

『の代わりなわけね』
「そう、コントロールの操作はさっきの OnInitDialog() で 
TVM_INSERTITEM したようにメッセージを送ってします」
『で、アイテムの情報をもらうのが TVM_GETITEM なわけね』
「 TVM_INSERTITEM と使い方はほとんど同じだから大丈夫かな。こうやって
TVM_GETITEM メッセージを送ることで、 stTvItem の中に情報を入れてくれ
ます」
『あ』

        ( p_pstNmTreeView->hdr.hwndFrom

『がちょっと難しいかも』
「じゃ、ひとつずつ分けて」

    p_pstNmTreeView->hdr

「これは NM_TREEVIEW の hdr 変数を指してます」
『ポインタだから -> なんだよね』
「そう。この hdr は NMHDR 構造体で、この中の hwndFrom 変数を指してい
るのが」

    hdr.hwndFrom

「の部分」
『 -> が . になるのよね……』
「そう、前も言ったけど、この時点ではもう p_pstNmTreeView のことは忘
れて hdr だけを見て。 hdr はポインタじゃなくて普通の変数だから」
『 -> じゃなくて . なわけね』
「そゆこと。この hwndFrom には〈通知メッセージを送ってきたコントロー
ルのウィンドウハンドル〉が入ってるから」
『このウィンドウハンドル宛にメッセージを送ればいいわけね』
「あ、もちろんこの通知メッセージは TVN_SELCHANGED のことだから」
『質問！』
「はい火美ちゃん」
『さっきの MFC の例ではこの hwndFrom って使わなかったよね。なん
で？』
「ん、そうだね、結論から言えば」

    m_cMainTree.GetItem( &stTvItem );

「の方が間違い」
『げ、そうなの？』
「まず、どのツリービューコントロールから送られてきた通知メッセージか
どうかはこの hwndFrom を見ないと分からない、っていうのを憶えて」
『ほい憶えた』
「ってことは、ツリービューコントロールが複数あったら、その複数のツ
リービューコントロールから送られてきた通知メッセージが、この 
OnSelchangedTreeMain() に送られてくるってこと」
『げ、つまりいろんなツリービューコントロールのがごちゃ混ぜになって
入って来るんだ』
「だから、実際には hwndFrom を見てどう処理するか決めなきゃいけないわ
け。理想はコントロール毎に別の関数にディスパッチすることだね」
『ダイアログプロシージャのとこで振り分けちゃうわけね』
「で、今回の例ではツリービューコントロールはひとつだけだから、どんな
通知メッセージも、どのツリービューコントロールから送られてきたかは
はっきりと分かってるわけ」
『それが m_cMainTree なわけね』
「そゆこと。だからここでは問題ないってこと。あ、それに、これは MFC 
の問題じゃないからね」
『そなの？』
「 m_cMainTree の代わりに、 m_cMainTree の中に入ってるツリービューコ
ントロールのハンドルを操作する、ってことなら今の例でもできるから」

    HWND hMainTreeWnd
        = GetDlgItem( p_hDlgWnd, IDC_TREE_MAIN );

『 OnInitDialog() の中のだね。あ、そっか、これがそのツリービューコン
トロールのハンドルなんだ』
「そゆこと。だから、今回みたいにツリービューコントロールがひとつだけ
なら、 hwndFrom を使わずにこの hMainTreeWnd を使うって手もあるわけ」
『ひとつだけならそれも許されるわけね』
「あ、そうそう、当たり前って言えば当たり前だけど、 hMainTreeWnd と 
hwndFrom は値が同じ、つまり hMainTreeWnd == hwndFrom だから」
『おー、なるほど。同じツリービューコントロールだからハンドルも同じな
んだ。あ！　もしかしてそれで通知メッセージがどこから送られてきたか調
べるとか？』
「あ、ううん、 NMHDR 構造体に idFrom ってメンバ変数があって、これが
送信元コントロールの ID になってるから」
『なんだ、便利なのがあるんだ。これと IDC_TREE_MAIN が同じか調べれば
いいわけね』
「そゆこと。というわけでダイアログプロシージャの話はここまで！」
『おお』
「最後になるけど、こういうふうに MFC を使わないでプログラムすること
を〈 SDK だけで作る〉って言います」
『 SDK って Version 5.31 ( No.096 ) のだね』
「そうそう。あ、同じく〈 API だけで作る〉とも言うから。こういう、 
MFC を使わない、 SDK だけで作る知識は MFC を使う時でも必要だから、
しっかりマスターしておいてね」
『 MFC も SDK 使ってるから、だよね？』
「そゆこと」

/*
    Preview Next Story!
*/
『とゆーわけで次回からは新章！』
「次回からは SDI アプリケーションについて見ていきます」
『って、それならさっきやったじゃん』
「 SDK じゃなくて、 SDI 」
『似たようなもんじゃないの？』
「全然違います」
『というわけで次回』
＜ Version 9.01 SDI アプリを作ろう！ ＞
「につづく！」
『似てるんならパスしよ、パス』
「だから似てないんだって……」


////////////////////////////////////////////////////////////////////
/*                ２００２年６月１７日（月）の更新                */
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
*/
////////////////////////////////////////////////////////////////////

