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

    KAB-studio.h


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

    送信日： 2003/03/03(Mon) No.196
    配信数： 3200 ( 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/nikki2/

2003/02/23 (Sun)
　午前中にほとはー描き。１９インチディスプレイ到着。いいねぇ。午後は
お仕事。全体的に疲れモード。ななかってやっぱギャルゲーっぽい。前回の
ほとはー、少し修正しました……。

2003/02/24 (Mon)
　すごく眠かった。バグもやっかいなの多いし。そしてほとはー。 Web 出
版と有料化。プログラミング系でも色々画策中。

2003/02/25 (Tue)
　第４リリース直前でバグが出て朝っぱらから修正。そのあとはややまった
り。 Java 開発環境に悩む。バックアップツールをどうするか。そしてプロ
グラミングはプロでは？　そして codian 有料化反対。今タダのは有料化し
ません。やっぱ萌え系？

2003/02/26 (Wed)
　疲れが取れない。 Java プログラムを一度ライブラリ化しようかなぁ。夏
コミ宣伝。 KSCL がお勧めです。 Personal Firewall がいい感じ。３月に 
ADSL 入ろうかなと。 AirH" が不安定だから。なぜかヒートガイジェイが切
れてた……。そして出版社への持ち込み。以前にフラれたんで……。

2003/02/27 (Thu)
　今日も眠かった。日記に固有名詞出さない方がいい？　サラリーマン向い
てないなー。 Ever17 アンソロがいい感じ。もっと出ないかなぁ。秋葉様
フィギュア到着。電ＧＯ！の宣伝が鶴見駅で。謎だ。

2003/02/28 (Fri)
　バグ潰しにあけくれる。でもあさっては休めます。 ADSL に入るかどう
か。入った方がいいんだけど、やりたいことがいっぱい……。

2003/03/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 10.18
構造体の構造

「さて、今回はちょっと脇道にそれて、構造体について見ていきます」
『前回の LPNMHDR と NM_TREEVIEW の話ね』
「そう。ただ、構造体というよりはポインタの話かも」
『どういうこと？』
「それを説明するのが一番大変かも。まず結論から言うと」

            NM_TREEVIEW* pstNmTreeView = (NM_TREEVIEW*)p_lParam;

「ってできる場合には」

            NMHDR *pNmhdr = (NMHDR*)p_lParam;

「ってすることができます」
『それが分かんないのよねー。なんか全然違う気がするんだけど』
「そこがポインタの難しさかな。さて、このテストのためにテスト用関数を
用意してください。 Version 4.01 ( No.051 ) を参考にして」
『テスト関数ねー、ほいほい。でもなんで？』
「テストは MFC 使った方が簡単だから。とりあえず」

void StructTest()
{

}

「って感じに用意して、ボタンを押したらこれが呼ばれるようにして」
『ほい』
「さて、まずは確認から」

void StructTest()
{
    NM_TREEVIEW stNmTreeView;
    stNmTreeView.hdr.hwndFrom = 0;
    stNmTreeView.hdr.idFrom = 100;
    stNmTreeView.hdr.code = TVN_SELCHANGED;
    TRACE
        ( "%d, %d, %X\n"
        , stNmTreeView.hdr.hwndFrom
        , stNmTreeView.hdr.idFrom
        , stNmTreeView.hdr.code
        );
    // 0, 100, FFFFFE6E

    NM_TREEVIEW* pstNmTreeView = &stNmTreeView;
    TRACE
        ( "%d, %d, %X\n"
        , pstNmTreeView->hdr.hwndFrom
        , pstNmTreeView->hdr.idFrom
        , pstNmTreeView->hdr.code
        );
    // 0, 100, FFFFFE6E
}

『うお、いきなり長い！』
「って程でもないと思うよ。まず、ポインタじゃない普通の NM_TREEVIEW 
型変数を作ってその中の hdr の中に適当に値を入れます」
『 hdr って NMHDR のだよね』
「そう。 hwndFrom は送り元コントロールのハンドル、 idFrom はその 
ID 、 code は通知メッセージ」
『これって適当でいいの？』
「うん、テストだけだからね。で、それを TRACE() で出力して確認」
『 FFFFFE6E が TVN_SELCHANGED なんだね』
「次に、これをそのまま NM_TREEVIEW のポインタに入れます」
『ポインタにはアドレスが入って、本体を指し示す、だよね』
「そう、 Version 4.10 ( No.060 ) をよく読み返して、イメージを掴んで
おいてね」
『ってことは、 stNmTreeView がメモリ上に置いてあって、その一番最初の
アドレスが &stNmTreeView で取得できて、それをポインタの 
pstNmTreeView に入れてる、ってことだよね』
「そういうこと。そうすれば、 pstNmTreeView は stNmTreeView と同じよ
うに使えるから。そのためのテストで、さっきと同じように TRACE() で出
力しています」
『ポインタの時は . じゃなくて -> ね。そのあとのが . ってのがまだよく
わかんない……』
「 pstNmTreeView->hdr の型は？」
『さっき言ったじゃん、 NMHDR でしょ』
「それはポインタ？」
『違う……だから . ってことなんだよね』
「そういうこと」
『それはなんとなく分かるんだけどね……』
「さて、では一気に核心を突いてみます」

void StructTest()
{
    NM_TREEVIEW stNmTreeView;
    TRACE( "%X\n", &stNmTreeView );
    TRACE( "%X\n", &( stNmTreeView.hdr ) );
    // 12F5F8
    // 12F5F8

    NM_TREEVIEW* pstNmTreeView = &stNmTreeView;
    TRACE( "%X\n", pstNmTreeView );
    TRACE( "%X\n", &( pstNmTreeView->hdr ) );
    // 12F5F8
    // 12F5F8
}

『えっと、まず stNmTreeView のアドレス、次に stNmTreeView.hdr のアド
レス……って、同じなの！？？』
「そう、そこがポイント。 stNmTreeView は、メモリ上ではこういうふうに
置いてあります」

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

『前回出てきたのと同じだね。あ、最初に NMHDR がある……そっか！』
「わかった？」
『 &stNmTreeView は stNmTreeView の先頭アドレス。 
&( stNmTreeView.hdr ) は stNmTreeView.hdr の先頭アドレス。でも 
stNmTreeView.hdr は stNmTreeView の最初にあるから……同じ！』
「そういうこと。構造体の中に入っている変数は構造体の頭から入っている
んです」
『最初の所に余分なスペースはないってことね』
「最初の所にはね」
『？』
「パディングって言って後ろの方に入っていることはあるんだけど、それは
また今度の機会に置いておいて。で、後半のポインタの方を見てもらうと分
かるんだけど、それはポインタの時も同じ」
『 &stNmTreeView と pstNmTreeView が同じなのは当然よね、 = で渡して
るんだから。でも &( stNmTreeView.hdr ) と &( pstNmTreeView->hdr ) 
って難しいかも』
「これもさっきと同じ話。 pstNmTreeView->hdr の時点でもう」
『 stNmTreeView.hdr と同じってこと？』
「そういうこと。 pstNmTreeView がポインタ、ってことよりも、 
pstNmTreeView->hdr がなんなのか、っていう方が大事だから」
『なんとなくわかったかも……なんとなくだけど』
「さて、では最終段階」

void StructTest()
{
    NM_TREEVIEW stNmTreeView;
    stNmTreeView.hdr.hwndFrom = 0;
    stNmTreeView.hdr.idFrom = 100;
    stNmTreeView.hdr.code = TVN_SELCHANGED;
    TRACE
        ( "%d, %d, %X\n"
        , stNmTreeView.hdr.hwndFrom
        , stNmTreeView.hdr.idFrom
        , stNmTreeView.hdr.code
        );
    // 0, 100, FFFFFE6E

    NMHDR* pstNmHdr = (NMHDR*)&stNmTreeView;
    TRACE
        ( "%d, %d, %X\n"
        , pstNmHdr->hwndFrom
        , pstNmHdr->idFrom
        , pstNmHdr->code
        );
    // 0, 100, FFFFFE6E
}

『ってことができる理由よね』
「そう、それは次を見ればわかるかな」

void StructTest()
{
    NM_TREEVIEW stNmTreeView;
    TRACE( "%X\n", &stNmTreeView );
    TRACE( "%X\n", &( stNmTreeView.hdr ) );
    // 12F5F8
    // 12F5F8

    NMHDR* pstNmHdr = (NMHDR*)&stNmTreeView;
    TRACE( "%X\n", pstNmHdr );
    // 12F5F8
}

『……いや、なんてゆーか、ただアドレスを見ただけだし、キャストしたか
ら入ってるだけだし』
「まぁそうなんだけど。これは」

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

「を」

[ NMHDR ]

「って見てるってこと」
『あー、つまり後ろは見ないってことね』
「そういうこと。 NM_TREEVIEW の最初に NMHDR が入ってるんだから、
NM_TREEVIEW のアドレスを NMHDR のアドレスとして使っても問題ないって
こと」
『だからさっきみたいなことができたのね』
「重要なのは、これは〈みなしてる〉ってだけだから」
『どういうこと？』
「たとえばね、こういうこともできるんです」

void StructTest()
{
    NM_TREEVIEW stNmTreeView;
    RECT* pstRect = (RECT*)&stNmTreeView;
}

『 RECT ……って、四角の角が入ってる構造体だよね。……それって全然違
くない？』
「違います。でも、こういうこともできるんです。この場合、 NM_TREEVIEW 
の最初の部分を RECT 構造体と〈みなして〉扱うんです」
『こ、怖い……』
「逆に言うと、 NM_TREEVIEW の最初の部分を NMHDR と〈みなして〉操作す
ることも」
『あ……そっか、今の見ると NM_TREEVIEW の最初に NMHDR が入ってるから
そう〈みなして〉操作しても大丈夫ってわかるけど、違ったらまずいんだ』
「そういうこと。本当のことを言うと、こういうのは行儀が悪いからやっ
ちゃダメ。 API がそういうことしてるから仕方なくしてるってだけ」
『そうなんだ』
「そもそも、 LPARAM を NMHDR とかにキャストすること自体危険だし」
『そういえばそうだね……』

/*
    Preview Next Story!
*/
『〈みなす〉ってなんかすごいよね』
「こういうのはあまり他にはないからね」
『これはこれで面白いかも。ちょっと複雑だけど』
「複雑な所も面白い」
『とは思えない……』
「う”」
『というわけで次回』
＜ Version 10.19 ツールバーを作ってみよう ＞
「につづく！」
『っつーかなんかまだ認めたくない』
「むむむ？」


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

