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

    (C)KAB-studio 1999 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp

    送信日： 1999/11/29(Mon) No.034
    配信数： 3230（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


/*                        今週の「どう？」                        */

『じゃ、次のお便り』
「ってゆーかないんだよねー」
『なんですってー！！　ってひさしぶりねーこれ』
「ま、たまにはいいんじゃないかな」
『私たちは KAB-studio.h や #pragma twice についてのご意見ご希望ご感想
を切望しています！！』
http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/Impression/
「のページで送ってください」
『お待ちしてまーす！』


/*              １９９９年１１月２９日（月）の更新                  */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・リンク集更新。
　降って殖いた更新（爆）。「無人島」さんへのリンクを追加しました。小
説のページです。そーいやうちはどーしよー。えーかげん……。

無人島：
http://www1.odn.ne.jp/~aaf53870/mujintou.index.html
かぶスタ・リンク集：
http://www2.justnet.ne.jp/~kabstudio/Info/Link/Link.html


/*                        チョー普通な日記                        */
http://www2.justnet.ne.jp/~kabstudio/nikki2/

１９９９年１１月２１日（日）：
　１２月表紙完成！！　しかーし、作った本人は出来に不満（汗）。さて、
みなさんの評価は？

１９９９年１１月２２日（月）：
　疲れたんでちょっとお休みな感じ。ホントねー、先週今週はきついっす。
まー自業自得って感じがせんでもないが。むぅ。

１９９９年１１月２３日（火）：
　愚痴です。数学分かんなくてキレてます。読まない方がよろしいかと。

１９９９年１１月２４日（水）：
　喜んでます。数学分かって狂喜してます。バカですね。あとメンバ変数
っぽく振る舞うメンバ関数の作り方も。

１９９９年１１月２５日（木）：
　授業開始。なんかつまんない日々。むぅ。

１９９９年１１月２６日（金）：
　そして実験。疲れてるけどうまくいってるっぽい。さて、印刷はどうしよ
う、という話。

１９９９年１１月２７日（土）：
　で、印刷は一太郎で、という話。んでアニメ色々。ゾイドっていいですよ
ねー。

/*                       #pragma twice                            */

　Version 3.9
ラッパークラス！


「さっそく前回を振り返ってみると」
『CWnd の中には m_hWnd って変数、メンバ変数があって、CWndのメンバ関
数を呼び出すと、この m_hWnd をＡＰＩの方に渡してる、って話だったよね』
「そうそう。今回はこの部分をもっと突き詰めて考えてみます」
『おー』
「さて、まず最初に CCalcApp::InitInstance() の定義部を表示してみて」
『……？』
「CCalcApp は？」
『えっと、確かアプリの本体を管理するクラスとかなんとか……Calc.h と
Calc.cpp の中にあるんだよね』
「CCalcApp::InitInstance() は？」
『あ、これは憶えてるよ。たしか〈アプリができるぞ！！〉って時に呼ばれ
るメンバ関数だよね』
「で、定義は〈関数の本体〉のことだから……」
『ってことは Calc.cpp の中にあるから、これを【FileView】で開いてっと
……うん、表示したよ』
「じゃ、こんなふうに書き加えて」

