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

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

    送信日： 1999/06/21(Mon) No.012
    配信数： 2200（ Mag2 + Pubzine ）
    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/

/*            １９９９年６月２１日（月）の更新                */

・ＣＧのページがスタート！！
　なんとなんと、とうとうＫＡＢ−ｓｔｕｄｉｏにもＣＧのページが！
　まずはCG Gallery。今年の２月から６月までの表紙イラストを掲載してい
ます。かぶヘッダーの読者でここ最近のしか見てない人は必見！！　……か
も。
　もうひとつはMaking of "9907.jpg"。７月５日に掲載する７月表紙の制作
過程を紹介します。ＣＧの作成に興味がある人は必見！！　これは７月５日
まで毎週少しずつ更新していきます。


・金菜さんの憂鬱を一部アーカイブ化。
　金菜さんの憂鬱の今年２月から５月までのページを、これまでの圧縮ファ
イルに追加します。理由はもちろんダイエットなんですが、それ以外にもロー
カルなら grep などを掛けやすいなどの利点があります。ダウンロードはフ
リーウェアインフォメーションルームにて。


・風雅、舞いの設定資料集を削除。
　現在容量ギリギリなのでスペースを作るため、風雅、舞いの設定資料集を
一時削除します。もしかしたら風雅、舞い自体削除するかも……。夏休み頃
にはＴＮＯＶＥＬ化、そしてリスタートをお約束……したい……。



/*                チョー普通な日記                */

１９９９年６月１３日（日）：
　４連休で逆に疲れちゃうという話らしい。そして秘密の特訓が今始まる！！
カレがソレを身に着けるのは果たしていつの日か！！

１９９９年６月１４日（月）：
　お休みなのに疲れてる。それともお休みだから疲れてる？　そしてカレを
襲う無音の侵略者とは！？

１９９９年６月１５日（火）：
　ゲームしたりビデオテープ買ったりテレビ見たり電話継ながらなかったり
といつも通りの日常を送ったそんな感じ。

１９９９年６月１６日（水）：
　最近スト３の話ばっかりでなんかつまんないかもしんないが今日もそんな
感じなんで我慢してね。

１９９９年６月１７日（木）：
　本格的日本懐石「無門庵」へと行きその美味端麗なる和食の数々を思う存
分堪能したその気持ちを余すことなく書きつづった素晴らしい１日。

１９９９年６月１８日（金）：
　毎週金曜はやっぱしアニメの話。

１９９９年６月１９日（土）：
　表紙を描いてるとちゅーって感じ。そして……マルティネスぅ！！



/*                    金菜さんの憂鬱                        */

１９９９年６月１３日（日）：
お便り
オブジェクト指向プログラミング
設計と実装
リンク集
机上とコード上の温度差
関係図と実際のクラス構成の差
お便り
CRichEditCtrl には AfxInitRichEdit() が必要
お便り
サブクラス化のタイミング
クラスウィザードとコントロールＩＤ
初期化は WM_SIZE で
この辺は臨機応変で、それがＭＦＣとの付き合い方

１９９９年６月１４日（月）：
お便り
モーダルダイアログ
「 CMainFrame にダイアログを貼り付けたい」
AppWizard の６ページ目で CFormView に
ビュークラスの取得方法は CMainFrame::GetActiveView() 
「 CMainFrame の中からダイアログを表示させて、その結果を取得したい」
挿入】−【リソース】でダイアログを作成
サンプルコード
本とかも見てね。
モーダルとモードレス

１９９９年６月１５日（火）：
お休み

１９９９年６月１６日（水）：
関数の戻り値としてポインタを返す
FormatMessage() 
スマートポインタ
auto_ptr や _com_ptr_t
関数から返されたポインタをスマートポインタで処理するには無理がある
「解放する方法」を選択できないから
ＫＴＬの CSmartPtr はできるが問題アリ
ポインタを返すのは自然
つづく

１９９９年６月１７日（木）：
スマートポインタを「戻り値」として返すのは面倒
「テンポラリ変数」の存在
サンプルコード
テンポラリ変数のデストラクタでポインタが解放されてしまう
「搬送クラス」を作る
return で返すポインタを格納するクラス
return は引数ふたつ以上のコンストラクタを呼び出せない
つづく

１９９９年６月１８日（金）：
お便り
ＤＬＬの関数の呼び出し
サンプルコード
関数ポインタ
呼び出す関数の戻り値や引数によって関数ポインタ型を変える必要がある
あとエラーチェック
構造体の置き方
サンプルコード
ボタンとイベント

