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

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

    送信日： 2000/09/04(Mon) No.072
    配信数： 3740（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/
{magclick}

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

・更新なし（泣）
　ま、色々あってね……。


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

2000/08/27 (Sun)
　Zip 怪しい（汗）。ドラクエはホイミスライムかわい〜。あとテレビ色々。
そう、この日はまだ、激動の１週間が幕を開けようとしていることを、気付
くはずもなかったのである……。

2000/08/28 (Mon)
　おばあちゃん、死す。

2000/08/29 (Tue)
　おばあちゃんログ。

2000/08/30 (Wed)
　おばあちゃんちで留守番の付き添い。

2000/08/31 (Thu)
　火葬。

2000/08/01 (Fri)
　家でのんびり。

2000/08/02 (Sat)
　通夜。


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

2000/08/27 (Sun)
お休み

2000/08/28 (Mon)
お便り
ナレッジベース
KNOWLEDGE BASE （サポート技術情報）
MSDN とマイクロソフトのホームページ
MFC のソースコード
Visual C++ の CD-ROM
ファイルから検索

2000/08/29 (Tue)
お休み

2000/08/30 (Wed)
お休み

2000/08/31 (Thu)
お便り
隠れたビューのキャプチャリングはできる？
HWND から HDC を取得して BitBlt()
サンプルコード
失敗
上の画像がそのまま送られてくる
お便り
ナレッジベース
MSDN は便利

2000/08/01 (Fri)
お休み

2000/08/02 (Sat)
お便り
ウィンドウのキャプチャ難しい
ここって普通の掲示板と違う
ラジオっぽくいきたい
キャプチャはベクターで公開されてるののなかにあれば
それを解析すればなんとかなるかも


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

・追加単語：
DirectShow 命名規則 __asm インラインアセンブラ リング DDK 
.Com実行ファイル オフセット セグメント WM_ ファームウェア 
クラステンプレート 関数テンプレート １６進数 ２進数 OLAP 
ツリービューコントロール JIS Java ソート OCX グローバルリソース
インターセプト ツリー wchar_t 

・今週のごめんなさい
bitmap vector tree WaitForSingleObject エディットボックス strcmp 
VarFileInfo 配列 ビュジアルベーシック サイズ変更 fread RAS
Documents COM スタティックリンク _variant_t 文字列 VariantChangeType
時間 マルチスレッド databese treeview afxbeginthread パレット 色 変換
プリエンプト リバースエンジニアリング コールバック Cprog ペイン
バイトオーダー バイナリー・ファイル イメージ を内包する INSTANCE
強制 セマフォ ミューテックス winsock socket アセンブラ 
ダイレクトエックス７ WM_SETTEXT リング0プログラム WM_ACTIVATE
文字規制 仮想関数 LIB BitBlit アライメント 動的な関数呼び出し 
UNICODE 画像 デリミタ

・今週の状況：
なんか、ヒット数が増えるに従って、ごめんなさいが増えてきてるなー。
でも「送ったのに載ってない！」ってゆーのもイヤかなとも思うんですよ
ねー。どーしましょ。ちなみに単語数は５００を突破。すげー。


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『再放送ってどーゆーの？』
「１０月４日から、また第１号から配信するの」
『……なんかずっこいね』
　ずっこくてもいいあなたは購読登録。
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


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

　Version 5.07
C ランタイムライブラリ

「では前回の続き」

void ReplaceTo_strlen()
{
    TRACE( "%d\n", strlen( "ABC" ) );
    // 3
}

