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

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

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

/*               次回配信は３月４日（日）の予定                   */

・３月４日５日６日（日・月・火）は旅行に行ってくる予定なんで、そのた
めに配信は３月４日（日）になります。御了承ください。詳しくは最後に。


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

・Codian にページを追加
　 Codian にページを追加します。今回は STL & iostream 入門から 
iostream の #21 - #24 を追加。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/
[ STL & iostream 入門 ]
http://www.kab-studio.com/Programing/STLiostream/


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

2001/02/18 (Sun)
　卒論プレゼン資料作りに Codian に Perl プログラミングにギルティギア
ゼクス(爆)。なんか忙しいねぇ。しかしこれは、この１週間の予兆であった
のだよ！！

2001/02/19 (Mon)
　卒論プレゼンリハ１回目。しかしこのときはそれほどぼろが出ず。そして
臨時板を作成。これは今度の旅行で大活躍！　の予定。

2001/02/20 (Tue)
　卒論プレゼン資料作り。しかし、その暗記に四苦八苦、そして自らの限界
を如実に感じ、その不甲斐なさに打ちひしがれることしばし！！　役者には
なれんよ……。しかしちょっとだけコツを掴んだり、有名人にフォローされ
たり(爆)と。

2001/02/21 (Wed)
　卒論プレゼンリハ２回目。おもいっきしぼろが出る(汗)。とにかくある程
度憶えなきゃいけないんでちょっと変えて暗記することに。本番は明日！

2001/02/22 (Thu)
　卒業論文プレゼンテーション本番。うにゃ楽勝！！　攻性モードとなった
わてに敵はいない！　そして卒論もＯＫ！　とりあえずこれでひと安心です
なー。

2001/02/23 (Fri)
　ひと安心したらなんか忙しい(汗)。沖縄に旅行行くし、ホームページやメ
ルマガの更新もしなきゃいけないし、３月表紙も書かなきゃいけないし。そ
んななか２９万ヒット。結構堅実に増えてるなぁ。

2001/02/24 (Sat)
　図書館で本もらってきたよーん。堅実系だけど結構いいかも。あとお奨め 
MP3 プレイヤー。らぶりー過ぎる！！


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

2001/02/18 (Sun)
Perl プログラミング
文字コードの変換がうまくいかない
お便り
クラスの値返しとクラスの参照返し、コンスタントクラスの参照返しと
コンスタントクラスの値返しの使い分けが分からない
CTest func(), CTest &func(), const CTest func(), const CTest &func() 
const CTest func() はあまり使わない
CTest func() 」はわざとコピーを作りたい場合に使う
CTest &func() と const CTest &func() はメンバ変数の場合に
書き込み用と読み込み用

2001/02/19 (Mon)
Perl プログラミング
臨時板を作成
お便り
半透明の描画をするには？
簡単な方法はなさそう
AlphaBlend() や TransparentBlt() が使えるか
Knowledge Base の Article ID: Q79212 は違うっぽい
各ピクセルで、描画元に透明度を掛けて描画先に加えたものを書き込む
GetPixel() とか SetPixel() 

2001/02/20 (Tue)
お休み

2001/02/21 (Wed)
お休み

2001/02/22 (Thu)
お休み

2001/02/23 (Fri)
XML プログラミング
@IT の「 VBScriptでXMLプログラミング」を参考にする
うまくいかない
UTF-8 で保存する必要があった
もしくは encoding="Shift_JIS" するか
お便り
OnMouseOver OnMouseOut のようなイベントはない？
乗るタイミングは WM_MOUSEMOVE を調べるしかなさそう
離れたときは _TrackMouseEvent() と WM_MOUSELEAVE で
メッセージは「目的のウィンドウ」に送られるからサブクラス化しないと

2001/02/24 (Sat)
XML プログラミング
引き続き VBS サンプルをテスト
MSXML のリファレンスの C++ のとなんか違う
各ノードを再帰呼び出ししてる
nodeValue に値を格納できる
DOMDocument.save( "Sample_Out.xml" ) で新規ファイルに保存できる
あとはまっさらな状態から保存できるかどうか
その他英語だとか言語依存だとか


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

・追加単語：
argc argv CAB カバレッジ 

・今週の状況：
　ここに来て大事な単語 argc と argv が来るのがうちらしい(爆)。以前ほ
ど忙しくはなくなったんで、すこーし増えても大丈夫だと思うです。


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

テンプレート
#14 typedef

　クラステンプレートを使うときには、 typedef も一緒に使うことが非常
に多くなります。

　 typedef を使う場面のひとつは、一応クラステンプレートとして作って
あるけど、普通のクラスとして使うことが多い、っていう場合。たとえば、
標準 C++ ライブラリの std::string は、 std::basic_string< char > を
typedef したもの。たとえばこんな感じに。