１９９９年６月１９日（土）：
アーカイブについてのお知らせ
スマートポインタクラスは解放方法を変えられない
CSmartPtr では「デリーター」で変えられる
クラステンプレートの引数として明示しなければならない
仮想関数
動的解放のための変数を動的に作成する必要がある
関数ポインタ
普通の解放用関数は void * 
delete ちゃんとその型じゃないといけない
つづく


/*                    #pragma twice                        */

　Version 2.1
イベントと関数

『この前みたいなふざけたことしないでよねー』
「別にふざけてないよん。あれだってプログラムのひとつだもの」
『だって何の意味もないじゃない』
「確かにね、ふふん」
『何よその笑い』
「んじゃ、前回の続きを見ていこうか」

void CCalcDlg::OnBEqual() 
{
    // TODO: この位置に（略）
    MessageBox( " 1 + 2 = 3 " );
}

『これがこの前見たのだよね。相変わらずわけ分かんないなー』
「これはね、大きくこういうふうに見るんだよ」

頭
{
    胴体
}

『はぁ？』
「まず【void CCalcDlg::OnBEqual()】が、＜頭＞。そのあとの中カッコ
（ { ）から中カッコ閉じ（ } ）までが、＜胴体＞」
『それが？』
「これがプログラムの構成単位。つまり、人間で言えば細胞ってところかな」
『ってことは、これがいっぱい集まって＜プログラム＞が作られてるってこ
と？』
「そういうこと。これと同じファイルの中に、こんなのもあるでしょ」

// システムは、ユーザーが最小化ウィンドウをドラッグしている間、
// カーソルを表示するためにここを呼び出します。
HCURSOR CCalcDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

『うん、ひとつ上にあるね』
「もっと上に行くと、もっとあるよ」
『うん、色々あるね。これが集まって＜プログラム＞になってるんだ』
「そう。でね、これひとつひとつ、つまりさっきの＜頭＞と＜胴体＞の組み
合わせを＜関数＞って言います」
『関数？』
「そ、＜かんすう＞。で、さっきのふたつを並べてみるね」

HCURSOR CCalcDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CCalcDlg::OnBEqual() 
{
    // TODO: （略）
    MessageBox( " 1 + 2 = 3 " );
}

「まず、プログラムの＜本体＞は、＜胴体＞のところ、つまり中カッコの中
にしか書けません」
『本体って？』
「本で言えば、目次や索引、表紙じゃない部分。＜頭＞は目次に当たるかな」
『つまりプログラムの中身よね。上のなら、＜return ...＞とか
＜MessageBox( ...＞とかがその＜本文＞ってことになるわけね』
「だから、それ以外のところにはプログラムの本体は書けない、つまり上の
関数の終わり（ } ）から、次の関数の頭（ void ... ）までの間にも、プロ
グラムは書けません」
『そりゃそうよね、細胞と細胞の間にＤＮＡとかあったら困っちゃうものね』
「そりゃ困るな。で、今度は＜胴体＞、つまり中カッコの中の話」
『プログラムの中身よね』
「そう。この中身は＜上から下＞へと実行されていくから。雰囲気としては、
フランス料理のフルコース、各品が上から順にテーブルに来るって感じかな」
『これは１行だけだけど、いっぱい行があったらそうなるんだ』
「そう。たとえば」

void CCalcDlg::OnBEqual() 
{
    MessageBox( "1" );
    MessageBox( "2" );
    MessageBox( "3" );
}

「ってしたら、小さなダイアログボックスが＜１＞＜２＞＜３＞の順に出て
くるよ」
『ふーん……って、じゃあ "MessageBox" っていうのを書くと、ダイアログ
ボックスが出てきてくれるんだ』
「そうそう。冴えてるじゃん」
『でしょでしょ？』
「じゃあここで問題。この＜胴体＞の前は、どこ？」
『へ？』
「胴体はさ、中カッコから始まるって言ったでしょ。その前はないのかな」
『う〜ん……さっきの』

HCURSOR CCalcDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

『のあとに、この胴体に入って来るんじゃないの？』
「だったら試してみようか」

HCURSOR CCalcDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
    MessageBox( "1" );
}

void CCalcDlg::OnBEqual() 
{
}