『この strlen() ってのが、文字列の長さを調べる謎の関数なのね。あ、
strlen って string の length ってこと？』
「そうそう、その略ね。この strlen() を MSDN で調べてみて」
『あ、載ってるんだ。ダブルクリックしてＦ１！』
　【strlen、wcslen、_mbslen、_mbstrlen】というページが表示される。
『うわ、〈文字列の長さを取得します〉だって。べたな関数だわ……。あれ、
戻り値が size_t っていうのになってるよ』
「これは unsigned int と同じ。えっと、それ選択してＦ１押して」
『あ、そーやっても見られるんだ』
　【標準型】というページが表示される。
『うおいっぱい。あ、 size_t あった。あー unsigned int 、 sizeof 演算
子の結果だって。はれ、 sizeof って演算子だったの？　関数だと思ってた』
「まあ、 + とかの演算子とは違うけどね。 C++ 言語そのものには、関数っ
て入ってないから」
『関数がないの？　なんで？』
「プログラミング言語に余計なものは付けない、っていうのが C++ 言語の
基本姿勢、ってところかな。代わりに他が付けてくれればいいから」
『ってことは、他が付けてくれた関数があるんだ』
「そう、たとえばこの strlen() とか」
『あ、これがそれなんだ！』
「えっと、ひとつ前に戻って、 strlen() のページ表示して、その下の方
に【文字列操作ルーチン 】っていうのがあるから」
『そのページを表示っと』
　【文字列操作】というページが表示される。
『うお、またいっぱいなんかある……』
「で、そしたら左上の【同期】ってアイコンを押して」
『アイコン？　あ、【編集】メニューの下にあるのね』
　押すと、左の枠が【目次】に代わり、ツリーが表示される。
【カテゴリ別ランタイム ルーチン】の【文字列操作】が反転表示されてい
る。
『これって本の目次みたいなもん？』
「そう、たとえば【時間管理】っていうのあるでしょ」
『うんある』
　【時間管理】ページが表示される。
「ここに表示されている関数を使うと、時間が取得できたりするから」
『ほー、なるほど』
「こういった、この【カテゴリ別ランタイム ルーチン】にある関数群を
【 C ランタイムライブラリ】って言います」
『しーらんたいむ？』
「あ、あと【標準 C ライブラリ】とか言うこともあるし、【ランタイム】
って略して言うことが一番多いかな」
『ランタイム……』
「〈ランタイム〉っていうのは実行中って意味だけど、これはそう考えると
混乱の元かも。ランタイムのいいところは、いろんな開発環境に入ってるこ
と」
『どゆこと？』
「ウィンドウズだけじゃなくて、マックとかでもアプリを作る必要があるわ
けで、そういうマック向け開発環境とかでも C ランタイムライブラリは使
えるってこと」
『だから標準 C ライブラリ、なわけね』
「そう、でもこれも色々あるライブラリのひとつ。 Ver 2.14 ( No.025 )を
読み返してみて」
『うお、タイトルが【いろんなライブラリ！】だ！　あ、このランタイムと
MFC って同じよーなもんなんだ』
「そういうこと。プログラミングをするってことは、基本的には〈ある機能
を持つ関数やクラスを使うこと、なければ作ること〉なわけ」
『そのいろんな関数が、いろんなライブラリに入ってるんだ』
「ここで重要なのは、どのライブラリにどんな機能があるのか、ってことを
憶えておくこと」
『げ、それって憶えておかないとダメ？』
「駄目。プログラムを組んでるときに〈あ、この機能はあのライブラリのを
使えば〉って思い付く必要があるから」
『あー、思い付かなかったら自分で作るハメになるわけだ、あたしみたいに』
「そういうこと。ちょっと前まで MFC と API の使い方を見てきたのも、ダ
イアログの操作とかは MFC のクラス使えばいいんだ、っていうのを分かっ
てもらうため」
『そーゆーのが MFC の得意分野なんだね。ランタイムの得意分野は？』
「 strlen() みたいな文字列操作とか、時間管理とか、ファイル処理とか。
でも……」
『でも？』
「そういうのって MFC にもあるんだよね」
『じゃ、ランタイム要らないじゃない！』
「それは火美ちゃんが決めること」
『へ？』
「両方ともちゃんと知って、自分で、どっちを使えばいいのか、決める必要
があるってこと」
『な、なんかそれって重荷でなくない？』
「ま、そういうところも教えていくから。さてここで、文字列を受け取る、
ってことを考えてみましょう」
『あ、そう言えば受け取るってしたことないね』
「たとえば、文字列のコピーをするランタイム strcpy() の例で見てみよう
か」

