/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

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

    送信日： 2001/02/12(Mon) No.094
    配信数： 3900（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/

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

・Codian にページを追加
　 Codian にページを追加します。今回は STL & iostream 入門から 
iostream の #18 - #20 を追加します。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/


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

2001/02/04 (Sun)
　卒論書いて、要旨書いて、あとはテレビ色々。タイムレンジャー最終回＆
もーっとどれみスタート！　祝２８万ヒット。３０万って結構大台かも。そ
してパワーポイント。

2001/02/05 (Mon)
　ゼミ＆要旨にダメ出し(爆)。明日までに直さないと〜。あと CG Gallery 
が結構人気あって嬉しかったり。２月表紙壁紙公開中！

2001/02/06 (Tue)
　要旨を書けば書くほど卒論が変わってく……。そして対戦の楽しさ！！　
そうそう、この血沸き肉踊る感覚を忘れてましたよ。日めくりカレンダーの
悲しい想い出。そしてヒカルの碁にはまり始める(爆)。

2001/02/07 (Wed)
　初めてのタイプのオファーあり。センセの指摘でさらに要旨を書き直し、
帰りにまたゲーセンで対戦(爆)。ザウルスの電池が切れる。思ったよりも早
いかった……。

2001/02/08 (Thu)
　夜中にギルティギアゼクスするのはやめましょう(爆)。眠い状態で要旨提
出。３日連続で対戦。そしてひめくりあずまんがゲット！！　一応破かずに
済みそう。でも破きてぇ(爆)。もうひとつ買う？

2001/02/09 (Fri)
　ぷらとわとかなゆ〜と辞書を書く。ギルティギアゼクスは反射神経養成ギ
プスなのよ〜。ザウルスのエラー。そして眠気電波。びびびび。

2001/02/10 (Sat)
　昼寝したら体調最悪(泣)。自作小説「風雅、舞い」を自画自賛(爆)。サイ
ファイハリーとＨｘＨがいい感じ。そして myShade2 にもラジオシティが！　
この再現性が自分のパソコンでできるんですよあーた！　４月表紙には間に
合うかなー。


/*                         鏑矢の憂鬱                             */
http://www.kab-studio.com/Programing/KabuU/

2001/02/04 (Sun)
お休み

2001/02/05 (Mon)
お便り
ベンチャーキャピタルって？
ベンチャーキャピタル( Venture Capital )は「起業家向け投資家」のこと
少し前までアメリカと日本とで違った
アメリカは経営にも大きく関わる
電通大にも SVBL というのがある
お便り
www.kab-studio.com ドメインはどうやって取ったの？
ジャストネットのMYドメインパック
ジャストネットの会員は移行が楽だった
お便り
ツールバーの項目が淡色化されているのを直すには？
ハンドラ関数を作ればいい
手動でもできる
サンプルコード
Codian の「メニューを動的に追加する（後編）」を参考
ツールバーもメニューも同じ

2001/02/06 (Tue)
お便り
ファイルの文字列置換をするには？
MFC なら楽
サンプルコード
CStdioFile でファイルを取り込んで CString に詰め込む
CString::Replace() で一発置換
「Ｃ言語による最新アルゴリズム事典」の strmatch.c とかを参考に

2001/02/07 (Wed)
XML を使ってみる
MSXML3 を試してみる
お便り
リストコントロールでヘッダーのダブルクリックを感知したい
HDN_ITEMDBLCLICK はダイアログの方に送られない
リストコントロールに送られるのでサブクラス化すればいい
クラスを新規追加して型をそのクラスに変更
WindowProc() をオーバーライド
サンプルコード
なぜか HDN_ITEMDBLCLICKW でないとうまくいかない

2001/02/08 (Thu)
お便り
「Ｃ言語による最新アルゴリズム事典」のコードが vector にあるとは
本のコードがあるっていうのが意外
お便り
HDN_ITEMDBLCLICK が取得できないし PreCreateWindow() も呼ばれない
PreCreateWindow() はウィンドウを作ったわけじゃないから呼ばれない
CWnd::PreSubclassWindow() は呼ばれる
HDN_ITEMDBLCLICK じゃなくて HDN_ITEMDBLCLICKW 
型名を変えてないのかも
サンプルコード

2001/02/09 (Fri)
TRACE() に CString をそのまま渡せるのを知らなかった……
お便り
IEnumIDList::Reset() がどうやっても NOERROR を返さないのはなぜ？
E_NOTIMPL が返ってきてるから実装されてないかも
使う必要そのものがないのかも

2001/02/10 (Sat)
お便り
RegViewサンプル見たら CEnumIDList::Reset() の実装があった
COM のソースコードが公開されているのを知らなかった
参考にできるかも


/*             プログラミング辞書・今週の追加単語                 */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
冗長

・更新単語：
リソース

