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

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

    送信日： 2001/02/05(Mon) No.093
    配信数： 3870（ 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/

2001/01/28 (Sun)
　２月表紙壁紙のために myShade2 でモデリング。でもうまくいかん(泣)。
手で描いてもうまくいかないから 3DCG でってことになるんだけど、でも限
界もあるし……。あとザウルスにスケジュール書き込み。 PDA として本格
使用開始。そしてどれみしゃーぷっの最終回。

2001/01/29 (Mon)
　ゼミ行ったりギルティギアゼクスしたりバレンタインの装飾をチェックし
たり。ザウルスの絞り込みに感動。

2001/01/30 (Tue)
　２月表紙壁紙完成！　モデリングと着色方法の解説あり。モデリングに大
半の時間を費やしてます(汗)。あとアルジュナ。普段のスパイクとハンバー
ガースパイクは別人なのねん。

2001/01/31 (Wed)
　ぷらとわ書き。ぷらとわはもっと小説っぽくしたかったなぁとか。推敲っ
て面倒。ランニングしてない。ぼーるの命日。にゃー。

2001/02/01 (Thu)
　夢の感触。卒論の推敲はやっぱめんどい。 TEX とかその他印刷用アプリ。
久々セーフモード起動。ギルティギアゼクスとドリキャス。そしてやっぱり
ザウルス。ザウルスは「これできないかな」がほとんどできるのがすごい。

2001/02/02 (Fri)
　またもやゼミ。ザウルス使って行き帰りの電車内で４コママンガのコンテ
を書く。そして TEX の誘惑。んでも卒論には不可なの(泣)。

2001/02/03 (Sat)
　卒論の推敲したりギルティギアゼクスしたり。ギルティギアゼクスには１
万円の価値がある！


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

2001/01/28 (Sun)
お休み

2001/01/29 (Mon)
お休み

2001/01/30 (Tue)
お便り
先に BMP の形で画像全体を用意してから出力するには？
ソースコードを公開しているエディタはない？
エディタ実現は大変そうだからソースコードは見てみたい
メモリデバイスコンテキストの例が２０００年１２月１９日のに
http://www.kab-studio.com/Programing/KabuU/200012b.html#20001219
画面に出てる DC を元に CreateCompatibleDC() を呼び出す
これで作られるのがメモリデバイスコンテキスト
これには「キャンバス」になるビットマップが存在しない
CreateCompatibleBitmap() で作って SelectObject() で貼り付ける
描画してから BitBlt() でメモリ DC から画面に出てる DC にコピー
必要なときだけ描画するようにすれば早くなるはず

2001/01/31 (Wed)
お便り
うまくいった
エディタのソースコードはやっぱりなさそう
通信系クライアントで特にエディタ必須状態
メモリデバイスコンテキスト
「ビットマップを作って付ける」っていうのを知らない人が多そう

2001/02/01 (Thu)
お休み

2001/02/02 (Fri)
お休み

2001/02/03 (Sat)
お休み
１週間に２回だけ……



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

・追加単語：
| CLI Microsoft Microsoft.NET MSComm MSIL UNUSED_ALWAYS 

・今週の状況：
　先週と今週、 .NET 関係の単語が結構あったんですけど、まだ使ってない
こともあってかなり言葉足らずの解説になってます。詳しい解説は VS.NET
が出て使ってみてからになるかも。ってゆーか .NET を使ったアプリを作る
かどうかも不明……。


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

テンプレート
#11 クラステンプレートのメンバ関数

　クラステンプレートのテンプレート引数は、メンバ変数の型だけにしか使
えないってわけじゃありません。たとえば、メンバ関数の引数や戻り値にも
テンプレート引数を使うことができます。

template< class type_MemVar >
class CTmplForMemFunc
{
public:
    type_MemVar MemFunc( type_MemVar p_MemVar )
    {
        return p_MemVar;
    }
};

　って感じに、メンバ関数の引数や戻り値にテンプレート引数を使うことが
できます。使用例はこんな感じ。

void Use_CTmplForMemFunc()
{
    CTmplForMemFunc< int > cTmplForMemFunc;
    printf( "%d\n", cTmplForMemFunc.MemFunc( 100 ) );
    // 100
}

