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

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

    送信日： 2001/03/04(Sun) No.097
    配信数： 3890（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/

/*                           旅行中！                             */

　沖縄に旅行してくるんで、３月４日５日６日（日・月・火）は更新をお休
みします。なのでこのメルマガは、いつもは月曜朝配信ですが今回は日曜朝
に配信しています。
　休み中、鏑矢の憂鬱はお休みします。チョー普通な日記もお休み、だけど
臨時板には書き込むのでそちらを見てね。
[ かぶスタ臨時板 ]
http://www.kab-studio.com/nikki2/Rinziban/


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

・３月表紙登場！
　バレンタインがあったんでたった半月で新しい表紙です。今回はちょっと
いまいちかも（汗）。壁紙のダウンロードは CG Gallery にて。
[ CG Gallery ]
http://www.kab-studio.com/CG/Gallery/


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

2001/02/25 (Sun)
　かなゆ〜はもうすぐおしまいとか、かぶヘッダーもうすぐ１００号とか。
んで日曜なんでアニメとか色々。ガオレン、悪くないと思うんだけどなー。

2001/02/26 (Mon)
　久しぶりに新宿行ってカレキン食べたり花柄 iMac 見たり画材買ったり。
帰ってからはビリヤードしたり飲みに行ったり。あら忙しそう。

2001/02/27 (Tue)
　３月表紙完成！！　が……出来は……。やっぱ時間短いとダメだね。

2001/02/28 (Wed)
　ラジオシティの時代が来た！！　この表現力どうよ！！　なんてこととは
対照的に花粉症モードの中ゼミ室の大掃除。

2001/03/01 (Thu)
　大掃除で筋肉痛(泣)。あと国際システム(就職先)に提出する書類揃えたり
ゲームボーイアドバンス欲しかったりとか。

2001/03/02 (Fri)
　myShade2 with ラジオシティで３月表紙壁紙の背景作り！　って更新直前
に作るかな(汗)。ま、少し良くなったかもしんない。あと BIGLOBE サーチ
に登録されたりとか。

2001/03/03 (Sat)
(旅行の関係で、来週載せます)


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

2001/02/25 (Sun)
お便り
構造体の write() はそのまま read() していいの？
メモリ上のバイナリーデータそのものが書き込まれるから大丈夫
構造体のサイズが問題
アライメントを考えないと
sizeof の値を使うべき
close() しないと open() できなかった
お便り
ワーカースレッド実行中にアプリを終了するとどうなる？
MSDN の "Terminating a Process" を見るとその場で停止するらしい
たいがいのことはプロセスが削除されればなんとかなる
「デバッグの中止」とかで試すといいかも
スレッドを待つには WaitForSingleObject() を使う
サンプルコード
スレッドが終了するのを待つ
お便り
CFindReplaceDialog の使い方は？
サンプルコード
FINDMSGSTRING で登録されたメッセージが送られてくる
CFindReplaceDialog::GetFindString() でも取得できる

2001/02/26 (Mon)
お便り
CFindReplaceDialog で ASSERT() が出る
CFindReplaceDialog::PostNcDestroy() で delete this している
CFindReplaceDialog 型変数を new で作ればいい
お便り
ワーカースレッドの役に立った

2001/02/27 (Tue)
お休み

2001/02/28 (Wed)
お便り
Microsoft(R) Visual Studio(R) 6.0 Service Pack 5
MFC42.DLL が更新されてるけど修正されてないように見える
差分を取ってみれば分かりそう

2001/03/01 (Thu)
「右詰」「複数行」コントロールを４０個程度貼り付けたら
DoModal() やテスト表示できなくなった
CreateDialogIndirect() の戻り値が NULL で GetLastError() で 0 が返る
コード上での追加はうまくいくと思う
ダイアログエディタ上のダイアログは本物のダイアログだから

2001/03/02 (Fri)
お便り
エクスプローラーにドロップするには？
あまりよく知らないので
サンプルコードへのリンクを紹介します
COM インターフェイスを作る必要があるらしい

2001/03/03 (Sat)
(旅行の関係で、来週載せます)


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

・追加単語：
ウィンドウ間通信

・今週の状況：
　今回は１単語(汗)。でも来週もこのくらいがいいかも……でも単語追加は
３月一杯なんでお早めに〜。


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

テンプレート
#17 型メンバ

　テンプレートを使うと、コードが長くなりがち。 typedef はそれを避け
るためにも使えます。たとえば、 No.093 のコードはこう書き換えられま
す。

