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

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

    送信日： 2001/01/29(Mon) No.092
    配信数： 3860（ 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/


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

2001/01/21 (Sun)
　卒論 PB1 完成！！　汗と血と涙の結晶がいまここに！　そのあとはタイ
ムレンジャー見たりしてのんびり。「横濱カレーミュージアム」のメモとか
も。ゆっくりしたら行ってきましょう。

2001/01/22 (Mon)
　ゼミにて卒論 PB1 発表！　んでも印象はどうだったのかな？　そしてわ
ては音楽が得意なのだよとゆー話。

2001/01/23 (Tue)
　 Java やって GGX やってピヨってイラスト描いて刃牙見て旅行は行きた
いと思わなくて、と色々した日。

2001/01/24 (Wed)
　ドリキャス製造中止にかぶスタは上へ下への大騒ぎさ！　って程でもなく
て、逆にセガのゲームが安定供給されそうで安心？　あと病院に薬取りに行
ったりイラスト描いたりメイでクリアしたり。

2001/01/25 (Thu)
　ゼミ。卒論はＯＫらしいです。なので推敲とかして完成させましょう。あ
とマンションズ＆ドラゴンズとか購入。「ようこそ」４コママンガ化計画？

2001/01/26 (Fri)
　ザウルス購入！　ビックカメラ立川店ができたんで行って買ってきました。
なかなかいいっすよー。あと新伊勢丹とかも見てきました。立川は変わって
くー。

2001/01/27 (Sat)
　ギルティギアゼクスとかザウルスの PIM 機能とか、あとアニメとか。な
んかやや低調？


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

2001/01/21 (Sun)
お休み

2001/01/22 (Mon)
お休み
Java + XML 試す予定

2001/01/23 (Tue)
Java を初めて使う
C マガジン１月号 CD-ROM の IE5.5 と Borland JBuilder 4 Foundation 
JBuilder 4 IDE が重くてよく落ちる
JDK1.3 だけ取り出して VC のツールコマンドで実行
お便り
Win98 で IContextMenu2 が落ちるのはなぜ？
Win2000 では問題ない
シェルエクステンションは難しいかも
shell32.dll を更新するか IContextMenu3 を使うか

2001/01/24 (Wed)
XML を初めて使う
XML は便利そう
XML を簡単に理解する方法
XML はデータ保存形式のひとつ
テキスト形式で <Data>100</Data> と記述する
XML は「フォーマットの定義」をするための言語
XML ファイルは実際のデータとそのデータのフォーマット定義から成り立つ
そのフォーマット定義からデータを簡単に取り出せる
テキストファイルで作れる、ライブラリが揃っている
スタイルシートを使って HTML のようにブラウザで表示できる
世界標準などのメリット
C マガジン２月号のを試すといいかも

2001/01/25 (Thu)
ぷらとわ書き
MFC のウィンドウプロシージャやメッセージ搬送機能を少しだけ
Spy++ とかが中心

2001/01/26 (Fri)
お便り
CreateWindow で EditBox を作成してもカーソルが動かないのはなぜ？
ちょっと謎
サンプルコード
他に何かしているのかも

2001/01/27 (Sat)
プログラミング辞書
いまさら「演算子」
多次元配列、よく知らない


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

・追加単語：
C# 言語 CLR CLS if ISO ISO9660 MFC42.dll MPP RAID 演算子 オーナー 
矩形 再定義 スパン ポインタのポインタ 有効桁数 リストコントロール 
ロック 

・今週の状況：
　今回も多いですね。なんか多いときと少ないときの落差が激しいような気
が(汗)。


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

テンプレート
#11 クラステンプレートのインスタンス化

　もう一度、前回の例を見てみます。

template< class type_Mem1 >
class CClassTemplate
{
public:
    type_Mem1 m_1;
};

　このクラステンプレートを使う時には、

    CClassTemplate< int > cClsTmplInt;

　って感じに、テンプレート引数を明示します。
　この時点で CClassTemplate< int > がインスタンス化されます。テンプ
レート引数が置き換えられた CClassTemplate 、つまり

class CClassTemplate
{
public:
    int m_1;
};

　がコンパイラの中で作られて、これを型として変数 cClsTmplInt が宣言
されます。そうすれば、

    cClsTmplInt.m_1 = 100;

　ってできるようになります。
　もし、

    CClassTemplate< double > cClsTmplDb;

　ってすれば、もちろん

class CClassTemplate
{
public:
    double m_1;
};

