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

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

    送信日： 2000/03/13(Mon) No.048
    配信数： 3530（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


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

・STL & iostream 入門、登場。
　４月からスタートする新しいメールマガジン「 STL & iostream 入門」の
紹介ページを新設しました！
　このページでは、どんなメルマガになるのか、 STL と iostream の解説、
全体の予定、サンプル誌、 STL と iostream のとりあえずの使い方、副読
書の紹介、そして特製壁紙のダウンロードなど、なんかすごいことになって
ます（爆）。
　今の目玉はサンプル誌として読める「第１号」と、 STL と iostream の
概略が分かる特製壁紙！　購読登録する気がなくてもとりあえず来てちょう
だい！
　ちなみに購読登録開始は来週くらいを予定してます。こうご期待。

[STL & iostream 入門]
http://www.kab-studio.com/Programing/STLiostream/

・「コンストラクタ（中編）」を手直し。
　Codianの「コンストラクタ（中編）」をちょっとだけ手直ししました。
　これはかぶゆ〜への投稿を元に書き直したものです。皆さんも気軽に送っ
てねん。

[Codian]
http://www.kab-studio.com/Programing/Codian/
[コンストラクタ（中編）]
http://www.kab-studio.com/cgi-bin/cgiperl7.pl?Programing/Codian/Cpp/06.html
[鏑矢の憂鬱]
http://www.kab-studio.com/Programing/KabuU/


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

２０００年３月５日（日）：
　日曜ってあんま色々できないの。なんで？

２０００年３月６日（月）：
　かぶスタ引越。そして日記の過去分復活。１９９６年９月からよーもこれ
だけ書いたもんだ。

２０００年３月７日（火）：
　このメールマガジンの購読登録数、最近乱高下です。謎だなー。なんか読
まれてるって気もあんませーへんし。むぅ。

２０００年３月８日（水）：
　所沢の古本まつりへ。 Shade の実用書を格安購入。おいしいラーメン屋、
そして悪魔の花粉攻撃。杉の木ぜんぶ切り倒したら英雄ですか？

２０００年３月９日（木）：
　 STL & iostream 入門特製壁紙完成（爆）。あとホームページに広告載っ
けたいなーとか。

２０００年３月１０日（金）：
　その壁紙と広告にツッコミ。単純に「広告載せるよ」とかじゃなく、皆さ
んと色々話し合って決めてきたいなーとか。うむ。

２０００年３月１１日（土）：
　引き続き広告関係の話。「かぶスタは商業目的？」の問に答えます。実は
方向性は変わってないのねん。


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

２０００年３月５日（日）：
 STL & iostream 入門書き
目標は今月中 #15 まで完成
gcc for Win32 をバージョンアップ
しかしあまり効果なし
持っている開発環境はこれと VC だけ
BCB5 を購入予定
Linux 系のほうがいいかも？

２０００年３月６日（月）：
 STL & iostream 入門書き
アルゴリズム編はきつかった
関数オブジェクト編は楽しい
C++ 解説がちょっと難しい
お便り
STL の allocator 
コンテナで使うインスタンス作成用クラス
デフォルトは std::allocator 
自作方法は std::allocator をコピー＆ペーストして独自インプリメント
アロケーターには雛形クラスがないため
真似して作るのが一番
シンプルだから難しくはないはず

２０００年３月７日（火）：
 STL & iostream 入門書き
#10 を超えた
C++ で typedef メンバや enum を使ったフラグの解説
std::fstream にライブラリ間の差が大きい
入門書としては最強？

２０００年３月８日（水）：
辞書書き
C++ では void な関数が注目を浴びている
戻り値によってコードを書き換えなきゃいけない
テンプレートで問題になる
ダミークラスや必ず bool を返すのがいいかも
C 時代の古い形式が残っているから？

２０００年３月９日（木）：
 STL & iostream 入門壁紙を作成