void Use_strcpy()
{
    const char chSourceAry[] = "ABC";
    char chDistAry[256];

    strcpy( chDistAry, chSourceAry );    // ここで使ってます。
    TRACE( "%s\n", chDistAry );
}

『 strcpy() がコピーしてるの？』
「そう、第２引数の文字列から、第１引数の文字配列にね。 MSDN 見れば分
かるけど、第２引数は const char * 、第１引数は char * になってるから」
『なるほど、コピー元は書き換えないから const なんだ』
「さて、ここで注目して欲しいのは、 chDistAry の要素数が２５６ってこと」
『お、２５６という数字に何か意味が』
「ない」
『ないんかい！』
「とりあえず〈ある程度大きな数字〉っていうだけ」
『もし、たとえば要素数１にしたらどうなるの？』
「はみ出る」
『げ、つまりあのメモリ上で考えると、隣に書き込んじゃうってことよね』
「そういうこと。前も言ったけど、配列の要素数を知る術はないから」
『ポインタにしちゃうと sizeof 効かないのよね。じゃーさ、こういうのは
どう？』

void CannotChangeLength()
{
    const char chSourceAry[] = "ABC";
    char chDistAry[ strlen( chSourceAry ) ];    // エラー。
    // error C2057: 定数式が必要です。
}

『ぎゃ、エラー出ちゃった！！　なんでぇ？』
「前に言ったでしょ、配列は、作るときに要素数がしっかり分かってないと
ダメなの」
『あ、前回 const char chAry[] = pch はダメだったもんね。それと同じな
んだ』
「そういうこと。配列を使うと、こんなふうにサイズが固定されちゃうから」
『仕方なくおっきな数字？　なんか不安〜』
「ま、少ししたら教えてあげるけど、 new や CString っていうを使うと問
題ないから」
『あ、どっちも見たことある！　 new は Ver 4.13 ( No.063 ) で見たよ。
あ、変数を新しく作るのなんだ』
「だから、これなら好きなサイズだけメモリを確保できるわけ」
『おお！！』
「 CString は Ver 3.20 ( No.045 ) で文字列リソースから読み込んだりし
たときに使ったよね」
『うん、そうそう。考えてみたら、あれが今使ってる文字配列の代わりに
なってるんだ』
「 CString が文字列関係の中で一番使いやすいと思うから、も少ししたら
ちゃんと使えるように解説することにします」
『はーい』
「というわけで、文字列を受け取るときには？」
『とりあえずの大きさの文字配列を用意する！　だよね』
「そういうこと。付け加えると、文字列のコピーって言っても」

    chDistAry = chSourceAry

「じゃできないから」
『当たり前じゃん、どっちもポインタなんだから。たぶん strcpy() は、要
素ひとつひとつを = で渡してるんじゃないかなー。なんか面倒ね』
「その辺大事。文字列は配列どうしの処理になるから、このコピーだけじゃ
なく、比較とか結合とかそういうのも全部特別な処理が必要になるわけ」
『あ、だからランタイムの【文字列操作】にあんなに関数があったんだ』
「そのページにある strcmp() が文字列比較、つまり〈同じ文字列か〉を調
べる関数で、 strcat() がふたつの文字列をくっつけるもの」
『 strlen() もそうだもんねー。文字列処理にランタイムは欠かせないわけ
だ』
「そのランタイムのひとつ、 sprintf() を使ってみましょう」

void Use_sprintf()
{
    const int iSource = 123;
    char chDistAry[256];

    sprintf( chDistAry, "%d", iSource );    // ここで使用。
    TRACE( "%s\n", chDistAry );
    // 123
}