　ってなります。でも、これはあくまで単なる型。だから、関数テンプレー
トの時みたいに、機械語への変換は直接的には関係ありません。関係してく
るのはメンバ関数を使ったとき。それは次回。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『ザウルスはアプリ作れないの？』
「作れるよ、でも作るためのアプリが高くてね」
『作るためのアプリって、 VC みたいなのってこと？』
「そういうなの。４万近くするから」
『げ、そんなに高いんだ！』
「 VC もそのくらいするんだよ。学割で安く買えるんだけど」
『でもあたしは学生じゃないよ？』
「あ！　そう言えば、火美ちゃんのライセンス取ってないや……」
『ええっ、じゃああたしのは違法使用！？』
「あーでも火美ちゃんは人間じゃないからいーか」
『それはそれでヤダ……』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.27
メッセージを送ろう！

『この前は MFC と API 使って、コントロールのハンドルをゲットして操作
したんだよね』
「そして、今回は MFC を使わずにやってみましょう！　じゃ、前回やった
ボタンの文字列を書き換える例から」

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

『……すっげー簡単じゃん』
「これは肩慣らしだからね」
『げ、そうなんだ。えーっとまず、前回も使った GetDlgItem() で
IDC_BTN_SHOW ボタンのウィンドウハンドルをゲットして、それを HWND 型
変数に格納っ』
「次の行もこの前の API 版」
『 CWnd::SetWindowText() じゃなくて、今回は API の SetWindowText() 
ね。ビルドして実行、ボタンが〈あいうえお〉になった！』
「とういうわけで、 API の操作はこれが基本。じゃ、次に、前回の最初に
やったリストボックスの操作をしましょう」
『はーい！』

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

『なんだ、初見の API ひとつ増えただけじゃん』
「最初の行はさっきと同じ」
『 IDC_LST_DATA リストボックスのウィンドウハンドルをゲットして、それ
を次の SendMessage() っていう API で使ってるんだよね』
「とりあえず動作確認」
『ビルドして実行！　うん、ちゃんとリストボックスに〈あいうえお〉って
出たよ。つまりこの SendMessage() っていうのが追加してくれてるんで
しょ？』
「もちろんそれはそう。でもどうやって追加してると思う？」
『んー、えっと、第１引数が追加先のウィンドウハンドルでしょ、第２引数、
CListBox::AddString() に似てるから、なんかこれが〈追加っ！〉ってこと
なのかな。あと第４引数が追加する文字列。 LPARAM っていうのにキャスト
してるけど』
「じゃ、 MSDN の LB_ADDSTRING のページを見てみて」
『ほい。……日本語のページ出ないよ？』
「そう、日本語のページはないんです」
『なんで？』
「メッセージには日本語のリファレンスがないんです」
『メッセージ？』
「そう。〈キーワード〉欄に LB_ っていうのがいっぱいあるでしょ。これ
全部メッセージ」
『うわいっぱい！』
「メッセージは、ウィンドウを操作するために、ウィンドウに送るもの」
『あ、だから LB_ADDSTRING を SendMessage() で送ると、リストボックス
に追加できたんだ！』
「そういうこと。本来は、ウィンドウやコントロールを操作するためにはこ
のメッセージを送る必要があります」
『本来？　……そっか、 MFC もこのメッセージっていうの送ってるんだ！』
「そういうこと」
『ってことは…… CListBox のメンバ関数、このメッセージって言うのと似
たのばっかり』
「 CListBox::GetCount() は LB_GETCOUNT 、CListBox::GetTopIndex() は
LB_GETTOPINDEX 」
『だから』
「ちょっと待って！　えっと、この前の……」