本文の方は iostream が #15 まで完成
cygwish で入力できないことが判明
ファイル経由だと標準入出力が機能する
std::strstream と指し示す配列
「どの環境でも同じように使える」ことを売りにしない方がいいかも
std::strstream, std::fstream, std::cout, std::cin 
最後に全体の構造とカスタマイズという順番

２０００年３月１０日（金）：
サンプルコード
VC6 コンパイラが落ちる
お便り
Refinement について
STL ガイドの一文
継承に似て違うもの、という意味？
お便り
「コンストラクタ（中編）」の記述は間違い？
分かりにくい書き方でした
月曜に更新予定
某所ってどこ？

２０００年３月１１日（土）：
イテレーターに手こずる
HP と SGI で違うため
std::iterator が使えない
最新版へと更新して解決
std::reverse_iterator のテンプレート引数が違う
イテレータータグの仕組みが違う
UNIX サーバーの引っ越しの依頼
私には無理
お便り
昨日の「コンパイラが落ちる」について
VC か gcc か


/*                       今週の追加単語                           */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
ウインドウスタイル ウインドウクラス void バージョン バージョン情報
リバースプロキシー #import リバースエンジニアリング 
エントリーポイント main() WinMain() 

・今週のごめんなさい
ファイルマッピング メモリマップドファイル 
任意のDLLのバージョンを得る方法 AfxEnableControlContainer rpc 
スレッド LISTVIEW リバーシ import リバーシエンジニアリング 

　一時期に比べると結構減りましたねぇ。引っ越しの関係で旧ページからは
投稿できなくなったからかな？

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[かぶスタＣＭ]~~~~~~~~~

　 STL & iostream 入門特製壁紙！
http://hp.vector.co.jp/authors/VA010833/Gallery/STLiostream800.jpg

_____________________________________________[かぶスタＣＭでした]___

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

　Version 3.23
オーバーライド

「前回までに、ダイアログを表示したときに【Ans】の中に前の結果を入れ
ておく、って機能を CCalcDlg に移す、っていうことをしました」
『ってことは、残るは【OK】ボタンを押したとき、だね』
「そゆこと。さて、ボタンを押したとき、って言ったらどんな感じだと思
う？」
『そりゃやっぱり、【＝】ボタンが押したときに CCalcDlg::OnBEqual() が
呼ばれる、みたいな感じなんじゃないかな』
「その通り。で、そのときはどうしたんだっけ」
『えーっと、かなり昔だよね』
「そう、かなり昔…… Ver 2.0 （ No.011 ）だね」
『でもまだ１年経ってないんだ』
「これ入れてあと３回で１周年。ま、それは置いといて、もう一度復習を兼
ねて〈イベントハンドラ〉の作り方を見てみましょう」
『あ、こういうのもイベントハンドラって言うんだ』
「さて、まずダイアログエディタで Calc ダイアログ表示して」
『 ResourceView で IDD_CALC_DIALOG をダブルクリックと』
「そしたら【OK】ボタンの右クリックメニューから」
『【イベント】でしょ！』
「そう。それを選ぶと」
　【クラス CCalcDlg 用の Windows メッセージおよびイベント ハンドラの
新規作成】というダイアログが表示される。
「左側が BN_CLICKED に、右下が IDOK になってることを確認して」
『あ、そういえば BN_CLICKED ってなに？』
「うーん、まだ早いような……」
『とりあえずおせーて』
「そうだね、たとえばボタンが押されたときとかのイベントは、ウィンドウ
ズが管理してます」
『ってことは API とかってこと？』
「うん、そういうレベルでサポートされてるってこと。で、実際にボタンを
押すと、ウィンドウズからアプリケーションに BN_CLICKED っていう〈メッ
セージ〉が送られてきます」
『めっせーじ？』
「ま、〈ボタンを押したぞ！〉って声、みたいなもんだね。このほかにも、
イベントの数だけメッセージがあって、 MFC を使わないときにはこのメッ
セージをかなり憶えておかないとちょっときつかったり……」
『へー、そーゆーのも MFC 使うと楽できるんだ』
「でもここで BN_CLICKED 知らないとまずかったりとか、 MFC があれば全
然ＯＫってわけでもないんだけどね。ま、ようするにこれから憶えることが
たくさんあるってことで」
『む〜』
「で、右下の IDOK はボタンの ID ね」
『それはわかる。で、【追加と編集】ボタンを押せばいいんでしょ？』
「そゆこと」
　ボタンを押すと【メンバ関数の追加】ダイアログが表示される。
『メンバ関数名、 OnOK() 。このまんまで？』
「このまんまで」
『んじゃまんま。……あれ、 OnOK() ってどっかで……』
　OK ボタンを押すと CalcDlg.cpp が表示される。