　「メンバ関数のテンプレート」って考えると、なんだか関数テンプレート
っぽい使い方ができそうだけど、それは「メンバテンプレート」って言って
これとはちょっと違うもの。この例みたいに、クラステンプレートのテンプ
レート引数をメンバ関数に使う場合には、ちゃんとクラステンプレートのテ
ンプレート引数を指定して使わなきゃダメ。自動じゃないってことね。
　「自動じゃない」って部分は結構重要。クラステンプレートのテンプレー
ト引数は、マクロとかを使わない限り、自動で決められることはありません。
だから、そういう使い方はクラステンプレートではできないってことね。た
だ、関数テンプレートの「自動で決める機能」を使ってクラステンプレート
の引数を決めることはできるから、そういう方法を使うのもありかな。その
辺はもう少し先になってから。次回はメンバ関数のインスタンス化について。
じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『かぶゆ〜のお休み、多くない？』
「質問がないとお休みみたいだね」
『お休みだとお客さん少ないね』
「日記の半分くらいだね、でも前はこういうのなかったんだけど」
『どゆこと？』
「表紙に〈お休み〉って出してても、前はヒット数減らなかったんだけど」
『最近は減るんだ。ってことは、表紙がちゃんと読まれてるってこと？』
「そういうことだね。これはこれでいいことかもね」
『そりゃうちは〈読まれてる〉って判るからいいけど、お客さんは……』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.28
イベント＝メッセージ

「さてさてさて！　ウィンドウを操作するときはメッセージを送る！」
『リストボックスに文字列追加するのに LB_ADDSTRING を送りました！』
「しかし！　メッセージは単にそれだけじゃなく」
『ぼ、ボタン押したらメッセージ送られてくるの！？』
「そうです。ってゆーか……〈イベント〉って憶えてる？」
『何かが起きた、ってことだよね。ボタン押されたのもイベントだよね』
「そう。で、そのイベントはすべて、メッセージとして送られてきたものな
のです」
『……すべて？』
「すべて。見た方が早いかもね。 Spy++ を起動して、照準を〈てすと〉ダ
イアログに合わせて」
『ほい』
「【ウィンドウ検索】ダイアログの一番下に【表示】っていう囲いがあるで
しょ。それを【メッセージ】にして」
『ほい。んで OK ボタン？』
「押したらメニューの【メッセージ】−【オプション】」
『ほい。ダイアログ出たよ』
「【メッセージ】ページにして」
『ほい。左にリストボックス、右はチェックボックスいっぱい』
「左の【表示するメッセージ】っていうの眺めてみて」
『なーんかいっぱいあるねー……これ全部メッセージ？』
「そう、全部メッセージ。 LB_ADDSTRING もあるよ？」
『ホントだ……これ全部でいくつあるんだろ』
「じゃ、その下の【すべて選択】を選んで」
『あ、これで分かるんだ。…… 849 メッセージぃ！？　そんなにあるの？』
「たとえば最初の方に BM_ っていうのあるでしょ。これはボタンのメッセー
ジ」
『そっか、コントロールの数だけメッセージがあるんだね』
「もちろん他のもあるけどね。とりあえずこの状態で OK して」
『ほい』
「で、〈テストダイアログ〉をちょちょっと」
『ちょちょっと……うわーっ！！　 Spy++ になんかすんごくいっぱい出て
きたっっ！！』
「これ全部メッセージ」
『こ、これ全部！？　ってことはなに？　ダイアログひとつでこんだけの
メッセージばばばって処理しちゃってるわけ！？』
「処理してるかどうかは別として、受け取ってはいるわけ」
『す、すごい……』
「じゃ、またメニューの【メッセージ】−【オプション】を選んで」
『ほい』
「【すべてクリア】で全部の選択を解除してから、【表示するメッセージ】
の中から WM_MOUSEMOVE を選んで」
『 W だから下の方…… WM_MOUSEMOVE あった』
「 OK して、ついでに【メッセージ】−【クリア】を選んで」
『あ、メッセージ消えた』
「さて。今回は数あるメッセージの中から、 WM_MOUSEMOVE っていうメッ
セージが送られてきた時だけ Spy++ に表示されます」
『 WM_MOUSEMOVE って言うくらいなんだから、マウスが動くと……メッセー
ジが送られてきた！』
「マウスをちょっと動かすだけで」
『次々と送られてくる！　たったこれだけで送られてくるんだから、そりゃ
いっぱい送られてくるわよねー。あ、 xPos と yPos って、座標も表示され
るんだ』
「これは LPARAM の値」
『 LPARAM ってなんだっけ』
「前回やったでしょ、 SendMessage() 」
『そうそう、その関数の引数だったね』
「 WM_MOUSEMOVE が送られるとき、その引数にマウスの位置が渡されるわけ。
 MSDN の WM_MOUSEMOVE を見てみて」