// いつものメンバ関数。
void CFileTestDlg::OnBtnShow() 
{
    CListBox *pcListBox
        = (CListBox *)GetDlgItem( IDC_LST_DATA );
    pcListBox->AddString( "あいうえお" );
    return;
//  あとは取っておきましょう。

「前回最初のプログラムだね」
『 AddString() してるとこにブレークポイント置いて、ビルドして実行、
ステップイン……ホントだ、 CListBox::AddString() の中で 
::SendMessage() で LB_ADDSTRING 送ってる！』
「それだけじゃなくて」
『ほ、他の CListBox のメンバ関数も LB_ なメッセージ送ってる！』
「これで、コントロールをどうやって操作していたか分かった？」
『うん、分かった。でも結構簡単だよね』
「操作するっていう部分だけならね」
『どゆこと？』
「それはあとのお楽しみ。もう少し SendMessage() について見ておこうか」
『はーい』

    ::SendMessage( hLstWnd, LB_ADDSTRING, 0, (LPARAM)"あいうえお" );

「 SendMessage() の宣言部も書いておこうか」

LRESULT SendMessage(
    HWND hWnd, 
    UINT Msg, 
    WPARAM wParam, 
    LPARAM lParam 
);

『第１引数はリストボックスのウィンドウハンドルだね』
「この第１引数のウィンドウにメッセージを送ります」
『第２引数はメッセージだよね。あ、 UINT ってことは unsigned int なん
だ』
「 API は整数値でほとんど間に合わせてるから。ウィンドウスタイルや、
コントロールの ID もそうだったでしょ」
『メッセージもどっかで #define とか const int とかされてるの？』
「されてるよ、 winuser.h とかで。 #define だね」
『第３引数は使わないみたいだけど、じゃーなんで第３引数あるの？』
「それは、第３引数と第４引数はメッセージによって使い道が違うから」
『違うってどういうこと？』
「 WPARAM は unsigned int 、 LPARAM は long 、つまりどっちも」
『３２ビット整数値の符号なしとありね』
「で、この３２ビットサイズに収まるものならなんでも渡しちゃおう、って
いうのがメッセージの考え方」
『……つまりそれは、整数値も送るし、文字列ポインタも送る、ってことな
のね。なんかそれって危なくない？』
「危ないよ。メッセージを取り間違えて、キャストし間違えたらアウトだか
らね」
『なんでそんな危険なことすんの？』
「そりゃ、メッセージっていうシステムひとつで、いろんなことをできるよ
うになってるからね」
『うん、確かに、 LB_ なメッセージ、いろんなの送れて、いろんなことで
きるっていうのは分かるんだけど、わざわざそんなことしなくていーじゃん。
関数にしちゃえばいいのに』
「あ、そっか、これは受け取る側のことを知らないと……」
『受け取る？』
「 LB_ADDSTRING を送ったらリストボックスに文字列が追加される、ってい
うのももちろんプログラムとして作られてるんだけど」
『うん』
「そのプログラムの中では、送られてきたメッセージをそのまま受け取って
るんです」
『そのまま受け取る？』
「 MSDN で WindowProc() っていう API のリファレンスを開いて」
『ほい』

LRESULT CALLBACK WindowProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);

『あ、 SendMessage() と同じだ！』
「これを〈ウィンドウプロシージャ〉って言います」
『うぃんどうぷろしーじゃ？』
「ウィンドウはこのウィンドウプロシージャを持ってて、メッセージが送ら
れてくるとこの関数が呼ばれて、引数がそのまま渡されるんです」
『ウィンドウはって、じゃあこのダイアログとかも？』
「もちろん、今プログラムしてる FileTest もね。簡単に見ておこうか。
CFileTestDlg::OnBtnShow() の中でブレークポイントをセットして」
『さっき AddString() にセットしてたからそれでいーや』
「実行して止まったら、メニューの【表示】−【デバッグウィンドウ】
−【コールスタック】を選んで」
『あ、初めてのだ』
「コールスタックは、今実行してる関数を呼んだ関数、さらにその関数を呼
んだ関数、っていうふうに関数をさかのぼって見ることができるもの」

CFileTestDlg::OnBtnShow() line 186
_AfxDispatchCmdMsg() line 88
（略。あと小カッコの中身も略）
AfxWndProc() line 368
AfxWndProcBase() line 220 + 21 bytes
KERNEL32! bff7363b()
KERNEL32! bff94497()

『うわー、 CFileTestDlg::OnBtnShow() までにこんなにいっぱい関数が呼
ばれてるんだ』
「下から３行目の AfxWndProcBase() をダブルクリックして」
『その関数が見られるんだね』

AfxWndProcBase(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)

『あああっ、その WindowProc() っていうのと引数が同じだ！』
「メッセージが送られてくるとこの関数が呼ばれて、各引数がそのまま渡さ
れます」
『つまり、メッセージが送られてきたのをこの関数で受け取るのね』
「こういう、たったひとつの関数で受け取る仕組みになってるから、いろん
な引数は使えないわけ」
『その代わり、 WPARAM と LPARAM にいろんな型を詰め込むのね』
「そういうこと。でもこれじゃ不便だから、メッセージに合わせて引数を変
更して、最終的に CFileTestDlg::OnBtnShow() が呼ばれる、みたいな仕組
みを MFC が持ってるってわけ」
『なるほど。……ちょっと待った！！　って事はつまり、ボタン押したって
ことそのものもメッセージだってゆーの！？』
「というわけで次回に続く！」

/*
    Preview Next Story!
*/
『楽しいけど、怖いよね』
「なにいきなり」
『プログラムの仕組みとか分かってくると、なんか怖いかも』
「確かに、なんかタブーに触れてるって感じはあるかな」
『というわけで次回』
＜ Version 5.28 イベント＝メッセージ ＞
「につづく！」
『たとえるなら、初めて〈つゆだく〉を頼んだ時の感覚？』
「っておまえ食ったんかい！」
『はぁ〜い』


/*                ２００１年２月５日（月）の更新予定              */

・２月表紙壁紙公開
　毎月恒例、新しい表紙壁紙です。２月はバレンタインデーな火美ちゃんで
す。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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!!                      */