「これは、整数値を文字列に変換する関数」
『って、それって最初に言ってた目的じゃない！！　なんだ、この sprintf()
ってのを使うとそれが簡単にできるのねー』
「ちなみに変換できるのは、整数値だけじゃないから。どっかで見たことな
い？ %d とか」
『 TRACE() で使ってるのだ……あ、 sprintf() って TRACE() を真似した
んだ！』
「ちが〜う！　 sprintf() が先で、それに合わせて TRACE() がこういう設
計になってるの！」
『なんだ、逆なんだ』
「あーでも、これも正確には違うんだよね。左の目次から【入出力】
−【ストリーム入出力】を開いて、その中の printf()  っていう関数を見
てみて」
『うん』
　【 printf() 】のページが表示される。
「このページの真ん中へんに【書式指定】ってあるでしょ」
『うんある』
「このページに〈 %d は整数値を表示する〉とか書かれてるから。 R.3 て
ページに書いてあるよ」
『あ、ホントだ。 %d の他にもいろんなのあるんだね』
「 printf() は普通に文字列を出力する関数で、たいがいの C 言語の本に
はまず最初に書いてあるもの」
『？　じゃーなんであたしには教えないの？』
「ウィンドウズのアプリは、ほとんどこれ使えないんだよね。他のＯＳなら
使う機会多いんだけど。その代わりに TRACE() 、ってこと」
『ほー、確かにアウトプットは便利だもんねぇ』
「と、話がそれたんでまとめ」
『えっと、ランタイムにはいろんな関数、特に文字列操作の関数がある』
「文字列を受け取るときは、文字配列を使う」
『んで sprintf() を使うと簡単に整数を文字列に変換できる、と』

/*
    Preview Next Story!
*/
『なんかあっけないね、数字を文字列に変換するの』
「確かに関数ひとつだからね。でもベースの知識が大切だから」
『水希ちゃんそればっかり』
「というわけで次回」
＜ Version 5.08 LPCTSTR ＞
『につづく！』
「来週も基本的なことするよー」
『げげ』


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

const メンバ関数
#04 const メンバ関数の整合性

　前回見たように、「 const クラス型変数からは const メンバ関数しか呼
べない」「 const メンバ関数内ではメンバ変数を書き換えられない」だから
「const クラス型変数のメンバ変数は書き換えられない」、ってわけ。
　今度は const クラス型変数の側から考えてみようか。 CForConst が、自
分じゃない誰かが作ったクラスだったとします。これを const で使いたい
場合。

    const CForConst cForConst;

　const にしたからには、 cForConst のメンバ変数は絶対に書き換えられ
ちゃ困るわけ。ところが、

class CForConst
{
    int m_i;
public:
    void SetData( int p_i );
// あとデフォルトコンストラクタとか。
};

　って、たいがいのクラスと同じくメンバ関数の実装部が別ファイルになっ
ていてしかもそのソースがない、っていう場合。もし const メンバ関数の
システムがなかったら、 CForConst を使うコードをコンパイルするとき、
コンパイラは cForConst が書き換えられない、っていうことを補償するこ
とができません。 CForConst::SetData() の中身は見られないから、書き換
えられててもそれを調べる手段がないから。そうなっちゃうと、 const な
んてなんの意味もなくなっちゃうよね。
　そこで、 const メンバ関数のシステムがあるわけ。

class CForConst
{
    int m_i;
public:
    void SetData( int p_i ) const;
// あとデフォルトコンストラクタとか。
};

　const メンバ関数ってことは、このコードをコンパイルしたコンパイラが
「このメンバ関数はメンバ変数を書き換えない」というお墨付きを与えたこ
とになるわけ。だから、この const メンバ関数を呼び出している限りは、
CForConst::m_i の中身が書き換えられないことが補償されます。
　const メンバ関数は、クラスを const 化したい、っていう期待に応える
ためにあります。クラスを const 化したら、メンバ変数も const 、それを
徹底するために、 const メンバ関数内ではメンバ変数が書き換えられない
ようになってるんです。こんな感じに、使う側から考えると分かりやすいか
な。次回は const メンバ関数を使う機会について。じゃね。


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

・プログラミング辞書単語受付休止
　プログラミング辞書の単語受付を１週間だけお休みします。理由は、９月
１２日〜１５日にゼミ合宿があって更新とかが大変になるため。１週間だけ
がまんしてね〜。


/*                          ご注意！！                            */

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