『ほい。 LOWORD とか HIWORD とか分かんないけど……』
「 LPARAM には x 座標と y 座標両方が入ってて、そのうちひとつだけを取
り出すのに LOWORD とかを使ってるってこと」
『んー？』
「まぁそれは置いといて。つまり、ホントは LPARAM として送られてくるん
だけど、それを Spy++ が中身の分かる形で表示してくれてるってこと」
『便利ってことね』
「というわけでつまり」
『つまり、メッセージってホントにいっぱい送られて来てるってことだよね』
「そして、こういう〈マウスカーソルが動く〉っていうことも〈イベント〉
のひとつってこと」
『え？　じゃあ、この〈マウスが動く〉っていうので……たとえば
CFileTestDlg::OnBtnShow() が呼ばれる、みたいなことできるってこと？』
「そうだよ。メニューの【表示】−【ClassWizard】で」
『ダイアログ出たよ』
「【メッセージ マップ】のページで、【クラス名】が CFileTestDlg 、
【オブジェクト ID 】も CFileTestDlg なのを確認してから、【メッセージ】
の下の方を……」
『 WM_ っていうのいっぱいあるね、これがメッセージなんだよね。あ、
WM_MOUSEMOVE があった！』
「それを選択して【関数の追加】ボタン押して【コード編集】押して」
『ほいほい。あ、 CFileTestDlg::OnMouseMove() って関数できた！』

void CFileTestDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: この位置にメッセージ ハンドラ用のコードを
    // 追加するかまたはデフォルトの処理を呼び出してください

    CDialog::OnMouseMove(nFlags, point);
}

『マウスを動かすとこれが呼ばれるの？』
「呼ばれるよ。こう書き換えて」

void CFileTestDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
    TRACE
        ( "CFileTestDlg::OnMouseMove: %d, %d\n"
        , point.x, point.y );

    CDialog::OnMouseMove(nFlags, point);
}

『 CPoint ……ってまー点って意味なんだろうけど』
「 CPoint は MFC のクラスで、〈点の座標〉を格納するためのもの。あと
で MSDN 見といてね」
『んじゃビルドして実行。うわ、マウス動かすだけでアウトプットウィンド
ウに出てくる！』

CFileTestDlg::OnMouseMove: 251, 194
CFileTestDlg::OnMouseMove: 253, 193
CFileTestDlg::OnMouseMove: 255, 193
...

「でもダイアログの上じゃないと出ないでしょ」
『ホントだ、リストボックスの上でも出ない』
「これはダイアログのメッセージしか処理しないからね」
『これ見ると、 x と y にマウスの位置が入ってるってこと？』
「そういうこと。 Spy++ に似てるでしょ」
『うん似てる。でもこれも、 LPARAM っていうのをなんか処理してるんだよ
ね』
「じゃあ見てみましょう。今のの TRACE() の所でブレークポイント」
『ほい』
「ステップアウトのボタン押して。〈中カッコから出る〉っていうの」
『これ押すとどうなるの？』
「今の関数から抜けて、呼び出してる部分を表示するの。つまり〈何度もス
テップインし続けて関数から抜けるとこまで行く〉っていうのを自動的にし
てくれてるってこと」
『ようするに CFileTestDlg::OnMouseMove() を呼んでる部分が出るってこ
とね。ぽちっと』

BOOL CWnd::OnWndMsg
    (UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
(略)
    case AfxSig_vwp:
        {
            CPoint point((DWORD)lParam);
            (this->*mmf.pfn_vwp)(wParam, point);
            break;
        }
(略)
}