void CCalcDlg::OnOK() 
{
    // TODO: この位置にその他の検証用のコードを追加してください
    
    CDialog::OnOK();
}

『あ、こんなところにも TODO が』
「さて、【OK】ボタンを押したらこの関数が呼ばれるってことを確認したい
とき、どうするんだっけ？」
『えっと、 TRACE() 置くとか、ブレークポイント設置するとか？』
「そうそう。今回はブレークポイントの方を使ってみて」
『はーい。んじゃ TODO を』
「ちょいまち、ブレークポイントは〈プログラムのある行〉じゃないと。だ
からコメントの上じゃダメ」
『へーそうなんだ。じゃー CDialog::OnOK() をクリックして、手のひらボ
タンを押して』
　行の左に丸が表れる。
『んじゃビルドして実行、【OK】ボタンをクリック！』
　丸の上に右向き矢印が表れ、アプリケーションが停止する。
『止まったから、やっぱ【OK】ボタン押すとこれ呼ばれるんだ』
「じゃ続いて、 CDialog::OnOK() の中に入ってみて」
『あら予想外の展開。んじゃ中カッコに入るボタンっと』
　Dlgcore.cpp ファイルが表示される。
『あ、 CDialog のメンバ関数だから、 MFC のプログラムのファイルが表示
されたんだね。……あれ？』
　CDialog::OnOK() が表示されている。
『これって、前に一度見たことない？』
「あるよ、 Ver 3.17 （ No.042 ）で。あのときはダイアログを閉じるんで」
『そうそう、ダイアログを閉じるのは EndDialog() っていうので、その引
数が DoModal() の戻り値になる、とかやったよね、うんうん』
「さて、考えてみましょう」
『はい？』
「【OK】ボタンを押したときに呼ばれたのは？」
『 CCalcDlg::OnOK() だよ』
「じゃあ CDialog::OnOK() は？」
『……そういえば、 CDialog::OnOK(); っていう行が  CCalcDlg::OnOK() 
の中にあって、そこに入ったら……』
「じゃ、実験。この行をコメントアウトしてみて」
『ってことは』

void CCalcDlg::OnOK() 
{
//    CDialog::OnOK();
}