void Use_COutFuncDef()
{
    typedef COutFuncDef< int > COutFuncDefInt;
    COutFuncDefInt cTmplForMemFunc;
    printf( "%d\n", cTmplForMemFunc.MemFunc( 200 ) );
    // 100
}

　特に、ある特定の型をテンプレート引数に渡すことが多い場合は typedef
しちゃってそれを使い回す方が楽ね。
　これに関連して、 typedef を使って「型メンバ」を作ることができます。

template< class type_Data >
class CHasTypeMember
{
    type_Data m_Data;
public:
    typedef CHasTypeMember< type_Data > type_this; // 型メンバ。
};

　この例は、自分そのものを typedef してます。場合によっては、自クラ
スのポインタや参照、さらにその const を typedef することも。こうする
ことで長ったらしい型名を短くできるし、クラス名が変わったときとかも必
要最低限の変更だけでできるしね。特に、メンバ関数の引数や戻り値に自ク
ラスを使うことが多かったりする場合に便利かな。
　クラスの中だけじゃなく、外から呼ぶときも便利。こんな感じに型メンバ
を使います。

    CHasTypeMember< int >::type_this cHasTypeMemberInt;

　ま、これ自体はあんまり意味ないけどね。
　こういう外から使う場合に便利なのは、テンプレート引数を typedef し
たものや、テンプレート引数の型メンバを typedef したものなんかの方か
な。こういうのを型メンバとして呼び出せば、テンプレート引数に何が渡さ
れてるのかとか考えなくて済むからね。次回はテンプレートの作り方。じゃ
ね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『ねー、４月になったら色々お休みになるって話は？』
「もうそんな時期なんだね……」
『何煮え切らないこと言ってんのよ』
「決定してるの少ないから。かなゆ〜はもうすぐ終わりだけど」
『なんか上のテンプレート編って中途半端よね……』
「辞書は３月一杯で単語登録終了」
『これは上にも書いてあるね』
「かぶゆ〜も」
『……へ？　３月一杯で？　なんで？　とりあえず続けるって話じゃ？』
「スタンス的にはとりあえず休止、できそうなら再開、らしいよ」
『……暴動起きるんじゃない？』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.32
コンボボックスのリストに追加！

「前回はコンボボックスに文字列を入れてみました」
『 SetWindowText() でできたのよねー、知っちゃえば簡単ね』
「で、わざわざコンボボックスにしたんだから、コンボボックスのリストに
パスを追加してみましょう」
『追加って、いつするのがいいのかな』
「その辺はどういう使い勝手にするかって部分だね。とりあえずは【参照】
ボタンを押したとき、ってことにしようか」
『はーい』
「じゃ、どういうふうにすればいい、っていうのイメージしてみて」
『えええっ！？　えーっとねぇ……そういえば、リストボックスの時には 
CListBox::AddString() ってメンバ関数呼んだら追加できたんだから、コン
ボボックスでもそういうのできそう』
「では調べてみましょう」
『 MSDN 開いて CComboBox のメンバ関数一覧……あ、まんま AddString() 
ってのがある』
「じゃ、それ使ってみましょう！」
『使ってみるって言っても……』
「こういう、この関数でいいのかなーって時には、簡単にテストしてみると
か」
『簡単にテスト、ねぇ…… CFileTestDlg::OnBtnBrowse() の最後ででもし
てみようかな』

void CFileTestDlg::OnBtnBrowse() 
{
// 略。
    m_cFileCmbBox.SetWindowText( cFileDlg.GetPathName() );

// この下を追加。
    m_cFileCmbBox.AddString( cFileDlg.GetPathName() );
}