『……なんか、むっちゃ、むっちゃ難しいんですけど！』
「うん、これはかなり難しいね。とりあえず、この関数の引数を見てみて」
『あ、ウィンドウプロシージャっていうのに似てる！』
「実際そう。これが MFC の実質的なウィンドウプロシージャってことかな」
『ってことは、 WM_MOUSEMOVE なら lParam ってのにマウスの位置が入って
るんだ』
「で、 message に WM_MOUSEMOVE が入ってると、この case に入ります」
『 case って…… Ver 2.9 ( No.020 ) でやったね。整数値で if みたいな
のができるのだね。……でもそう考えると、この AfxSig_vwp ってへんてこ
なのが』
「 WM_MOUSEMOVE って意味なんだよね、実は」
『ま、 WM_MOUSEMOVE でこん中に入るってことは分かったけど。あ、それで
次の CPoint point((DWORD)lParam); ってとこで lParam のを CPoint に入
れてるんだ』
「これがあるから、 CFileTestDlg::OnMouseMove() は CPoint で簡単にマ
ウスの座標を取得できるんです」
『してくれなかったら？』
「自分でこいうことして lParam から取り出さないとダメ」
『面倒ね……』
「で、次の (this->*mmf.pfn_vwp)(wParam, point); で 
CFileTestDlg::OnMouseMove() を呼び出してます」
『どうやってもそう読めないんだけど……』
「ま、この辺はどうでもいいんだわ。あと４回ステップアウトして」
『ほいほいほいほい。 AfxWndProcBase() っていう関数……あ、この前の関
数だ！』
「これがホントのウィンドウプロシージャ。つまり！」
『つまり？』
「 MFC だって、ウィンドウプロシージャが付いてて、メッセージ送られて
きて、それを処理してるんだってこと」
『で、 CFileTestDlg::OnMouseMove() が呼ばれるまでに複雑なことがなん
かされてるってことね』
「そう、この辺をこんなふうに便利にするにはかなり面倒なシステムが必要
なんだよね」
『 MFC も苦労してるのねー』
「そのおかげで、 CPoint にマウスの座標が入ってて、簡単に処理できるよ
うになってるってこと」
『ふーん』
「そして！」
『そして？』
「前回の話に戻りましょう。この前火美ちゃんは」
『 SendMessage() みたいなのじゃなくて、メンバ関数直接呼ぶみたいな方
がいいのにって言ったんだけど……』
「このウィンドウプロシージャの仕組みはウィンドウズそのもののシステム
と深く関わってて、これナシにじゃメッセージを受け取れないんです」
『ようするに、ウィンドウプロシージャなしじゃイベントの処理できないか
ら、このウィンドウプロシージャって仕組みは変えられないんだよね』
「そういうこと。で、それじゃ不便だから」
『 MFC はその辺を便利になるようにしてて、だからメンバ関数が呼ばれて
簡単にってなってるんだよね』
「そういうこと」
『結局は、いつものパターンね……』
「あ、そうだ、 CFileTestDlg::OnMouseMove() はテスト用だから削除しと
きましょう」
『ただ削除しちゃえばいいの？』
「ダメダメ。まず ClassWizard 表示して、さっきみたいに WM_MOUSEMOVE 
を選択してから【関数の削除】ボタン押して」
『ほい。ダイアログ出たよ？』
「【はい】押して【OK】押したら、 CFileTestDlg::OnMouseMove() の方も
削除してＯＫ」
『削除してビルドっと、うん大丈夫』

/*
    Preview Next Story!
*/
「さて次回でコントロール編最終回！」
『長かったねぇ』
「今回はちょっと面白かったでしょ？」
『別にそーゆーわけじゃないけどぉ……』
「ふふん？　でも色々試してみてるみたいだけど」
『確かにまー、色々 API 使ってみたりしてるけど……』
「いい兆候だねー」
『というわけで次回』
＜ Version 5.29 ウィンドウとコントロールのまとめ ＞
「につづく！」
『昨日は、ファイルを削除する API 試してみたりとか……』
「ま、まさか！！」


/*              ２００１年２月１２日（月）の更新予定              */
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/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
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!!                      */


