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

    KAB-studio.h


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

    送信日： 2002/05/13(Mon) No.157
    配信数： 3720 ( 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/

2002/05/05 (Sun)
　のんびりモード。横浜で水着が見つからず。ドリキャス版 Kanon 、結構
高い……。ウイイレ、点取られまくり〜。

2002/05/06 (Mon)
　今日もお休み。でも疲れてる。イトーヨーカドーとか回って水着購入。
Little Dolphin を衝動買い。結構便利。ぷらとわ４話作成。佐祐理シナリ
オもいい感じだ……。ネタばれ気にする必要ない？　そしてテレビを見る暇
を作る方法。仕事減らそう。でも手抜きはダメよ。

2002/05/07 (Tue)
　眠い中プログラミング。引数を省くことに失敗。 regret 売り切れ……。
あずまんが大王、なんかキャラが違う？　次のホットハーブ、のその前に表
紙を変えようと画策中。

2002/05/08 (Wed)
　会社ではべたにプログラミング。コマンドラインパーサーが難しい……。
const メンバ関数でメンバ変数を書き換える方法。帰りに本厚木へ。 
regret 購入。明日からのオーストラリア旅行。その関係で日記お休み。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第四章　ふたりの勇者　−３−

　戦わなきゃいけないんだなぁ、そう思うと、逆に戦いたい、思いっきりそ
の力を出し切ってみたい、そうも思う。
　舞はママチャリを玄関前で止め、家の門を開ける。と、ポストに突き刺さ
る真っ白な封筒を見つける。宛先を見れば、「結白　舞様」と書かれてい
る。コミックスサイズの長方形、宛先は黒のペンで書かれた手書き。その雰
囲気にそぐわない、「料金別納郵便」のマーク。
　裏を見て、目を見張った。差出人は「ファインダウト社」。
「敵からのファンレター、ってところかな」
　自転車を家の庭に止めて、封筒を様々な角度から見ながら家の中へと入
る。厚みはなく、金属が入っている形跡もなく、どう見ても爆発物やかみそ
りが入っているようには見えなかった。とにかく普通の封筒だった。
「護符？　まさかね……」
　家の中には誰もいない。封筒を眺めながらひとりぶつぶつつぶやき続け
る。そういえば昔、こんな風にひとりぶつぶつつぶやきながら、光が当たる
と燃え出す護符とか作ったなぁ……。そんな寂しさも感じながら、留守番電
話を見れば、一件録音されていた。
＜おー俺だ、舞の所にも封筒来てるか？　あとから行くからな、じゃな＞
　録音時刻は午前九時半になっていた。
「暇人……」
　ふと、「あとから」という意味を着替えながら考える。私があのマンショ
ンの下に来たとき、穂香さんが私を見つけたと言っていた。もし本当に穂香
さんがいるというのなら、私は今、彼女に見られているのだろうか……。雅
樹は、そのこと訊いたりするのだろうか……。
　頬が自然と赤くなり、妙な妄想が奇妙な気分へと駆り立てる。そういえ
ば、制服からこういう普通の服に着替えること、珍しい……。
　そんな考えを振り払うように、封筒の上側をハサミで切った。雅樹と会っ
たとき、話が合わないというのではあまりにも恥ずかしい。
　封筒の中には、一枚の紙が二つ折りにされて入っていた。ダイレクトメー
ルとはまったく違うその簡潔な内容に、舞はまず驚いた。

前略、結白　舞様。
弊社では、貴女の力を必要としています。
７月１日午前１１時半、
あなたと初めてお逢いしたあの公園でお待ちしています。

ファインダウト社代表取締役　左洋一

「へ、平日の午前中……」
　巧みな心理攻撃か、それとも単なる嫌がらせか、とにかく頭が痛くなるに
は十分な内容だった。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『これが最後の号なんだ……』
「そう、１５日の〈第１８回  C++ ユーザーへ〉が最終回になります」
『最後に C++ の話……でも読んでも分からない〜』
「高度ってわけでもないんだけど、後回しにしてる部分だから」
『さて！　これのあとは？』
「まず、５月一杯でバックナンバーが購入できなくなります」
『少ししたらまた買えるんでしょ？』
「たぶんね。まだ確定じゃないから何とも言えないけど」
『他のメルマガは出るの？』
「当分はないみたい。短期連載が難しくなってるから。ただ……」
『ただ？』
「バックナンバーの話に関連するんだけど、もしかしたら？」
『もしかしたら？』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 8.15
通知メッセージの受け方

「今回は MFC の方の最後として、通知メッセージの受け方を説明します」
『ってゆーかそれが目的だったんだよね、確か』
「そう、このあと SimpleDialog の方に戻って、 MFC を使わないでツリー
ビューコントロールを操作する方法を解説するから」
『そのための準備か今回までってことね』
「そゆこと。まずはと……ツリーのアイテムの追加はこんな感じ」

BOOL CMfcDialogDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    HTREEITEM h1stItem
        = m_cMainTree.InsertItem( "１番目のアイテム" );
    m_cMainTree.InsertItem( "２番目のアイテム" );
    m_cMainTree.InsertItem( "１−１番目のアイテム", h1stItem );

    return TRUE;
}