『って感じ？』
「そんな感じ」
『じゃビルドして実行……あーっ、【OK】ボタン押してもダイアログ閉じな
いー！！』
「そういうことになります。つまり……どしたの？」
『どうやってダイアログ閉じればいいのぉ？』
「【キャンセル】ボタンは効くでしょ」
『あ、そっか』
「で、どういうことだと思う？」
『つまり、 CDialog::OnOK(); って行では、 CDialog クラスの OnOK() メ
ンバ関数を呼んでるってことなんだ』
「それはつまり、 CDialog と CCalcDlg の両方に OnOK() メンバ関数があ
るってことだよね」
『あそうか！　で、 CDialog::OnOK() ひとつだったときにはこれが呼ばれ
て、 CCalcDlg::OnOK() ができたらこの新しい方が呼ばれるようになった』
「重要なのは、かたっぽしか呼ばれないってこと」
『つまりわざわざ CDialog::OnOK(); ってしないと呼ばれないんだ』
「こういうシステムを〈オーバーライド〉っていいます」
『おーばーらいど？』
「そう。まず、 MFC の方に【OK】ボタンを押したとき用のイベントハンド
ラ CDialog::OnOK() を用意しておきます」
『うんうん』
「このメンバ関数にはダイアログを閉じる機能を入れておきます」
『そうすれば、ダイアログに IDOK のボタンを置くと、そのボタンを押す
だけでこのメンバ関数が呼ばれてダイアログが閉じる、って仕組みなんだ
よね』
「そうそう。これって簡単でしょ」
『うん、簡単』
「でも、今回みたいに〈【OK】ボタンを押したときに独自の処理をしたい〉
っていう場合があるでしょ」
『そういうときに、 CCalcDlg::OnOK() を作る！』
「継承したクラスで、同じ名前のメンバ関数を作ると、新しく作った方が優
先的に呼ばれる仕組みになっているわけ」
『それがオーバーライド？』
「そういうこと。あと〈 OnOK() を CCalcDlg クラスでオーバーライドする〉
みたいに使う時もあるかな」
『へー。あ、もしかしてこの辺って、前に話してた〈カスタマイズクラス〉
とかと関係ある？』
「もちろん。 MFC にある機能を使いながら、そのアプリケーション専用の
機能を組み込む。そのために」
『 MFC のクラスから継承した新しいクラスを作って、こんなふうにオー
バーライドすればいいんだ』
「ま、これは思いっきり簡単な例だけどね。あ、今のコメントアウト取り除
いておいてね」
『はーい。で、【OK】ボタンのをここに書き込むんでしょ？』
「そうそう。これまでの知識があればできるはずだけど……」
『やってみる！！　えっと、まず CCalcApp::InitInstance() の中で……』

    if (nResponse == IDOK)
    {
        WriteProfileInt( cDialogStr, cAnsStr, dlg.m_iAns );
    }

『この WriteProfileInt() を切って貼っつけちゃえばいいんだから……』

void CCalcDlg::OnOK() 
{
    WriteProfileInt( cDialogStr, cAnsStr, dlg.m_iAns );
    
    CDialog::OnOK();
}

『で……どうしよ』
「ひとつずつひとつずつ」
『はぁい。じゃ、最後の m_iAns から。ここは CCalcDlg 、ううん dlg の
中なんだから、 dlg. はいらないから……』

    WriteProfileInt( cDialogStr, cAnsStr, m_iAns );

『 cDialogStr と cAnsStr は CCalcApp::InitInstance() の中で作ってた
んだよね。あれを……カットしちゃっていい？』
「うん、大丈夫。もう CCalcApp::InitInstance() の中じゃ使ってないから
ね」
『じゃ……』

void CCalcDlg::OnOK() 
{
    CString cDialogStr;
    cDialogStr.LoadString( IDS_REG_DIALOG );
    CString cAnsStr;
    cAnsStr.LoadString( IDS_REG_ANS );

    WriteProfileInt( cDialogStr, cAnsStr, m_iAns );
    
    CDialog::OnOK();
}

『最後に、前回作った GetTheApp() を使って……』
「あ、あと UpdateData( TRUE ) も呼んでおいて。そうしないと m_iAns の
中に値が入ってないから」
『じゃっ！』

void CCalcDlg::OnOK() 
{
    UpdateData( TRUE );
    CString cDialogStr;
    cDialogStr.LoadString( IDS_REG_DIALOG );
    CString cAnsStr;
    cAnsStr.LoadString( IDS_REG_ANS );

    GetTheApp().WriteProfileInt( cDialogStr, cAnsStr, m_iAns );
    
    CDialog::OnOK();
}