『んーと、コンボボックスのメンバ変数 m_cFileCmbBox から AddString() 
を呼び出して、それに、ファイルのフルパスを取得する 
cFileDlg.GetPathName() の戻り値を渡せば……ビルドして実行！　ちゃん
と下のリストに追加されてく！！』
「うん、うまくいってるね。このメンバ関数で追加できるってことは分かっ
たね」
『……あれ？　でも追加した順番と並び方が違う……』
「前にもそういうことあったね」
『あった！　リストボックスの時！　あのときソートされてたんだ』
「 Ver 5.19 ( No.084 ) の時だね」
『あのときは、プロパティでソートになってたんだよね。あ！　ってことは
コンボボックスのプロパティにも！？　 IDC_CMB_FILE のプロパティ……
あった！』
「これもソートがデフォルトなんだなぁ……」
『そういえば他にもいろんなスタイルがあるね』
「さて問題。こうやってプロパティで決めるの以外では、ウィンドウのスタ
イルはいつ決められる？」
『え！？　えーっと……そう、 CreateWindow() 呼んだとき！　前にウィン
ドウやボタン作ったときに WS_CHILD とか BS_PUSHBUTTON 渡したんだもん
ね』
「そうでした。ってことは、スタイルの情報についてはそういうページを見
ればいいってこと」
『なるほど！　ってことは…… CComboBox::Create() とかにもあったりす
るのかな……あ、〈コンボボックススタイル〉ってのがある！　おおっスタ
イルがいっぱい！』
「あとは、プロパティのスタイルがどれに当たるのか分かれば」
『見ればだいたい分かるね。 CBS_SORT っていまのソートするってのだよね』
「だからこれを見れば」
『……見てもわかんねぇ……』
「ま、そういうもんだね。こういうのは遊びがてら実際に試してみて、どう
いう機能を持ってるのかとか憶えていく方がいいかも」
『面倒な方法……』
「とりあえず、【ソート】は外して、【水平オートスクロール】はチェック
した方がいいかな」
『水平オートスクロール？』
「これしないで、長い文字列をコンボボックスに入れてみて」
『んじゃ深いフォルダにあるファイルを参照っと。あれ？　なんかえらい使
いづらい……』
「普通、右の方にドラッグすると自動的にスクロールするんだけど」
『しない〜』
「で、【水平オートスクロール】をチェックすると」
『おおっ、ちゃんとなる！！』
「こういうふうに色々試して憶えていかないとね」
『っつーかさ、他のアプリだとできてるのにうちはできない！　じゃあどう
いうスタイルか Spy++ で見てみよう、 CBS_AUTOHSCROLL がないじゃない、
それじゃそれを追加しよう、って方法じゃダメ？』
「ＯＫ。その方が普通かもね。あ、でも前に行ったけど、単にスタイルだけ
が原因とは限らないから」
『タイトルバーがどうのこうのとか前に言ってたね』
「たとえば、こういうスタイルで実現できるって知らなくて、プログラムの
力業で実現させてたりとか」
『うわぁ……』
「ま、スタイルはその辺にしといて、今の段階だとあとふたつ問題がありま
す」
『え？　そなの？』
「同じファイルを３回立て続けに参照すると」
『みっつ全部追加されるね』
「それって変じゃない？」
『うん、変。これってようするにファイルの履歴でしょ、そしたら同じファ
イルがいっぱいあってもしょうがないじゃん』
「というわけでこれを何とかしましょう」
『……そういうのを何とかするスタイルとかあるの？』
「ありません」
『……ってことは、自分でなんとかしなきゃダメ？』
「そゆこと」
『難しそう〜』
「順を追って考えれば大丈夫。まず、ファイルの履歴がリストにずらっと並
んでます」
『ずらっと』
「ここに新しいファイルのフルパスが追加されます。でも同じものがリスト
にもありました。普通のアプリだとどうなる？」
『んーと、普通、リストにあったのが一番上に来るんだよね』
「ってことは、手順としては、まずリストに同じものがあるか調べて、あれ
ばそれを先頭まで移動、ってすればいいわけ」
『あ、そっか！』
「この辺はパズルみたいなものかも」
『じゃ、そうと分かればそういう機能があるメンバ関数を探せばいいんだね。
えーっと、見つけだすのは CComboBox::FindString() で良さそう。あ、で
も移動させるのはなさそう』
「うん、移動させるのはないみたいだね。そういう場合はどうする？」
『そーねぇ…… DeleteString() で削除して AddString() で追加するって
いうのは？』
「んじゃそれを試してみましょう。あ、まず CComboBox::FindString() か
ら試した方がいいかも」
『そなの？』
「いやね、僕がいるんだからホントは必要ないんだけど、実際に自分で調べ
てくときには、あまりいっぺんにしない方がいいから」
『さっき言ってた簡単なテスト、ってヤツね』
「そゆこと。あ、でも、今みたく〈どのメンバ関数使えばいいのかな〉って
調べるときには、片っ端からテストせずに、まずどんな方法があるのか良く
調べてからの方がいいよ」
『どして？』
「１発で簡単にできちゃう関数があるかもしれないでしょ」
『あ、そっか』
「それに、どの関数を使うかによってメリットデメリットがあるってことも
あるから、必要なら使い比べることも必要だしね」
『片っ端から使ってたら、最初に使ったのが良かったら他の方法見ないもん
ね』
「じゃ、まずは CComboBox::FindString() から」
『んーと、第１引数は調べる場所……あ、でも -1 でいいんだね』
「そだね、 -1 だと全体を検索するみたいだね」
『あのさ、ここに書いてある〈 0 から始まるインデックス〉って、つまり
配列みたいに 0 から始まるのって意味だよね』
「そうだよ。他の言語だと 1 から始まるのとかあるし、もちろん関数に
よっては」
『 2 とか 3 とかから始まる？』
「作れなくはないけど……」
『で、第２引数が探す文字列、戻り値に、何番目に同じのがあったのかって
いうのが返ってくるのね。見つからなかったら CB_ERR っと』
「んじゃ使ってみましょう」
『テストだから、戻り値を TRACE() で出してみればいいかな』