「火美ちゃんの言ったことがホントなら、これでもダイアログボックスが表
示されるはずだよね」
『……』
　【ビルド】を実行し、【実行】する。最初のダイアログが開いたあと、
【＝】ボタンを押すが、何も起きない。
『ずるいよずるいよっ！！　おじいちゃんが言ってたもん、知らないことを
させられていきなりできるヤツは天才だけだって。知らないことさせるなん
てずるい！』
「でもさ、どうなんだろう、って思ったこと試すのは悪いことじゃないよ？
こういうのを自分で試して、失敗すれば、しっかり憶えるでしょ」
『はいはい、プログラミングは自分で作ってなんぼ、でしょ？』
「そゆこと。んじゃタネあかし。関数はね、＜呼ばれる＞ものなんだよ」
『呼ばれるって、病院の待合室みたいな感じ？』
「うーん、そういう感じかなー。ダイアログエディタ開いてみて」
『はーい』
　ＶＣのウィンドウがダイアログエディタに変わる。
「＝ボタンの右クリックメニューの中に【イベント】ってあるでしょ」
『うん、この前これ選んだんだよね』
「イベントっていうのは＜出来事＞っていう意味。＜何かが起きた
ぞっ！！＞って感じかな」
　そのまま【イベント】を選択する。前回表示した【クラス CCalcDlg 用の
Windows メッセージおよびイベントハンドラの新規作成】というダイアロ
グが表示される
「このダイアログで、どういうイベントが起きたときに、どういうことをさ
せるのか、っていうことを決められるんだよ」
『起きるイベントって、たとえばボタンを押したり、とか？』
「そう！　たとえば、真ん中の上に "BN_CLICKED" ってあるでしょ」
『あ、クリック！！　これがイベントってこと？』
「そういうこと。ボタンの上でクリックすると、これが送られてくるわけ」
『送られて来るって、どこから？』
「ウィンドウズから。ダイアログとかの＜リソース＞がウィンドウズからの
借り物ってことは言ったよね」
『だから、ボタンをダブルクリックしたらウィンドウズが＜ダブルクリック
したよ＞って言ってくれるってわけ？　ウィンドウズってそんなに面倒見い
いんだー』
「で、 "BN_CLICKED" をダブルクリックすると……」
　テキストエディタが開き、おなじみの関数が表示される。

void CCalcDlg::OnBEqual() 
{
}

『これさっきの関数じゃない！』
「そういうこと。つまり、ボタンをクリックするとこの関数が呼ばれる仕組
みになってるわけ」
『へ〜。で、呼ばれたら、＜胴体＞の中を上から下に行って……そしたら？』
「＜胴体＞の最後まで行ったら、関数はそこで終わり。呼び出した関数に戻
るんだよ」
『関数から関数を呼び出せるの？』
「そう。たとえば」

void CCalcDlg::OnBEqual() 
{
    MessageBox( "1" );
}

「この "MessageBox" も、関数なんだよ」
『これも関数？　ってことは、"MessageBox" っていうのを呼び出して、そ
の中の＜胴体＞をくぐってきて、それが終わったらまた戻ってくる、ってこ
と？』
「そういうこと。なんとなく分かってきた？」
『関数が関数を読んで、その関数がまた関数を読んで……終わったら呼んだ
関数に戻って、それが終わったらまた呼んだ関数に戻って……』
「じゃ、見てみようか」
『みみみみみみるって？』
「 "MessageBox" の行を１回クリックしてみて」
『はい、クリック、と』
「そしたらツールバーの＜手のひらマーク＞クリックして」
『手のひら手のひら……っていっぱいあるけど』
「普通の手のひら。ｘとか斜線とか付いてないの。もしなかったらメニュー
の【ツール】−【カスタマイズ】でツールバーに貼り付けてね」
　ツールバーから＜手のひら＞を選び、クリックする。
『あ、この行の左に●付いたね』
「そしたらメニューの【ビルド】−【デバッグの開始】−【実行】を選んで」
『うん選んだよ……って、＜ビルドしますか？＞ってダイアログ出ちゃった
けど』
「あ、さっき変えてからビルドしてなかったからね。【はい】押して」
　ハードディスクが回り始める。
『ビルドしてる間に聞きたいんだけどさ、今の【実行】っていうのと同じア
イコンがツールバーにもあるけど？』
「紙と文書の右に下矢印、みたいなのでしょ。うん、こっちでもいいよ」
『もうひとつ、この前した【ビルド】−【実行】とどう違うの？』
「これからする事ができるってこと」
『？』
　ビルドが終了し、自動的にアプリが実行されダイアログが表示される。
「じゃ、【＝】ボタン押してみて」
『はーい……あれ？』
　ＶＣが表示され、先ほどの●の中に矢印が書かれている。
『ど、どうしちゃったの？』
「プログラムが止まったの」
『止まったって、なんか間違えちゃった？』
「間違えてないよ。●を付けた行を実行しようとすると、一度止まるように
なってるんだよ」
『あ、●を付けたから止まったんだ。良かったー。これをするために、違う
【実行】にしたってこと？』
「そういうこと。じゃ、探検してみようか」
『探検？』
「ツールバーの＜中カッコに入る＞みたいなボタンをクリックしてみて」
『なんか起こるのかな……』
　そのボタンを押す。テキストエディタが別の見たことのないファイルを表
示し、その中ほどに先ほどの矢印が表示されている。