『ほいほい』
「次に、ダイアログエディタで貼り付けてあるツリービューコントロール 
IDC_TREE_MAIN の右クリックメニューから【イベント】を選んで」
『ボタンを押したときのメンバ関数を作るときと同じだね……』
「あ！」
『な、なに？？？』
「そうだ、それキャンセルして、【OK】ボタンで【イベント】選んで」
『ん？　それがそのボタンを押したとき、でしょ？』
「そう、だから。今まで火美ちゃんは〈こうすればメンバ関数ができる〉
ってことでしか見てなかったけど、少し憶えたことあるからちょっと違う見
方できると思うよ」
『違う見方……あ、左側のとこに BN_CLICKED と BN_DOUBLECLICKED があ
る、これって通知メッセージだよね！』
「そう、通知メッセージ。 Version 8.10 ( No.152 ) でやったように、ボ
タンを押したときには WM_COMMAND と一緒に BN_CLICKED が通知メッセージ
として送られてきます」
『ここではいつも、 BN_CLICKED を選んで【追加と編集】してたよね』
「そうすると、 MFC を仕組みを使って、 WM_COMMAND が送られてきた時に 
BN_CLICKED とボタンの ID の IDOK が送られてきたらメンバ関数を読み込
むように」
『プログラムを作ってくれる！』
「そゆこと」
『……でも、その辺の仕組みってどうなってるの？　なんか裏でこそこ
そ？』
「まだ難しいからもう少し先になるけど、これはマクロ使ってます」
『マクロ？』
「 BEGIN_MESSAGE_MAP とか DECLARE_MESSAGE_MAP がコードにあるでしょ」
『うんある。これがマクロ？』
「そう。これが実は結構長いプログラムに置き換えられます」
『そっか、マクロだからそういうこともできるんだ』
「この置き換えられたプログラムにはメッセージが送られてきて、この中に 
ON_BN_CLICKED とかのマクロを埋め込むと」
『ひっかかってメンバ関数が呼ばれる？』
「そゆこと。さっきのイベントのとか、 ClassWizard とか使うとこういう
マクロを VC がプログラムに書き込んでくれるんです」
『……ってことは、もうちょっと勉強すれば、この辺の仕組みも見て分かる
ようになる？』
「もちろん。その辺もちゃんと教えるからね」
『いつになるやら』
「ま、その辺は気長にね。話を戻して」
『ツリービューコントロールこのイベント？』
「そうそう、そっちの方の【イベントハンドラの新規作成】ダイアログを出
して」
『ほい。お、 NM_CLICK とかの通知メッセージと TVN_BEGINDRAG とかの通
知メッセージがある』
「 NM_ のは、 Version 8.11 ( No.153 ) で言った〈新しいコントロール〉
すべてに共通の通知メッセージ」
『マウスをクリックしたとかだね。 TVN_ はツリービューコントロールだけ
のってこと？』
「そう。これはコントロールごとに違うのがあるから。ちなみに、これが
MFC のだってことに注意」
『ん？　当たり前じゃない』
「もし MFC だけやってたら」
『あ、そういえば通知メッセージがここに出てるけど、通知メッセージのこ
とを知らなかったら……』
「 MFC は便利だけど、でもこういうふうに通知メッセージの知識は必要
だったりするから、何も分からなくても使えるってわけじゃないんだよね」
『ボタンの時は何も知らずに教えられたままに、だもんねー』
「時には MFC 使っててもこの辺の仕組みを知らないといけなかったりする
から」
『だからあたしはこういうことも教わってるわけね』
「そゆこと。じゃあ TVN_SELCHANGED を選んで【追加と編集】を選んで」
『ほい。 Sel Changed ってことは、選択してるアイテムを変えたときに送
られてくる通知メッセージ？』
「そう。他にも色々あるけど、これが分かりやすいと思って」
『ん、メンバ関数ができた。ボタンと同じね』

void CMfcDialogDlg::OnSelchangedTreeMain
    (NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    
    *pResult = 0;
}

「注、長いから改行しました」
『でー、なんか引数難しいね。ポインタっぽいけど』
「そうだね……これは結構難しいかも。っていうより、むしろ MFC 使わな
い方でやった方が分かりやすかったかも」
『なんですとー！？』
「まぁとりあえずこっちで見ておこうか。まず第１引数の NMHDR 構造体の
ポインタ。これは WM_NOTIFY の LPARAM として渡されるもので、この中に
通知メッセージの各種情報が入ってます」
『……だけど』

    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

