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

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

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


/*                      配信の遅れについて                        */

　ここ数回「まぐまぐ」経由の配信が半日〜１日ほど遅れるという問題が発
生しました。もしかしたらこれも遅れて届いているかもしれません。

　この問題は、まぐまぐの「広告添付システム」に起因するものです。
　まぐまぐの広告添付システムは、まずまぐまぐから「広告添付用メール
サーバー」へと配信し、そこで広告を添付し、そのあと皆さんの所へ転送さ
れるという仕組みになっています。
　現在、この「広告添付用メールサーバー」がかなり混んでいるらしく、１
月３１日の配信では丸１日遅れてしまい、まぐまぐを通して購読登録を行な
われた読者の皆さんにご迷惑をおかけしましたことをお詫び申し上げます。

　で、実はこれからも広告の添付は続けようと思っています（爆）。
　広告添付は、僕にとっては実験のひとつです。インターネット上での執筆
活動は収入を得られるのか、という僕にとって大きな問題を解決できるかも
しれない方向性のひとつが、メールマガジンへの広告添付です。
　というわけで、申し訳ありませんがこれからも皆さんにはこの実験に付き
合っていただければと思います。
　ちなみに、できるだけ混雑を避けるため、この配信は午前１１時に行うよ
う予約する予定です。あんま意味ないかもしんないけど……。

　Pubzine 経由の配信についても書いておきます。
　まぐまぐが最近、さまざまな部分で不安定なこともあり、これからも
Pubzine との平行配信を続けていく方針です。
　もし「広告が邪魔だなー」と思ったら、 Pubzine への移行をお奨めしま
す。 Pubzine とまぐまぐによる同時配信で、皆さんへのチャンネルを確保
したいと考えています。もちろんバックナンバーをお読みいただいても結構
ですし。

　では、これからも KAB-studio.h をよろしくお願いしまーす。


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

・更新なし。
　やっぱ更新なかったっすね。むー。


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

２０００年１月３０日（日）：
　久しぶりーの小説書き。ちなみに題名は Iko 、わてらしくないホラーサ
スペンスで問題ありそな内容です。公開できる日はいつの日か……。

２０００年１月３１日（月）：
　タイピングオブザデッド！　君はキーボード叩いてゾンビを倒せるか！
あと毎月恒例ベクターさんのダウンロード数、そしてハッカーの呼び名。

２０００年２月１日（火）：
　後期授業最終日。そして野球。わては西武ファン。

２０００年２月２日（水）：
　コンタクトレンズ、そしてホカロンの CM 。

２０００年２月３日（木）：
　研究室面接、熱い対決！

２０００年２月４日（金）：
　そしてダメ（泣）。改めてこの日の読むと、なんか壊れてるっぽい？

２０００年２月５日（土）：
　アニメとか GIF とかバレンタインデーとか。ん？


/*                         鏑矢の憂鬱                             */
http://www2.justnet.ne.jp/~kabstudio/Programing/KabuU/

２０００年１月３０日（日）：
お便り
HotSpot VM
IE 搭載 Java のセキュリティリーク
Java を切ろう
「中」のセキュリティを上げるべき？

２０００年１月３１日（月）：
KAB-studio.h 届かず
#pragma twice のこれからの予定
いいプログラムを書くためにいいライブラリを読むべし

２０００年２月１日（火）：
KAB-studio.h 到着
信号処理用プログラミングを開始
wav ファイルを読み込みヘッダーの解析
サンプルが多いから楽そう
自作ライブラリをどうするか
ひとつのファイルにまとめたい
でも知らないうちに使うのは怖い
今はその都度複製

２０００年２月２日（水）：
wav ファイルの解析＆作成
2byte と 4byte
ポカ集
istream::tellg() の戻り値 streampos はクラス
位置は fpos::get_fpos_t() で取得
std::istream_iterator は「ひとつ先」まで行く事に注意
char 配列などに入れてあとでまとめて、が楽
バイナリーデータの書き込みが面倒
sin 波を書き込むプログラムは完成