『どう？　どうよ、これで！』
「ＯＫ！」
『じゃ、ビルドして実行、計算して、【OK】ボタン押して閉じて、もう一度
実行……やたっ、同じのが【Ans】に入ってる！』
「うん、大丈夫そうだね」
『でもなんで今度は UpdateData() 必要なの？　CCalcDlg::OnInitDialog()
のときもそうだったよね』
「呼ばないで済んだのは CDialog::OnOK() の中で呼んでくれてたから。も
う一度 CDialog::OnOK() の中見てみ？」
『あ、ホントだ、呼んでる』
「同じく CCalcDlg::OnInitDialog() の方じゃ、 CDialog::OnInitDialog() 
の方で呼んでくれてたってこと」
『なるほど。ってことはさ、』

void CCalcDlg::OnOK() 
{
    CDialog::OnOK();

    CString cDialogStr;
    cDialogStr.LoadString( IDS_REG_DIALOG );
    CString cAnsStr;
    cAnsStr.LoadString( IDS_REG_ANS );

    GetTheApp().WriteProfileInt( cDialogStr, cAnsStr, m_iAns );    
}

『なんてのはどう？』
「それもＯＫ！」

/*
    Preview Next Story!
*/

『そういえば、あと２回？』
「あと２回で１周年。Ver 3 もそこで終了」
『って、 Ver 3 って半年近くやってるんだね』
「それだけ、重要な話が詰まってたってことだね」
『無駄なとこも多かったような……』
「というわけで次回」
＜ Version 3.24 デバッグビルドとリリースビルド ＞
『につづく！！』
「 Ver 4 からは細かい話」
『って、あと２回もしっかり頼むよー』
「はいはい」


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

アプリのツボ
#11 画像処理 その１

　画像処理って言ってもかなり幅広いから、まずは前回のプラグイン関連か
ら。
　ウィンドウに絵を表示するときには、当然デバイスコンテキストを経由し
ます。デバイスコンテキストに絵を表示するときには、絵はビットマップで
ないとダメ。これは bmp ファイルとは切り離して考えた方がいいかな。
「ビットマップ」っていう名前の、データ構造がある、って考えた方がいい
かも。
　ってことはつまり、どんなフォーマットの絵でも、ビットマップにさえ変
換できれば表示できるってことね。この、特定のフォーマットをビットマッ
プに変換するって部分をプラグイン化すれば、アプリの方はどんなフォーマ
ットも扱えるってことになるかな。
　で、一番大変なのが、そのフォーマットの解析。これはそのフォーマット
のドキュメントを読んで、バイナリーデータにどんな意味があるのか調べる
必要があります。ま、これもたいがいはライブラリが転がってるんじゃない
かなと思うけど。

　プラグインには他に、フィルタリング用のもあります。特定の範囲のビッ
トマップに特殊な処理をする、それがフィルタリング。 KPT なんかがそう
ね。
　本格的なフォトレタッチアプリケーションを作るときに一番大変なのが、
このフィルタを揃えること。フィルタをプラグイン化して、サードパー
ティーのものを使えるようにすると、その使用料で製品の値段がかなり上が
っちゃうし、かといってすべてのフィルタを自前で作るのは、情報を集める
のも実際に作るのも、作れる人を集めるのも大変。
　ま、ようするにフォトレタッチアプリを作るのはそうそうできることじゃ
ないってことかもね。
　で、ちゃんとした画像処理の話に戻ると、だいたいペイント系、ベジエ曲
線系、 3D 系に分かれます。これは来週。じゃね。


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

・STL & iostream 入門購読登録開始したい。
　４月からスタートする新しいメールマガジン「 STL & iostream 入門」の
購読登録を開始できたらいいなー。これはまぐまぐでの配信が正式決定しな
いとあかんので（たぶん）。
　別に早い者勝ちでもないし、第１号はサンプルとしてもう見られるし、そ
んなに急ぐ必要もないと思うんでもちっと待ってね。あーでも３月２９日に
予定してるテスト配信のはある意味レア物かも……。

[STL & iostream 入門]
http://www.kab-studio.com/Programing/STLiostream/


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www.kab-studio.com/Freeware/

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

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


/*                      See you next week!!                      */