『ってなに？　NMHDR って構造体が、 NM_TREEVIEW って……メッセージに
なってる？』
「これはかなり混乱の元かも。まず、 NM_TREEVIEW も構造体で、この中に
ツリービューコントロールの各種情報が入ってます」
『でも、 NMHDR と NM_TREEVIEW って構造体違うのにこんなことしていい
の？』
「これは大丈夫。 NM_TREEVIEW の最初のメンバ変数が NMHDR になってるか
ら」
『？？？』
「んー、これはメモリ上のイメージが必要かもね。メモリ上に NM_TREEVIEW
構造体が置かれてます」

[                 NM_TREEVIEW                  ]

「この中には、最初に NMHDR 、次に UINT 、 TVITEM がふたつ、最後に 
POINT 構造体が入ってます」

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

「この TVN_SELCHANGED の場合、実際には WM_NOTIFY の LPARAM には 
NM_TREEVIEW へのポインタが渡されます。つまり、ウィンドウズがこの構造
体を持ってて、そのポインタだけ LPARAM に渡してくるってこと」
『それを NMHDR へのポインタにもできる……あー、つまり上のだと』

[[ NMHDR ]]

『って見るのと同じってこと？　union みたく』
「そうそう、そういうこと。こういうのはホントは良くないんだけど、 
WM_NOTIFY の仕組みがそうなってるから」
『これはそうしなきゃ使えないわけねー』
「まぁ、これは MFC だから LPARAM じゃなくて NMHDR へのポインタが渡さ
れちゃうからこうなってるけど、 LPARAM から NM_TREEVIEW へのポインタ
にキャストしてからなら NMHDR へはメンバ変数として使えるから」
『そっちの方が安全っぽいね』
「で、この NMHDR にはツリービューコントロールのウィンドウハンドルと
か入ってるんだけど、今回は使いません」
『なんで？』
「このメンバ関数が呼ばれたってことは、どのツリービューコントロールの
通知メッセージって分かるから」
『あー』
「だからその辺は調べずに、直接 m_cMainTree でツリービューコントロー
ルを操作すればいいだけ。というわけで実際にやってみましょう」

void CMfcDialogDlg::OnSelchangedTreeMain
    (NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

    char pchText[256];
    TVITEM stTvItem;
    stTvItem.mask = TVIF_TEXT;
    stTvItem.hItem = pNMTreeView->itemNew.hItem;
    stTvItem.pszText = pchText;
    stTvItem.cchTextMax = 255;

    // 実際に受け取ります。
    m_cMainTree.GetItem( &stTvItem );
    TRACE( "%s\n", pchText );

    *pResult = 0;
}

『あれ？　どっかでみたよーな』
「 Version 8.13 ( No.155 ) の、アイテムの名前を取得するのとほとんど
同じ」
『違うのは…… TVITEM::hItem に入れてるとこだけだね』
「ここで NM_TREEVIEW の２番目の TVITEM に入ってる〈アイテムのハンド
ル〉を渡します」
『あ、おなじみの TVITEM だ』
「ふたつある TVITEM は、最初のは以前選択されてたアイテム、あとのは新
しく選択したアイテム」
『そういえば……こうやって面倒なことしてるってことは、この TVITEM の
pszText には、アイテムの文字列が入ってないんだ』
「入ってないんだよねー、残念ながら。ま、この方法自体は」
『分かってるから大丈夫だけどねー。最後の、っていうか第２引数の 
pResult は？』
「 LRESULT は API の型のひとつで、戻り値に使うもの」
『 result って〈結果〉って意味だもんね。 L は？』
「 LPARAM の L と同じ」
『 LPARAM の L ってなんだっけ』
「……教えてないかも。この話は長くなっちゃうからパス。この　LRESULT 
のポインタを通して渡した値が、ウィンドウプロシージャの戻り値として返
されます」
「？　普通にこのメンバ関数の戻り値にすればいいんじゃないの？」
『実はイベントハンドラになるメンバ関数って戻り値は void って決まって
るんです』
「あらま。だからわざわざ引数で？」
『そゆこと。というわけで API だけのに戻ります！』

/*
    Preview Next Story!
*/
『さらば MFC ……でも結構めんどいとこもあったね』
「まぁ、 API でするときの勉強も兼ねてたからね」
『全部 MFC でやったら簡単？　あ、構造体とか使わないから』
「アイテムの追加とかはかなり簡単」
『ってことは次回からまた大変ね……』
「とりあえずこんな感じ」
『うわ、コードが長い！』
「というわけで次回」
＜ Version 8.16 API だけでツリーコントロール操作 ＞
『につづく！』
「長くても、細かい部分の組み合わせなんだけどね」
『そう見えるように慣れるようにしないとね』
「そゆこと」


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