２０００年２月３日（木）：
ポカ集
std::generate_n() と std::ostream_iterator と自作関数オブジェクト
std::ostream_iterator のテンプレート引数は「渡す型」
std::ostream::operator<<() みたいにオーバーロードされてない
protected はむしろ public
お便り
右クリックメニューが、右クリックで消えない
TPM_RIGHTBUTTON を加えれば解決

２０００年２月４日（金）：
信号処理関連のプログラム
拾ってきた FFT 関数に sin 波や方形波を渡す
思ったのとちょっと違う
出力は std::ofstream を使ってファイルに出力して gnuplot で表示
gnuplot は楽

２０００年２月５日（土）：
FFT 関数に sin 波や方形波を渡すのがうまくいった
サンプリング周波数を合わせないとダメっぽい
前の実験の結果と一致した
これからは DFT の作成


/*                       今週の追加単語                           */
http://www2.justnet.ne.jp/~kabstudio/Programing/Dictionary/

・追加単語：
ソリューション カラーコード 文字コード 文字 サーチ 検索 IP
IP アドレス リージョン シーケンシャル

・更改単語：
なし

・今週のごめんなさい
メッセージ 一文字 OVERLAPPED EndDialog( ),DestroyWindow( )
ホロノミック wnaspi32.dll enum

　先週ちょっと言ったからか激減しました（笑）。ま、このくらいがちょう
どいいかも。

/*                       #pragma twice                            */
http://www2.justnet.ne.jp/~kabstudio/Programing/PragmaTwice/

　Version 3.18
クラスを超えたおつきあい

「前回は、なんでダイアログが閉じるのか見てみました」
『結局は EndDialog() ってのが呼ばれるかどーかよね』
「で、この関数に渡された値が」
『 CDialog::DoModal() の戻り値になって返ってくる！』
「【OK】ボタンと【キャンセル】ボタンの場合はどうなんだっけ」
『えっと、【OK】の方は IDOK 、【キャンセル】の方は IDCANCEL を 
EndDialog() に渡してたんだよね』
「ではそれを踏まえて、この前見た CCalcApp::InitInstance() をもう一度
見てみましょう」

BOOL CCalcApp::InitInstance()
{
    // 略

    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO: ダイアログが <OK> で消された時のコードを
        //       記述してください。
    }
    else if (nResponse == IDCANCEL)
    {
        // TODO: ダイアログが <キャンセル> で消された時のコードを
        //       記述してください。
    }

    // 略
}

『あ、えーと、なんとなーく分かるような……』
「１行ずつ、ゆっくりと見ていけば分かると思うよ」
『んじゃゆっくりと。まず DoModal() んとこでダイアログ作ってるのよね』
「そう。ダイアログが閉じるまで、この関数から返ってきません」
『で、返ってきたときの戻り値が、 nResponse って変数に入って』
「ちなみに nResponse ってのは、〈整数〉って意味の n と〈反応〉って意
味の Response から来てます。ま、これがＭＦＣ流ってとこかな」
『……ちょっと静かにしてくんない？』
「はい……」
『で、 if ってことは、 nResponse が IDOK かどうかってのを見てるんだ
よね』
「……」
『参照くらい言っていーよ』
「はいはい。えっと、 if は Ver 2.8 （ No.019 ）で、 == は Ver 2.6
（ No.017 ）に書いてあります」
『もし nResponse が IDOK なら、〈ダイアログが <OK> で〉とか書かれて
る、中カッコと中カッコ閉じの中に入って、そうでないなら次の else if
に……』
「 else if も Ver 2.8 （ No.019 ）に書いてあります」
『 else if の方で、もし、 nResponse が IDCANCEL なら、〈ダイアログが 
<キャンセル> 〉とか書かれてる中カッコと中カッコ閉じに入る……』
「つまり？」
『つまり、戻り値が IDOK なら上の TODO んとこに、 IDCANCEL なら下の 
TODO んとこに行くってことでしょ？』
「もう少し言うと？」
『え？』
「その戻り値って、なんで返ってくるんだっけ」
『 EndDialog() の……あ、つまり【OK】ボタン押したら上の、【キャンセル】
押したら下のってことなんだ！』
「そういうこと。ＭＦＣがそういうプログラムを用意してくれてるってこと
だね」
『ほー』
「ちなみにこういう if の使い方はとーってもオーソドックスなものだから、
簡単に書けるようにね」
『こういうって？』
「関数の戻り値をチェックして、それに合わせて処理するって方法のこと」
『なるほど。書けなきゃダメ？』
「だめ。いくらなんでもこれくらいはそらで書けないと」
『ぶー』
「んじゃ今回の目的。今日は〈【OK】ボタンを押したらアウトプットに結果
を表示する〉ってプログラムを作ります」
『……〈【OK】ボタンを押したら〉は、上の TODO に書けばいいってのは分
かるけど、そのあとが……ねぇ』
「〈アウトプットに表示する〉のは分かるでしょ？」
『 TRACE() 使えばいいんだよね。ってことは、〈結果〉が分かればいいんだ』
「じゃ、ここで先週に引き続き CCalcDlg::OnBEqual() を見てみましょう」