typedef basic_string<char, char_traits<char>, allocator<char> >
    string;

　 std::basic_string は、文字列を格納するためのクラステンプレート。
その文字列の格納領域はある型のリニアな領域として確保されるんだけど、
その型をテンプレート引数で指定できるようになってるんです。たとえば、
普通の文字列なら char 、 Unicode を使うんなら wchar_t 、っていう具合
に。
　でも実際には char か wchar_t しか使わないから、そのために typedef
でそれぞれ std::string と std::wstring っていう型として定義されてる
んです。もちろん、これは単なる別名だから、テンプレート引数にまったく
別の型を使うこともできるしね。
　これはもちろん、自分でクラステンプレートを作った場合も同じ。クラス
テンプレートがホントに汎用性高くてどんな型にも使えるんならこういう必
要はないけど、ある一部の型しかテンプレート引数に取らないっていう場合
には typedef するといいかもね。

　これに関連した typedef の使い道として、元々普通のクラスだったのを
クラステンプレート化したときに typedef を使うことがあります。
　 CTest ってクラスを作ってずっと使ってたんだけど、それをクラステン
プレートとして作り直す必要が出てきたって場合。もしそのままクラステン
プレートにしちゃったら、 CTest を使っていた部分を書き換えなきゃいけ
なくなるでしょ。
　そこで、クラステンプレートは別の名前として作って、 typedef で CTest
って名前にしちゃう方法が採れます。もともと CTest はある特定の型を使
っていたはずだから、その型で typedef しちゃえばいいわけ。
　実は std::string なんかが typedef されているのはこの辺の理由もあっ
たりします。ずっと使ってたクラスをテンプレート化するときには、この方
法があるってこと憶えておいてね。次は型メンバについて。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『ねー、ちょっと心配になったんだけど』
「どしたの？」
『やれちまたじゃ .Net だとか XML だとか Java だとか流行ってんじゃん』
「確かに流行ってるねぇ。でも火美ちゃんは今の勉強してれば大丈夫だよ」
『そなの？』
「火美ちゃんに教えてることは、他のどんな事にも応用できることだから」
『つまり基礎の基礎ってこと？』
「そ。今は無茶苦茶遅い歩みだけど」
『もうすぐ２年目……』
「でもあと少ししたらトップレベルのプログラマー！」
『おお！　でも水希ちゃんはトップレベルに見えないけど』
「ええ！？」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.31
コンボボックスとエディットボックス

「前回はファイルダイアログを使ってみました」
『 CFileDialog ってクラスで簡単にできたよねー。で、その開いたファイ
ルを読み込むんだよね』
「そう。 CFileTestDlg::OnBtnShow() の中で……」