BOOL CCalcApp::InitInstance()
{
    // ここから書き加えてください。
    HICON hIcon;
    hIcon = ::LoadIcon( m_hInstance
                    , MAKEINTRESOURCE( IDI_ICON1 ) );
    TRACE( "%X\n", hIcon );

    hIcon = LoadIcon( IDI_ICON1 );
    TRACE( "%X\n", hIcon );
    // ここまで書き加えてください。

    // あとはそのまま。
    AfxEnableControlContainer();
    // 以下略。

『うわー、なんかむつかしそー』
「最初からひとつずつ考えてみれば大丈夫。まず最初は？」
『hIcon って変数作ってる。HICON 型だからアイコンハンドル入れるんだよ
ね』
「そうそう。次も前に見たのでしょ」
『あ、LoadIcon() ってＡＰＩを呼んで、アイコンのハンドルをもらうんだ
よね。……あれ？　m_hInstance って……』
「これは初見のはず。これは CWinApp のメンバ変数で、インスタンスハン
ドルを格納してるもの」
『？？』
「まず CWinApp は？」
『たしか、CCalcApp はその CWinApp ってクラスから継承してるんだよね。
だから CCalcApp は CWinApp の機能をそのまま使えるんだよね』
「そうそう。インスタンスハンドルは？」
『アプリのハンドル。でもさ、この前は AfxGetInstanceHandle() って関数
呼んでたよね』
「AfxGetInstanceHandle() は m_hInstance が持ってるのと同じハンドルを
返してるから、基本的には同じ事だね」
『ふーん。で、メンバ変数ってことは、m_hWnd と同じ感じってことね〜。
ってことはやっぱし CWinApp 見るとそんなかにあるの？』
「そう。この前使った全文検索で検索してみると……」

（以下 ＭＦＣからの引用）
class CWinApp : public CWinThread
{
    DECLARE_DYNAMIC(CWinApp)
public:

// Constructor
    CWinApp(LPCTSTR lpszAppName = NULL);

// Attributes
    // Startup args (do not change)
    HINSTANCE m_hInstance;
（引用 ここまで）

『ほんとだー、m_hWnd のときと同じだね』
「あと、メンバ変数は m_ って付けるルールになってるから。これなら一目
瞭然でしょ」
『うん、分かりやすいかも』
「で、次は？」
『次の TRACE() は、ハンドルの出席番号ってのの表示』
「そ。次は？」
『あれ？　LoadIcon() 呼んでるってことは、同じことしてるの？』
「ちょっと違うかな。よーく見てみて」
『ん……あ、これ、:: が付いてないから CWinApp のメンバ関数だ』
「そういうこと。ちなみに前に使った AfxGetApp()->LoadIcon() と同じメ
ンバ関数」
『あ、そういえば〈 AfxGetApp()-> を付けると CWinApp のメンバ関数を呼
べる〉って言ってたもんね』
「最後はさっきと同じ、ハンドルを表示するもの」
『つまり……ＡＰＩのとＭＦＣのを同時に使ってるってこと？』
「そう、比較のためにね。とりあえず実行してみて」
『ビルドして実行。あ、同じ数字が出てきた！！』
「つまり同じ機能ってこと」
『へー、これって CWnd の時と似てる……って、そういうこと？』
「そういうこと。整理すると、CWnd も CWinApp も、中にハンドルを格納す
るためのメンバ変数を持ってます」
『m_hWnd と m_hInstance ね』
「両クラスとも、ＡＰＩと同じ名前のメンバ関数を持っていて、中でこのメ
ンバ変数を渡しています」
『代わりに渡してくれてるってことなのかな』
「一応ね。この２点が、ＭＦＣのクラスの基本的なとこ」
『ってことは他のクラスもハンドルを中に持ってるってこと？』
「そういうこと。ウィンドウハンドルを持ってる CWnd や CDialog は知
ってると思うけど、それ以外にもウィンドウに絵を描くための〈デバイスコ
ンテキスト〉のハンドルを持つ CDC とか、メニューのハンドルを持つ CMenu
とか」
『ってゆーか、そういうのにもハンドルがあるってことの方が驚きかも……』
「その辺はまた今度ね。で、ＭＦＣのクラスのほとんどがハンドルを持って
て、そのハンドルを渡すＡＰＩと同名のメンバ関数を持ってる」
『それがＭＦＣのパターンってことなのねー』
「ちなみにこういう〈元々あるライブラリを使いやすくするためのクラス〉
を〈ラッパークラス〉って言います」
『ダンスダーンス！　みたいな？』
「そのラップじゃなくてー、くれらっぷとかさらんらっぷとかのラップ」
『……ハンドルって生鮮食品？』
「うーん、そーじゃなくってねー、ＡＰＩやハンドルを包み込んでる、って
感じかな」
『あ、クラスの中にハンドルのメンバ変数入れて、ＡＰＩと同じメンバ関数
入れて、クラスの中に全部閉じこめちゃうって感じかな』
「ラッパーだと間違えちゃうからか、ＭＳＤＮじゃラップクラスって書いて
ある部分もあるみたいだね」
『どーせなら〈ナンクラス〉とか〈サンチュクラス〉にすればいーのに』
「なにそれ」
『なんでしょー、ふふふ』
「……さて！」
『あ』
「ここでここまでを振り返ってみます。まずハンドルってものについて」
『ウィンドウとかアイコンとかの出席番号！　だよね』
「そうそう。このハンドルをＡＰＩに渡すことで、そのウィンドウとかアイ
コンを操作できたわけだ」
『他のウィンドウのタイトル変えたりねー』
「つまり、この〈ハンドルとＡＰＩ〉だけでプログラムを組むと、ハンドル
を入れる変数を作って、その中にハンドルを入れて、ＡＰＩに渡す、って形
になるよね」
『んー、そうなるのかな』
「たとえばさ、たいがいのアプリってファイル名がタイトルに出るでしょ」
『うん』
「この〈タイトルを変える〉ってことをするためには、自分のアプリのウィ
ンドウのハンドルを持ってなきゃいけないってことでしょ」
『それを変数として持っておくってことね』
「そうそう。で、ＭＦＣはこの部分を自動的に処理しよう！　ということで、
普通の変数じゃなくて」
『メンバ変数！』
「を使ってハンドルを取っておこう、ってことにしたわけ」
『……なんかでもよく分かんないけど』
「じゃあね、イメージとしては……電話」
『でんわ？』
「電話で他の人に色々して欲しいときは、短縮でその人の番号を選んで、電
話かけて、色々言えばいいでしょ」
『あたりまえだよね』
「もしいろんな人に指示したいときは、その都度短縮リストから選ばなきゃ
いけないわけだ」
『そうなるよねー。……もしかしてそれがハンドル？』
「そ。電話番号がハンドル、短縮リストがハンドルを入れる変数、電話は
ＡＰＩってとこかな」
『うーん、アイコンとかいっぱいあったら、その数だけハンドルとそれを入
れる変数があって、それをＡＰＩに渡さなきゃいけない、ってこと？』
「そういうイメージ。これをクラスに置き換えて考えると、携帯がいっぱい
あるような感じ」
『携帯がいっぱい？』
「そ、１個の携帯にはひとつの電話番号しか入ってない、つまり人と電話機
が１対１になってるわけ」
『つまり短縮から選ぶ必要がないってことね。でも電話は選ばなきゃいけな
いでしょ？』
「もちろん。その点じゃ、それほどメリットないかな。メリットがあるのは、
カスタマイズ」
『どゆこと？』
「たとえば雑誌の編集者さんとは誌面の情報をやりとりしたいからカメラ付
きの携帯にするとか、友達とは長い時間話すから安いピッチにするとか」
『つまり携帯をそれぞれ向いたものに変えるってことよね』
「今はまだ無理だけど、偉い人用のは自動的に丁寧な言葉遣いにしてくれる
とか」
『あ、それいーかも。……でもそれって、プログラムになんか関係あんの？』
「継承」
『あ……』
「ＭＦＣに置き換えて考えてみようか。Calc プロジェクトの中には、いつ
も見るダイアログ用の CCalcDlg と、〈バージョン情報〉用の CAboutDlg
のふたつが入ってます」
『Ver 3.1（ No.026 ）でやったのだよね』
「このふたつのダイアログをＭＦＣを使わずに操作するときには、HWND 型
の変数をふたつ用意します」
『それをＡＰＩに渡して操作する、それが〈ひとつの電話機にいっぱいの短
縮ダイヤル〉ってことだよね』
「そう。ＭＦＣの場合には、ふたつのクラス型変数を用意して、その中にハ
ンドルを取っておきます」
『それが携帯を番号の数だけ用意するってことね』
「ん、ちょっと違うかな」
『え？』
「実は、ダイアログを表示するだけなら CDialog さえあればＯＫ。つまり
継承する必要はないんだよね」
『ってことは CCalcDlg と CAboutDlg ってホントはいらないってこと？』
「そういうことになるかな。この、提供されたＭＦＣのクラス型の変数を
使ってダイアログを作る、ってことが」
『これが〈携帯を番号の数だけ用意する〉よね』
「そういうこと。だけどこのふたつのダイアログ、違ったことをさせたいわ
けで」
『そのために〈番号ごとに違う携帯を用意する〉、それが継承ってことなの
ねー』
「電話番号っていう簡素なものを、個性的な携帯に置き換えることで意味の
あるものにする、つまり〈携帯で電話番号を包む〉」
『ラッパークラス、ってこと？』
「そう。ハンドルっていうものをクラスで包み込んで、使いやすくカスタマ
イズする、これがＭＦＣ流ってことかな」
『ＭＦＣ流、ねぇ』
「そう、これが大事なんだよ」
『なんで？』
「ＡＰＩはウィンドウズそのものの機能だから、変えようがないでしょ」
『そんなこと言ってたよね』
「だけどそんなに使い勝手がいいわけじゃない。そこでＭＦＣは、ＭＦＣを
作った人は〈ラッパークラスを作って便利にしよう！〉と考えた」
『だから CWnd とかができたってこと？』
「そう。ラッパークラスを作って継承できるようにして、この継承したクラ
スでプログラムを構成できるようにしよう、っていうのがＭＦＣ流の根幹」
『……つまり、前言ってた継承の話と同じでしょ？』
「それにハンドルを加えて考える、ってこと」
『あ、そっか』
「Ver 3.3（ No.028 ）までに言ったように、ＭＦＣ使ってプログラムを作
るってことは、ＭＦＣのクラスを継承した新しいクラスを作って、それをカ
スタマイズするってこと」
『そーすれば、ＭＦＣのクラスが持っている機能をそのまま使いつつ、拡張
できるのよねー』
「その〈ＭＦＣのクラスの機能〉こそが、ハンドルをメンバ変数として持っ
ていて、ＡＰＩを変わりに呼び出してくれる、つまり」
『ラッパークラス！』
「としての機能。つまりこういう仕組みは、ハンドルを使わないでプログラ
ムを組むためにあるわけだ」
『それがＭＦＣの親切心、ってわけね』
「ま、実際に親切かどうかはともかく、そういうこと。ここまでの話をよー
く復習して、あと CCalcDlg とかのプログラムをよーっくみて、その辺しっ
かりと理解しておいてください！」
『は〜い』

/*
    Preview Next Story!
*/
『でもさ、なんか同じ事ねちっこく言ってない？』
「重要だと思うからね。まあ時間掛かり過ぎとは思うけど」
『で、計算機ってさー、いつできんの？』
「つぎ」
『へ？』
「というわけで次回」
＜ Version 3.10 数字をやりとりしよう！ ＞
『につづく！！』
「もしかしたら年内に Ver 4 に行けるかも」
『またどーせ同じ事何度も何度も言って伸びるんだよきっと』
「う”、でもその方がいーでしょ？」
『う”、まぁそうかもしんないけど……』



/*            １９９９年１２月６日（月）の更新予定                */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・表紙を１２月バージョンに！
　やっとこさちゃんとした更新です！　表紙を１２月バージョンにしました。
しかーし出来は……。ちなみに解説はチョー普通な日記１１月２１日を読ん
でね。

表紙：
http://www2.justnet.ne.jp/~kabstudio/
チョー普通な日記
http://www2.justnet.ne.jp/~kabstudio/nikki2/


/*                          ご注意！！                            */

・このメールを返信しないでください。
・感想はこのページから送ってください。
http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/Impression/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www2.justnet.ne.jp/~kabstudio/Freeware/

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

    (C)KAB-studio 1999 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp
*/

/*                      See you next week!!                      */