・今週の状況：
　はうっ、単語の追加がひとつだけ！？　謎だ。あとリソースの項目をかな
り直しました。そのくらい。できれば来週もこのくらい少ない方が助かるん
だけどね(爆)。


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/

テンプレート
#12 メンバ関数のインスタンス化

　クラスそのものはただの「型」だから、インスタンス化してもコードにな
ることはありません。重要なのは、クラスの中のメンバ関数。これは関数だ
から、インスタンス化されることでコードになります。

　クラステンプレートにメンバ関数がある場合には、関数テンプレートと同
じように、インスタンス化された数だけ機械語のコードが生成されます。重
要なのは、これはクラステンプレートが含むメンバ関数すべてに言えること。
テンプレート引数を使っているメンバ関数だけじゃないんです。いろんなテ
ンプレート引数を使っていっぱいインスタンス化されたら、その数だけ機械
語コードが生成されちゃうわけ。
　ってことは、たとえば、クラステンプレートを１個インスタンス化して 
100KB のコードが生成されたとしたら、１０個の型でインスタンス化したら
全部で 1000KB 、つまり 1MB のコードが生成されちゃうわけ。クラステン
プレートはそういう点で、ファイルサイズを大きくする可能性があるんです。

　でも反対に、コードの節約ができる面もあるんだけどね。あるクラスのい
ろんな型バージョンを作ったとしたら、それを全部コンパイルしてくっつけ
なきゃいけない、つまり不必要なものも持ってなきゃいけないってこと。で
もクラステンプレートにしておけば、必要な型のだけコンパイルされるから
無駄がないっていうのはあるかな。
　それに、クラステンプレートそのものが、使われなかったらコンパイルさ
れないっていう特性があるから、その点でも節約になります。クラスライブ
ラリとか大きくなりがちだけど、クラステンプレートなら使わないクラスは
コンパイルされないからね。

　でもやっぱり、減るよりは増える方が大きいかも。あ、今回の話はコンパ
イラによって結構変わってくるかも。コンパイル後のコードを見て、実際に
生成されてるかどうか確認した方がいいかもね。でも、こういうこと考える
とテンプレートって使えなくなっちゃうかも。テンプレートはコードの簡略
化とかの意味の方が大きいからね。次回はメンバ関数の書き方について。
じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『今週はかぶゆ〜人気あるね』
「誰か一人からでも質問があれば、他の人も気軽に送れるからね」
『だったらサクラすればいいんじゃないの？』
「それってメリットあるのかな」
『って、じゃーお休みするのってデメリットないってこと？』
「……」
『……』
　質問は今のうちに！　もうすぐ停止するかもしんないんだし。
http://www.kab-studio.com/Programing/KabuU/
_______________________________________________________________[KCM]


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


　Version 5.29
ウィンドウとコントロールのまとめ

「というわけで、今回はコントロール編のまとめ」
『ってことは Ver 6.0 に！？』
「行きません。まだアプリ完成してないでしょ」
『ホントに１年経っちゃうよ……』
「ま、この際それは気にしないことにしましょう。まず Ver 5.23 ( No.088 ) 
でウィンドウクラスっていうのについて見てみました」
『ウィンドウを作る元になるのだよね。登録する必要があったし』
「これはそんなに重要じゃないかな。次は Ver 5.24 ( No.089 ) のウィン
ドウスタイル」
『ウィンドウのタイトルがあるかーとか、ボタンを平らにするーとか、そう
いうのを決められるんだよね』
「これは結構重要。たとえば、他のアプリ見て〈こんなスタイルにしたい
なー〉って思ったら」
『そのアプリを Spy++ で見てスタイル調べる！』
「そして自分のアプリで同じ設定にすればいいわけだ。ただ、そう簡単にい
かない場合もあったりするんだけどね」
『そなの？』
「たとえば、ウィンドウによっては自前でタイトルバー描いてたり」
『めんどそう……』
「そういうの真似する場合は、同じように描画しなきゃいけなかったりして
面倒なことになるかもね」
『次は Ver 5.25 ( No.090 ) 。 CreateWindow() でボタンを作りました！
これ、ホントに驚いたんだけど』
「ボタンなんかのコントロールは全部ウィンドウの一種だから、こういうふ
うに作ることができるわけ。実際に自分でやってみると実感するでしょ」
『するする。あと、毎度おなじみ MFC バージョンのも』
「 CButton のだね。この CButton の例で、 CButton の変数がグローバル
変数になってること、ちょっと憶えといて」
『重要？』
「ちょっとね。  Ver 5.26 ( No.091 ) はダイアログにあるコントロールを
取得する方法を紹介しました」
『コントロールは ID ナンバーが付いてるからそれで拾えるんだよね。でも
変なキャストしなきゃいけなかったり』
「キャストしない方法はウィンドウハンドルを取得してそれを操作するって
いうの」
『まず CButton に Attach() したんだよね。これが、 Detach() しないと
エラーになっちゃうってゆー』
「実は、これがさっきの CButton をグローバル変数にするっていうのと関
係があるんだよね。なんで Detach() したんだっけ」
『 CButton 変数がなくなるときにボタンを消そうとしちゃうから』
「もし Ver 5.25 ( No.090 ) の例で CButton の変数を普通の変数にしちゃ
ったら？」
『こっちも……そっか、ボタンが消えちゃうんだ！　作ったばかりなのに』
「そういうこと。だからわざわざこういう面倒なことをしてるわけ」
『ほー。 MFC も結構面倒なところあるんだね』
「これは設計方針がややこしいのかも。 Ver 5.27 ( No.092 ) ではメッ
セージを送ってリストボックスを操作してみました」
『あれ、でもさ、最初に SetWindowText() でウィンドウのタイトル変えら
れたよね。メッセージじゃないのもあるんだ』
「そういうわけじゃないよ。 SendMessage() のリファレンス見てみて」
『あ、 WM_SETTEXT を送るって書いてある！　 WM_SETTEXT ってメッセージ
だよね』
「そう、ウィンドウのタイトルを変えるメッセージ。このメッセージを使っ
てもウィンドウのタイトルを変えられます。たとえばこんなふうに」