void CCalcDlg::OnBEqual() 
{
    UpdateData( TRUE );
    m_iAns = m_iLh + m_iRh;
    UpdateData( FALSE );
}

「これは何してるんだっけ？」
『えーっと、確か、 m_iAns とかは、ダイアログに張り付いてるエディット
ボックスとくっついてるんだよね』
「 Ver 3.11 （ No.036 ）だね」
『で、UpdateData( TRUE ) でエディットから m_iAns とかに数字を渡して、
UpdateData( FALSE ) でその逆に m_Ans とかからエディットに渡すんだよね』
「そう。で？」
『で……あ、で、真ん中の行で足し算して、 m_iAns の中に答を入れて、そ
れが次の行でエディットに書き込まれるって仕組みだったよね、確か』
「そういうこと。ってことはつまり、計算結果は m_iAns に入ってるってこ
とでしょ」
『あ、そっか！　この m_iAns の中身が分かれば、結果が表示できるんだ。
でもどうやって？』
「 m_iAns ってなんだっけ」
『えーっと、エディットボックスと結びつけられてる変数』
「なに変数だっけ」
『あ、メンバ変数！』
「そう。 CalcDlg.h の中に……」

class CCalcDlg : public CDialog
{
// 略
    int        m_iAns;
    int        m_iLh;
    int        m_iRh;
// 略
};

「こういうふうにすると、 CCalcDlg のメンバ変数になります」
『 CCalcDlg のどんなメンバ関数からでも使えるんだよね』
「メンバ変数については Ver 3.7 （ No.032 ）を見てください。で、 m_iAns
は CCalcDlg のメンバ変数でしょ」
『うん』
「で、表示したいのは CCalcApp::InitInstance() の中」
『あ、クラスが違うんだ！』
「そう、今回の鍵はまさにそこにあるわけ。 CCalcApp::InitInstance() を
もう一度見てみると……」

BOOL CCalcApp::InitInstance()
{
    // 略

    CCalcDlg dlg;
    m_pMainWnd = &dlg;

    int nResponse = dlg.DoModal();

    // 略
}

『あ、この CCalcDlg の変数 dlg を使って、ダイアログを表示してるんだ
から……』
「つまり、この dlg って変数の中に m_iAns が入ってるってこと。これが
取り出せれば」
『取り出せれば目的完了！　でもどうやって？』
「ところで dlg.DoModal() って何してると思う？」
『ダイアログ表示してるんでしょ？』
「いや、もっと細かく言うと……」
『えっと、 CDialog の DoModal() ってメンバ関数を……あ』
「んじゃ思う通りに作ってみてみ？」
『んっと……』

    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO: ダイアログが <OK> で消された時のコードを
        //       記述してください。
    }

『の TODO のとこに、あ、えーっと』
「細かく細かく、だよ」
『あ、じゃあとりあえずいつもの TRACE() を』

        TRACE( "%d\n",  );

「その２番目の引数に、数字にあたる変数を入れればいいんだから」
『……もうひとつ変数作っていい？』
「もちろん」

        int i;
        TRACE( "%d\n", i );