void CFileTestDlg::OnBtnShow() 
{
    m_cDataLstBox.ResetContent();

    std::ifstream cIFStrm;
    cIFStrm.open( "Data.txt" );    // ここ！
// 以下略

「この "Data.txt" をその開いたファイルのフルパス文字列に置き換えれば
うまくいきます」
『でもどーやって渡すの？　メンバ関数違うじゃん』
「そこで〈コンボボックス〉を使います」
『こんぼぼっくす？』
「 IDC_CMB_FILE って ID を付けたコントロール。 Ver 5.01 ( No.066 ) 
を見といてね」
『あ、[ファイル]の右隣のだね。コンボって、チキンとフライドポテトとか
が一緒のセットをコンボとかゆーよね』
「それと同じ。コンボボックスは、エディットボックスとリストボックスが
組み合わさってるんです。 Spy++ 起動してからテスト実行してみて」
『はんこみたいなボタン！』
「普通に Spy++ の照準を重ねると ComboBox って出るでしょ」
『うんそーゆーウィンドウクラスだね』
「その内側に照準を持ってくると……」
『 Edit になった！！』
「つまりこの普通に見えるところはエディットボックス」
『おー』
「で、その横の [▼] を押すと出てくるのを〈ドロップダウンリスト〉って
言うんだけど、これがリストボックスで作られてます」
『リストボックス……むむむ、 Spy++ じゃ調べらんないね』
「そうだね」
『……じゃーなんでリストボックスだってわかるの？』
「あー、書いてあるんだよそう。 MSDN の Combo Boxes Overview ってペー
ジを見てみて」
『英語ページね。へー、クラス名は COMBOBOX だとか、 list box と edit 
control の組み合わせだとか書いてあるんだね』
「【次へ】を押してくと、どんどん見られるよ」
『色々細かい解説書いてあるんだね……あ、メッセージっぽいのが出てきた。
コンボボックスのメッセージは CB_ なんだね』
「左上の【同期】ってボタン押してみて」
『目次見るボタンだね。結構深いところにあるページだね』
「上の方に Platform SDK ってあるでしょ」
『うんある』
「ここ以下に書いてあるのが、ウィンドウズそのものの仕様」
『仕様……って、これ文章かなり多くない？』
「多いよー。コンボボックスだけでも５０ページ以上あるみたいだし」
『５０ページ以上！？　あ、そーか、メッセージとか API の分も入れてね。
でも解説もかなり分量あるね。はっ、もしかして』
「そう、他のコントロールも同じくらいあるから」
『すごい量……』
「この Platform SDK には重要なことが書いてあること多いから、まめに見
るようにね」
『それって最初に言うべきことじゃない？』
「いや、ある程度勉強しとかないと見ても理解できないから」
『う〜。質問！　ぷらっとふぉーむえすでぃーけーってどーゆーいみ？』
「プラットフォームっていうのは OS のこと」
『つまりウィンドウズ？』
「そゆこと。 SDK は Software Development Kit の略。つまりソフトを作
るためのもののこと」
『ソフトを作るためのもの？』
「つまり API のこと」
『ああ！』
「 API はウィンドウズアプリを作るためのキットってことだね。ま、基本
的には SDK と API は同じに考えていいかな」
『違うことってある？』
「 API ってゆーと関数のこと指すことが多いかな。だから、前回使った
MAX_PATH みたいな整数値は API とは呼ばないことが多いみたいだけど」
『これは SDK のものってことなのね。ってことは SDK の中に API が入っ
てるってことなのかな』
「そういう考え方もできるかな。と、話がそれちゃったね」
『コンボボックスだよね。よーするにエディットボックスとリストボックス
がくっついてコンボボックスになってるんだね』
「そゆこと。ま、その辺が混乱の元なんだけどね」
『どゆこと？』
「それは……そうだね、メンバ変数作ってみれば分かるかな。リストボック
スの時みたいに、 IDC_CMB_FILE を操作するメンバ変数を作りましょう」
『リストボックスの m_cDataLstBox みたいなのってことね』
「まず ClassWizard ダイアログを表示させて【クラス名】が CFileTestDlg
になってるのを確認してから【コントロール ID 】の IDC_CMB_FILE をダブ
ルクリック」
『【メンバ変数の追加】ダイアログが出たよ。【変数のタイプ】が CString
なんだね』
「コンボボックスはエディットボックスとしても機能するから、その部分を
CString とくっつける方法も採れるんだけど、今回はパス。【カテゴリ】を
〈コントロール〉にして」
『【変数のタイプ】が CComboBox になった！』
「こっちなら CComboBox クラスを使ってコンボボックスを操作できるから」
『 CString の方だとそういう操作ができない？』
「そゆこと。計算機作ったときにやったでしょ、 UpdateData( FALSE ) を
呼ぶと、メンバ変数の値がコントロールに書き込まれるってやつ」
『やった！　そっか、エディットの部分を CString 型のメンバ変数と結び
付けて、書き込み読み込みができるようにすることができるんだね』
「詳しくは Ver 3.11 ( No.036 ) 参照。でも、コンボボックスはリストボッ
クスとしての操作も必要でしょ」
『そっちは CComboBox 型のメンバ変数でってことになるんだ。ってことは
ふたつメンバ変数を作るってこと？』
「それもできるんだけどね」
『「ね」って？　あんましない方がいいってこと？』
「まーね。コンボボックスを操作するメンバ変数がふたつもあったら混乱の
元だからね」
『……なんか煮え切らない言い方ね』
「でもふたつ作っちゃった方が楽って場合もあるからね。今回は CComboBox 
だけにするけど」
『ま、確かに混乱の元ってのは分からなくもないけどね。えーっと、メンバ
変数の名前は m_cFileCmbBox でいい？』
「うんＯＫ」
『んじゃ【カテゴリ】をコントロール、【変数のタイプ】を CComboBox に
して OK っと。ほいメンバ変数できたよ』
「さて、じゃあこのコンボボックスに文字列を表示しましょう。 CComboBox 
のリファレンス見て」
『メンバ関数一覧〜。…………ねー、エディットボックスのとこにどーたら
って感じのメンバ関数がみつかんないんだけど』
「そう、ないんです」
『えええっ！！』
「なんでねぇ、さっきの CString 使うっててもあるってことだね」
『うー、じゃー面倒な方法必要なんだ』
「あ、別にそういうわけじゃないんだけどね。えーっと、さっき見た MSDN 
の Combo Boxes Overview のページ開いて」
『ほい』
「【次へ】ボタンを何度も押して Edit Control Selection Fields って
ページを表示させて読んでみて」
『ほい出た。えーっとなになに……あ、 WM_SETTEXT ってある！　これって
ウィンドウのタイトルとか、ボタンの文字列変えるときに使うのだよね』
「そうそう。これを見れば分かるとおり、コンボボックスにこのメッセージ
を直接送れば、エディットボックスに送られて、エディットボックスの文字
列を書き換えることができるんです」
『思い出した！　 WM_SETTEXT って SetWindowText() と同じなんだよね。
ってことはこの API 使えばいいんだ！』
「 API じゃなくても大丈夫でしょ」
『え？　えーっと、 SetWindowText() は…… CWnd のメンバ関数にもなっ
てるね。そっか、コントロールのクラスは CWnd から継承してるから！』
「そういうこと！　 CComboBox は CWnd のメンバ関数も使えるんです。と
いうわけで、前回の CFileTestDlg::OnBtnBrowse() の中身をこう書き換え
てみましょう」

void CFileTestDlg::OnBtnBrowse() 
{
    CFileDialog cFileDlg( TRUE );
    char chPath[MAX_PATH];
    GetModuleFileName
        ( AfxGetInstanceHandle(), chPath, MAX_PATH - 1 );
    cFileDlg.m_ofn.lpstrInitialDir = chPath;

    int iRes
        = cFileDlg.DoModal();
    if( iRes == IDCANCEL )
    {
        return;
    }

    // この下の行だけ書き換え。
    m_cFileCmbBox.SetWindowText( cFileDlg.GetPathName() );
}

『なるほど、 m_cFileCmbBox からそのまま SetWindowText() 呼んじゃえば
いいんだ』
「で、前回使った CFileDialog::GetPathName() と組み合わせれば」
『ビルドして実行！　ファイルダイアログでファイル選んで【開く】っと。
おおっ選んだファイルのフルパスがコンボボックスに！！』
「じゃ、ついでに CFileTestDlg::OnBtnShow() の方も書き換えちゃいましょ
う。 SetWindowText() の逆に文字列を取得するのは」
『 GetWindowText() ！！　 MSDN のリファレンス〜っと、２番目のよく分
かんないから１番目のでいーや。 LPTSTR だから文字配列用意して、サイズ
は……』
「前回やったでしょ、フルパスは最大」
『 MAX_PATH まで！　だから、こんな感じかな？』

void CFileTestDlg::OnBtnShow() 
{
    m_cDataLstBox.ResetContent();

    char chPath[MAX_PATH];
    m_cFileCmbBox.GetWindowText( chPath, MAX_PATH - 1 );
    std::ifstream cIFStrm;    
    cIFStrm.open( chPath );
// 以下そのまま。

『ビルドして実行、【参照】ボタンでファイルダイアログで Data.txt を選
んで開いて、んで【表示】ボタン押して……おおおっ、前みたくリストボッ
クスに表示された！！』
「ここまでできると、なんかちゃんとしたアプリっぽいよね」
『アプリっぽい！！　なんかすご〜い！！』
「ま、ようするにコンボボックスも SetWindowText() とかでエディットの
操作ができるってことだね」
『なんだ、やっぱし CString は要らないんだね』
「でももし１人でやってとしたら、こーゆーことわかったと思う？」
『思わない。 CComboBox のメンバ変数から SetWindowText() を呼ぶって発
想出てこないし、そこまでたどり着かせるのも大変だし』
「だから CString の方法があるってことかも。 MFC は元々簡単にこういう
ことができるようにしてくれてるからね」
『確かにねー』

/*
    Preview Next Story!
*/
『コンボボックスひとつでも奥が深いのねぇ』
「作ってみる側から考えればそれも当然だよ」
『げ！　作る！？』
「そりゃコンボボックスだってプログラムとして作れるわけだから」
『そりゃそうだけど』
「操作ひとつひとつが、どういう仕様にするべきか熟考されてるんだから」
『というわけで次回』
＜ Version 5.32 コンボボックスのリストに追加！ ＞
「につづく！」
『……ホントに熟考されてると思う？』
「う”」


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

・３月表紙登場！
　バレンタインがあったんでたった半月で新しい表紙です。今回は……電ノ
コ持ってそう（爆）。


/*    ２００１年３月４日５日６日（日・月・火）はお留守にします    */

　家族旅行ってヤツで３月４日５日６日（日・月・火）はホームページの更
新をお休みします。
　新表紙や辞書の更新は３月３日（土）に、 KAB-studio.h の配信は３月４
日（日）に行います。
　鏑矢の憂鬱はお休みします。チョー普通な日記もお休み、だけど臨時板に
は書き込むのでそちらを見てね。


/*                          ご注意！！                            */

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