// いつもの。
void CFileTestDlg::OnBtnShow() 
{
    HWND hLstWnd
         = ::GetDlgItem( GetSafeHwnd(), IDC_LST_DATA );
    ::SendMessage( hBtnWnd, WM_SETTEXT, 0, (LPARAM)"あいうえお" );
    return;
//  後は取っておきましょう。

『なんだ、結局メッセージ使ってるんだね』
「ウィンドウを操作する方法は、ほとんどがメッセージを送ることになるか
ら」
『ほとんどってことは、メッセージじゃできない操作もあるの？』
「あるよ。たとえばウィンドウスタイル。ウィンドウスタイルを取得したり
変更したりは、 GetWindowLong() と SetWindowLong() っていう API を使
わなきゃできません」
『これはメッセージじゃできないんだ』
「逆に、もしウィンドウやコントロールをこう操作したい、っていうのを探
す場合には」
『メッセージの一覧を見て探せばいいんだね』
「そういうこと。メッセージの見方だけど、頭に WM_ が付いてるのがすべ
てのウィンドウ、コントロール共通のメッセージ」
『 WM_SETTEXT がそうね。って、これ、共通じゃない方が分かりやすかった
んじゃない？　ウィンドウもボタンも一緒って……』
「 API はそういうところあるからねぇ。メッセージは膨大だし、全部英文
だし、探すのは結構大変かも」
『 MFC の方からっていうのは？』
「それもいいかも。 MFC の CWnd メンバ関数は、ほとんどがメッセージを
送るものだから、メンバ関数一覧から探した方が楽かも」
『あとはコントロール別のね、 BM_ とか LB_ とか』
「他のコントロールのもあるから。これも MFC の各コントロールクラスの
メンバ関数一覧から調べた方が楽かも」
『あれ？　 BM_ じゃなくて BN_ っていうのがある。誤植？』
「これは〈通知メッセージ〉っていうの。 Notify Message の N が付いて
るんで BN_ 」
『のてぃふぁいめっせーじ？　そういえば LBN_ とかあるね』
「普通のウィンドウのは NM_ 。通知メッセージは〈何かが起きた〉ってい
うのを報せるメッセージ」
『へ？　だって WM_MOUSEMOVE とかもそうじゃない』
「そう。ここで重要なのは、通知メッセージを受け取るのは、イベントが発
生したウィンドウじゃなくて、その親ウィンドウってこと」
『親ウィンドウ……コントロールだとダイアログってこと？』
「そういうこと。もしメッセージが、イベントが発生したウィンドウだけに
しか送られないとしたら、ボタンを押したとき」
『そのボタンにしか、押されたってメッセージ送られない。だから、その
メッセージ処理できない！』
「だから、押されたときは親ウィンドウに〈ボタンが押された！〉っていう
のを通知するんです。それが通知メッセージ」
『ってことは CFileTestDlg::OnBtnShow() もそういう仕組みってこと？』
「そう、実際に見てみようか。 Spy++ 実行して」
『〈てすと〉ダイアログに照準合わせて【メッセージ】にして OK 押して
メニュー【メッセージ】−【オプション】で…… BN_ ってないよ？』
「通知メッセージは直接送られてくるわけじゃなくて、 WM_COMMAND や
WM_NOTIFY っていうメッセージの WPARAM に含まれてくるんです。今回は
WM_COMMAND を見てみて」
『 WM_COMMAND を表示するメッセージにして OK で、【参照】ボタン！』

<00007> 00000EC0 S WM_COMMAND wNotifyCode:BN_CLICKED wID:1003
    hwndCtl:00000EDC
<00008> 00000EC0 R WM_COMMAND

『 BN_CLICKED ってのがそうなのね。例によって、 MFC がうまくこれを処
理して CFileTestDlg::OnBtnShow() を呼んでくれてるんだ』
「そういうこと。で」
『あ、その前にこれの読み方教えて』
「あ、えーっと、一番左の <00007> は表示してるメッセージの番号。
00000EC0 はメッセージを受け取ったウィンドウのハンドル」
『つまりダイアログのハンドルね』
「３番目の S は Send 、つまり送られてきたメッセージ。 R はウィンドウ
プロシージャでそれを処理したっていう意味の Receive 」
『ってことは S と R はペア？』
「そういうこと。あ、でも S じゃなくて Post の P もあるから。メッセー
ジ送る API には SendMessage() と PostMessage() の両方があるからね」
『それが区別されてるんだ』
「４番目は送られてきたメッセージ。それ以降は各メッセージごとに違うか
ら」
『じゃー WM_COMMAND のリファレンスっと。あ、また HIWORD ってわけわか
んないの出てきた』
「あ、じゃあついでにこれの意味も見ておこうか。 WM_MOUSEMOVE のメンバ
関数」
『はこの前削除しちゃったよ』
「あ！　そういえば……いーや、面倒だけどもう一度メンバ関数作って」
『めんどくさ、行き当たりばったりでやってるからこういうことになるの
よ』
「う”」
『はい作ったよー』
「 CDialog::OnMouseMove() にブレークポイントをセットして、実行したら
……〈てすと〉ダイアログの右端からマウスカーソルを入れていって」
『ようするにダイアログの右端へんで WM_MOUSEMOVE が出るようにすればい
いんだよね。ほいブレークポイントに止まったよ』
「座標憶えておいて、あ、１６進表示で」
『 x 座標が 0x00000168 、 y 座標が 0x00000036 だって』
「そしたらステップアウトを１回して、変数ウィンドウ表示して」
『中カッコから出るボタン、ウィンドウに四角が３つボタンっと』
「 WM_MOUSEMOVE のリファレンスにあるように、座標は LPARAM に入ってま
す」
『その LPARAM の値は…… 0x00360168 だって。あ！』
「そう、 LPARAM の最初の４バイトに y 座標が、後の４バイトに x 座標が
入ってるんです」
『そういえば、 WM_MOUSEMOVE のとこに書いてある』

xPos = LOWORD(lParam);
yPos = HIWORD(lParam);

『この LO とか HI とかっていうのが、低いと高いってことでしょ』
「そう、 WORD は API の型のひとつで unsigned short のこと。 LOWORD() 
は４バイト整数型から下位２バイトを取り出すの、 HIWORD() は同じく上位
２バイトを取り出すもの」
『なんだ、仕組みがわかっちゃえば簡単ね』
「元の話に絡めると、 Ver 5.28 ( No.093 ) でウィンドウプロシージャを
見てもらったけど、あれで全部のメッセージを処理しなきゃいけないわけ」
『だから、ひとつの変数にふたつの値を詰め込むなんてことが必要なんだ』
「でもこれだと分かりにくいでしょ。わざわざ上位２バイト下位２バイト取
り出さなきゃいけないんだから」
『 MFC はその部分を隠して楽にできるようにしてくれてるってわけね』
「そういうこと。ウィンドウやコントロールの全体像はこんな感じ」
『……なんとなーく、分かったような気がする』
「うん、今はそんなとこでいいから」
『いいの？』
「こういうのは自分で組むようにならないと実感できない部分あるからね」
『 MFC みたいなの自分で作るの！？』
「いや、そこまではいかないけど、でも半年後位にはウィンドウプロシージャ
作ってもらうから」
『難しい？』
「そんなことないよ。ただ、先に憶えてもらいたいことがあるからちょっと
後回しってだけ」
『ホントに半年後にできるのかな……』
「あ、そうだ、さっきの CFileTestDlg::OnMouseMove() 削除しといてね」
『もっと計画性なんとかしろー！』

/*
    Preview Next Story!
*/
『で、まだ Ver 5 は続くのね』
「次はファイルダイアログ！」
『ファイルダイアログ？』
「そう、〈ファイルを開く〉とか〈ファイルを保存〉とかのダイアログ」
『というわけで次回』
＜ Version 5.30 ファイルダイアログを使おう！ ＞
「につづく！」
『げ、それあたしが作るの！？　できるわけねーっ！！』
「いやだから、それを作らなくていいんだよって話だから」


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

・Codian にページを追加
　 Codian にページを追加します。今回は STL & iostream 入門から STL 
の #18 - #21 を追加。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/



/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www.kab-studio.com/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊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/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

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


/*                      See you next week!!                      */