void CFileTestDlg::OnBtnBrowse() 
{
// 略。
    m_cFileCmbBox.SetWindowText( cFileDlg.GetPathName() );

// この下を追加。
    int iNo
        = m_cFileCmbBox.FindString( -1,  cFileDlg.GetPathName() );
    TRACE( "%d\n", iNo );
// この下のはさっきの。
    m_cFileCmbBox.AddString( cFileDlg.GetPathName() );
}

『うん、同じのを選ぶとそのインデックスナンバーが返ってくる！』
「じゃ、次はそれを削除しましょう」
『 CComboBox::DeleteString() でたぶん削除できると思うから、これの引
数に CComboBox::FindString() の戻り値を渡してっと』
「 CB_ERR が返ってきたときは削除しないようにすること、忘れないで」
『おおっとそうだった』

void CFileTestDlg::OnBtnBrowse() 
{
// 略。
    m_cFileCmbBox.SetWindowText( cFileDlg.GetPathName() );

    int iNo
        = m_cFileCmbBox.FindString( -1,  cFileDlg.GetPathName() );
    if( iNo != CB_ERR )
    {
        m_cFileCmbBox.DeleteString( iNo );
    }
    m_cFileCmbBox.AddString( cFileDlg.GetPathName() );
}

『ビルドして実行！　おおっ、ちゃんと削除されてる！　そしてちゃんと追
加……あれ？』
「そ、もうひとつの問題点。最後に追加じゃなく」
『履歴っぽくするんならやっぱ一番上じゃないとね。でもだとしたらどう
するんだろう』
「どうすればいいと思う？」
『 AddString() は最後にしか追加できないから……他の位置に追加できる
メンバ関数を探せばいいんだ！　えーっと、 CComboBox::InsertString() 
なんかそれっぽいね』
「うん、それで大丈夫でしょ」
『えっと、第１引数は……この〈挿入〉って、どこに入んのかいまいち分か
んないんだけど』
「そうなんだよね、２番目を指定したときに２番目の上にはいるのか下に入
るのか、っていうのがあるから。ま、これはよく読めば分かるだろうけど」
『分かる？』
「理論上、〈上に挿入〉なら一番最後に追加できないし、〈下に挿入〉なら
一番最初に追加できないでしょ」
『あ、だから〈 -1 で最後に追加〉ってあるんだ！　ってことは〈上に挿入〉
ね』
「そゆこと。ってことは一番最初に追加するには？」
『インデックスナンバーを 0 にする！　だからこんな感じ？』

void CFileTestDlg::OnBtnBrowse() 
{
// 略。
    int iNo
        = m_cFileCmbBox.FindString( -1,  cFileDlg.GetPathName() );
    if( iNo != CB_ERR )
    {
        m_cFileCmbBox.DeleteString( iNo );
    }
    m_cFileCmbBox.InsertString( 0, cFileDlg.GetPathName() ); // ここ。
}

『ビルドして実行！　おおっちゃんとした履歴みたい！』


/*
    Preview Next Story!
*/
『少しずつできてくって楽しいね！』
「ま、ホントはこういうのはいけないんだけどね」
『どゆこと？』
「仕様とかを最初にしっかり決めてから作り始めないと」
『そんなの遠い先の話だと思ってた……』
「いや実際遠い話かも」
『なにそれ！』
「というわけで次回」
＜ Version 5.33 仕様を考えてさらに使いやすく！ ＞
『につづく！』
「ま、そういうのはも少し先ってことで」
『行き当たりばったりばかりの水希ちゃんに、仕様なんて作れるのぉ？』
「う”」


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

・Codian にページを追加
　 Codian にページを追加します。今回は STL & iostream 入門から STL 
の #22 - #24 を追加。


/*                          ご注意！！                            */

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