『で、この i に……あってますように』

        int i = dlg.m_iAns();
        TRACE( "%d\n", i );

『って感じに、メンバ変数もメンバ関数と同じふーに』
「変数なんだから小カッコはいらないでしょう」
『あ、そっか。ってことは当たり？』
「そういうこと！」

        int i = dlg.m_iAns;
        TRACE( "%d\n", i );

『って書き直してビルドして実行、左に 100 、右に 250 、【＋】ボタン押
して結果は 350 、そして【OK】ボタンを押すと……』
　アウトプットに 350 と表示される。
『やったー！！　なんだ楽勝じゃん』
「またそーゆーことを……。ま、こんなふうに、メンバ関数と同じようにメ
ンバ変数にアクセスできるってことは分かった？」
『うん分かった！』
「んじゃ問題」
『げげ！』
「ダイアログが表示されたときに、答の部分に 100 が表示されるようにす
るにはどうすればいいでしょう」
『おんなじふーにすればいーの？』
「そうだよ。ダイアログが表示する前に、値を入れとかないといけないから」
『 DoModal() を呼ぶ前ってことでしょ、ってことは……』

    dlg.m_iAns = 100;    // ここに追加。
    int nResponse = dlg.DoModal();

『って感じじゃない？』
「正解！　結構分かってきたかな？」

/*
    Preview Next Story!
*/
『レジストリってよく聞くよね』
「照り焼きにして食べるとおいしいんだ」
『あたしはカレーがいーな』
「照り焼き！」
『カレー！』
「というわけで次回」
＜ Version 3.19 レジストリに保存しよう！ ＞
『につづく！！』
「でも〈なんとかとり〉って名前の鳥ってあんまいないけど」
『コウノトリ？』
「コウノトリ食うんかい」


/*                       金菜さんの憂鬱                           */
http://www2.justnet.ne.jp/~kabstudio/Programing/KanaU/

アプリのツボ
#06 ファイラー その２

　ファイルの列挙は基本的に楽。でもそれじゃ dir とか ls と同じよね。
ファイラーを作る意味のひとつは、分かりやすい GUI を使って表示するこ
と。でもこれが結構大変なのよね。

　フォルダ風ならリストコントロール。これは MFC のクラスとか使って処
理すれば結構簡単かな。でもドラッグ＆ドロップの処理とか、表示項目の入
れ替え、ソートとか結構面倒な処理をしてます。フォルダのソート機能って、
１バイト文字と２バイト文字を区別することなくソートしてくれます。こう
いう気配りも大事かも。
　エクスプローラー風でいくなら、分割ウィンドウを使って、そこにツリー
コントロールを貼り付けなきゃね。分割ウィンドウはウィンドウズそのもの
の機能じゃないから、 MFC を使わない場合には結構大変かも。ま、よく使
われてるから探せばどっかにライブラリがありそうだけどね。MFC なら
CSplitterWnd を使えば楽に実装できるけど、これはこれで結構クセがあっ
て、このクラスの使い方って結構質問が出てくるのよね。
　ツリーコントロールはリストコントロールと同じ、ウィンドウズのコモン
コントロールのひとつ。リストコントロールが使いこなせれば、ツリーコン
トロールの操作はできるんじゃないかな。

　こういったコントロールの操作は、結構気を使うのよね。でもファイラー
としてのメリットでもあるんだし、重点的に作りこむ方がいいかもね。
　さて、ウィンドウズではファイルシステムを拡張した「シェルエクステン
ション」っていうのが使われています。これは来週。じゃね。


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

・更新なし。
　テストは２月１５日まで。しかも研究室まだ決まってないから、結構大変
かもしんないです。ただ春休みにはいきなりのお引っ越しや久々の Codian
更新、さらに初の壁紙制作なんかも予定してるんで色々期待してぴょん。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www2.justnet.ne.jp/~kabstudio/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www2.justnet.ne.jp/~kabstudio/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://www2.justnet.ne.jp/~kabstudio/Freeware/

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

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


/*                      See you next week!!                      */