int CWnd::MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType)
{
    if (lpszCaption == NULL)
        lpszCaption = AfxGetAppName();
    int nResult = ::MessageBox(GetSafeHwnd(), lpszText, lpszCaption, nType);
    return nResult;
}

『これって関数だよね……あ！　"MessageBox" って書いてある！　それに
矢印が＜胴体＞の最初に来てるし、この関数を呼んだから、この胴体に移っ
たんだよね？』
「そういうこと。これで＜関数を呼ぶ＞ってことがちょっとわかった？」
『でも "CWnd::" ってなに？』
「これはまた今度ね。じゃ、今度は＜中カッコの上を越えていく＞っていう
ボタンを押して」
『あれ、さっきのと違うんだ』
　押すと、ひとつ下へと矢印が進む。
「さっきのボタンは＜関数の中へとどんどん深く入っていく＞の、今押した
のは＜関数の中には入らないで、行を進めていく＞の」
『そうよねー、どんどん深く入ってっちゃったら、なーんか帰ってこれなさ
そう』
「そうだね、最初は少しずつがいいかな。もう一度ボタン押してみて」
『はーい』
「もういちど」
『はぁい』
「さらに」
『はー……あれ？　ボタン、単色表示になっちゃったよ』
「じゃ、アプリの方見てみようか」
　タスクバーから "Calc" を選ぶ。すると、小さなダイアログが表示されて
いた。中の文は "1" 。
『あれ？　いつのまに？』
「いつのまに、かな？」
『え？　……えっとねー、今矢印が＜胴体＞の３行目にあるから、３行目か
ら４行目に行こうとしたときになったってことよね。つまりその間に、この
ちいちゃいダイアログが表示された、ってこと？』
「そういうこと！　こういうふうに見ていくと、どこで何してるのか、おお
ざっぱにだけどわかるでしょ」
『うん、なんていうか、足がかりつかめた感じ』
「じゃ、小さなダイアログ閉じて」
『はーい』
　【OK】を押すと、ＶＣに戻り、矢印が４行目に来ている。
『そのままさっきの＜上を越えてる＞ボタンを押せばいいんだよね』
「そうそう」
　そのボタンを２度ほど押すと、先ほどの【void CCalcDlg::
OnBEqual() 】へと戻ってきて、閉じカッコの所に矢印が来ている。
『あ、ホントに戻ってきた！　こういうふうに、関数を呼んで、帰って来る
んだ』
「あとは、さっきの【実行】を選べば、すーっと流れていくようになるから」
　その＜文章の書かれた紙の脇に下矢印＞のボタンを押せば、 "Calc" ダイ
アログが再び表示される。
「今日はこんなとこかな。どう？」
『とにかく、関数がいっぱい集まってプログラムができてること、関数を呼
び合ってプログラムが実行されてるってこと、よね』
「そういうこと。それがわかれば全然ＯＫ！」
『なんとなーく、分かってきたかも』



/*
    Preview Next Story!
*/
『今回はこの前分からなかったことも少し分かったし、良かったかも』
「分からないことができて、それを解消して、この繰り返しかな」
『着実に一歩一歩、って感じかな』
「じゃ、来週はじみーなお勉強しようか」
『げげー』
「というわけで次回」
＜ Version 2.2 変数を作ろう！ ＞
『につづく！！』
「変数なんて、なんか初心に戻る感じだなー」
『水希ちゃんがその変数っていうの勉強したの、いつぐらいのこと？』
「小学生の時」
『エリートっすね……』



/*            １９９９年６月２８日（月）の更新予定                */

・Making of "9907.jpg"を更新。
　来月表紙の作成過程をつづるMaking of "9907.jpg"。当然来週も更新でき
ると思います。おそらく背景とキャラの着色くらいはできてることでしょう。
こうご期待！



/*                        ご注意！！                        */
/*

　このメールマガジンをそのまま「返信」すると、作者のメールアドレス
（kab-studio@multimedia.design.co.jp）へと転送される仕組みになってい
ます。「まぐまぐ」もしくは「Ｐｕｂｚｉｎｅ」の管理者へメールを送りた
い場合には、直接そちらへメールを送ってください。

*/
/*

　このメールマガジンの購読登録を解除する場合には

http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/

　が便利です。また、購読解除についての詳しい情報は、
登録時に送られてきた「まぐまぐ」もしくは「Ｐｕｂｚｉｎｅ」からの
メールをお読みください。

*/
/*

　本誌のバックナンバーはＫＡＢ−ｓｔｕｄｉｏにはありません。
　まぐまぐの

http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198

　にありますのでそちらをどうぞ。

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

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


/*                    See you next week!!                    */


