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

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

    送信日： 2000/12/24(Sun) No.088
    配信数： 3840（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/

/*              今回は日曜発行＆年末年始のお知らせ                */
　この号は、２４日（日）に発行しました。理由は２５日から１月４日まで 
Pubzine が休止するためです。その関係で、次の号は１月８日に発行します。
　 STL & iostream 入門の年内最終発行日は１２月２７日になります。年始
最初の発行日は１月１０日になります。
　ホームページの更新は滞りなく行われます。日記に年始の挨拶に来てくれ
るとうれしいっ！
[ チョー普通な日記 ]
http://www.kab-studio.com/nikki2/


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

・KAB-studio サイト内検索スタート！
　KAB-studio に含まれる膨大なページからの全文検索サービスがスタート！
　これで必要なページを一発検索！。
[ KAB-studio サイト内検索 ]
http://www.kab-studio.com/Info/Search/


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

2000/12/17 (Sun)
　デ・ジ・キャラットクリスマススペシャル！　今回もハズレなかったのが
すごい。今年を振り返る・２月前半後半。漫画家になりたーい。

2000/12/18 (Mon)
　ゼミ＆忘年会。

2000/12/19 (Tue)
　ランニング。今年を振り返る・３月前半後半。卒論のアイディアは日記か
ら生まれた！　日記行きにくい〜。

2000/12/20 (Wed)
　国会図書館行ってドリキャス買ってギルティギアゼクス三昧！！　イヤ〜
ン面白い〜。やっぱ対戦格闘最高峰ですか？

2000/12/21 (Thu)
　ギルティギアゼクスを堪能。今年を振り返る・４月前半後半５月前半後半。
彼女いな〜い。わてをゲットするなら今！（たぶん無理）

2000/12/22 (Fri)
　相変わらずギルティギアゼクス。今年を振り返る・６月前半後半７月前半
後半。就職活動中でしかも訃報（泣）。

2000/12/23 (Sat)
　ドリキャスでインターネット。思いの外すごいかもしんない。今年を振り
返る・８月前半後半。この時期は辛かった……。



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


2000/12/17 (Sun)
ほめぱげ作り
ダイアログを「サイズ可変」に
ダイアログコントロールは自動的に移動したりしない
レジストリを ATL の CRegKey で
ATL/WTL 用ライブラリを作るかも

2000/12/18 (Mon)
お休み

2000/12/19 (Tue)
お便り
DC のデータをビットマップトして保存するには？
MSDN の SAVEBMP.C を参考に
サンプルコード
BITMAPINFO とかの構造体を用意してファイルに書き込むだけ
お便り
waveOutWrite() で連続して音声出力するには？
参考になりそうなページへのリンク
ダブルバッファ

2000/12/20 (Wed)
お便り
waveOutWrite() はうまくいった
書き換えタイミングが重要

2000/12/21 (Thu)
お便り
サイズチェックでエラーになる
おとといのサンプルコードが間違っていた
サンプルコード
色数の環境によってエラーが発生したりしなかったりする
コードの書き換えには細心の注意を払うべし
テストは様々な環境で

2000/12/22 (Fri)
半角カタカナの文字化け
お便り
NT だと動くのに Win98 だと動かないのは？
API の実装方法の違いによるもの
サンプルコード
CreateThread() の仕様が違う
グローバル変数じゃなくするとすっきりしそう
お便り
DLL の関数を呼び出すとエラーになる
コード状況
ASSERT が発生している
文字配列が空の場合があるのでそれをチェックすればＯＫ

2000/12/23 (Sat)
お便り
昨日の DLL のエラーは間違い
レジスタチェックで ASSERT
CALLBACK 呼び出し規約なのが問題
サンプルコード
CALLBACK を付けるか付けないか統一すればＯＫ
お便り
スレッドを平行に走らせて読み込みつつ出力
スレッドに渡す変数はクラスメンバにしていい？
大丈夫なはず
同一プロセス内なら、各スレッドでひとつのメモリ領域を共有するから


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

・追加単語：
DML シャットダウン 初期化 スタートメニュー スタートボタン ラップ 
レイテンシ 

・今週の状況：
　今回も少ないなー。ヒット数は高いのに……なんか謎。単語が煮詰まって
来てるのかなー。


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

テンプレート
#08 インスタンス化と機械語コード

　関数テンプレートのインスタンス化について、またしつこく解説すること
にします。ここが、ある意味テンプレートの最も重要な部分だから。

　関数テンプレートは、関数テンプレートを呼び出さない限りプログラムと
してみなされない、これがインスタンス化。呼び出して、テンプレート引数
を特定の型に置き換えて、仮のソースコードを生成、そしてコンパイル。こ
れが関数テンプレートをコンパイルするまでの順序です。
　ここで「仮のソースコード」に注目してみましょう。たとえばこの関数テ
ンプレート。

template< class type_numeral >
type_numeral Increment( type_numeral p_num )
{
    ++p_num;
    return p_num;
}

　この関数テンプレートを、 int 、 double 、char * で呼び出したら、そ
れぞれの型を当てはめた「仮のソースコード」が生成されます。つまり、テ
ンプレート引数に渡した種類だけインスタンス化されるってこと。

　これはとても重要な部分です。呼び出す時の型の種類分だけインスタンス
化されるってことは、その後の機械語コードもその種類分だけ生成されるっ
てこと。だから、呼び出す種類が多いと、実行ファイルのファイルサイズが
どんどん増えていきます。
　ただ、同じ型なら実行ファイル内で重複することはないから。複数のソー
スファイルからひとつの関数テンプレートを呼び出すとき、両方とも int と
して呼び出しているのなら、インスタンス化される仮のコードはひとつ、生
成される機械語コードもひとつ。
　それに、関数テンプレートは呼び出さない限りインスタンス化されないか
ら、必要最小限のサイズで済むっていう利点もあります。コンパイルされて
機械語コードが生成されるのは、インスタンス化された関数テンプレートだ
け。呼ばれていない、インスタンス化されていない関数テンプレートは無視
されるからね。

　こういった理由から、関数テンプレートを使ったときのファイルサイズは、
大きくなる部分もあれば、小さくなる部分もあります。ただ、そういうこと
はあまり考えない方がいいかもね。来週はテンプレートライブラリについて。
じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『あら、次の号は２１世紀なんだ』
「もう２度目の年越しだね」
『ねぇ、マジなとこ、ぷらとわっていつまで続くの？』
「さぁ」
『……てめぇ』
「自分では実感してなかったんだよね、これだけの知識が必要って」
『憶えることホント多いよね』
「でも、教えてることは基礎的なことだけなんだよ」
『とてもそうは見えないけど』
「題材が MFC とかだからね。でも MFC の機能についてとかは」
『教えないよね。代わりに API やランタイムなんかとの関連性とか？』
「火美ちゃんにはそういうのを参考にして、仕組みを理解して欲しいかな」
『仕組み？』
「たとえばファイル操作なら」
『基本はウィンドウズの機能、それを他が使わせてもらってるってのね』
「そういうのが分かれば、たとえば API を使うライブラリを作るとき」
『ランタイムとか真似すればいいんだ！』
「単なる使い方なんて本見れば誰でも分かる！　その奥の見る目が大事」
『それが水希ちゃんの持論ってとこねー。じゃ、気長に教えてねん』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.23
ウィンドウクラス

『ブラッシュアップ編も終わったし、次は？』
「今回からは、ウィンドウとコントロールの話」
『コントロールって、エディットボックスとかのことだよね』
「そう、その辺の話。むかーしちょっとだけ触れたんだけど、エディット
ボックスとかリストボックスとかのコントロールも、全部ウィンドウの一種
なんです」
『ええっ、そうなの？』
「その辺を今回から見ていきます。えっとまず、メニューの【ツール】に
【Spy++】ってあるでしょ」
『前にこれ使いまくったね。えーっと、 Ver 3.4 ( No.029 ) に Ver 3.5 
( No.030 ) 、 Ver 3.13 ( No.038 ) で使ってるね』
「その復習も兼ねて、とりあえず使ってみましょう。 Spy++ のメニューの
【スパイ】−【ウィンドウ検索】を選んで」
『ほい、ダイアログ出たよ』
「照準みたいなのがあるでしょ。それを」
『ドラッグすると、その下のウィンドウに太線が付くんだよね』
「そう、とりあえずエクスプローラーにやってみて」
『ん、でも場所によってなんかキャプションとか全然違うね』
「さっき言ったでしょ、コントロールもウィンドウのひとつだって」
『ってことは、これ全部コントロールなの？』
「そうだよ、ファイル表示してる部分は〈リストビューコントロール〉って
いうコントロール。リソースエディタ使うと」
『ホントだ、ツールバーに〈リストビュー〉ってあるね。これと同じなんだ』
「その辺も後で見てみるからね。照準をタイトルバーに合わせて」
『ほい。あ、キャプションがウィンドウのタイトルと同じになった』
「このウィンドウが、一番上のウィンドウ。他のコントロールはこのウィン
ドウに乗ってる形になってます」
『 OK 押しちゃっていいの？』
「ちょっと待って。ここに書いてある設定についてちょっと解説してから」
『ほい。〈キャプション〉はウィンドウタイトルだよね』
「そう。〈クラス〉は、いわゆるクラスとは全然違うものだから注意」
『 CDialog とかじゃないってことね。じゃーなんなの？』
「このクラスは〈ウィンドウクラス〉って言って、ウィンドウの〈原型の名
前〉なんです」
『原型の名前？』
「次の章ぐらいに、実際に火美ちゃんに一からウィンドウを作ってもらうけ
ど」
『いつになるやら……』
「ウィンドウを作るときには、まずウィンドウの原型をウィンドウズに登録
するんです」
『ほー』
「……とりあえずコード見とこうか」
『へ？　次の章じゃないの？』
「詳しく解説するが次ってことで。今回は見てて」
『ほーい』
「手抜きして CFileTestDlg::OnBtnShow() に書くね」
『いつもの return してそのあとは取っとくってのね』

void CFileTestDlg::OnBtnShow() 
{
    WNDCLASS stWndClass;
    stWndClass.style = CS_BYTEALIGNWINDOW;
    stWndClass.lpfnWndProc = &AfxWndProc;
    stWndClass.cbClsExtra  = 0;
    stWndClass.cbWndExtra  = 0;
    stWndClass.hInstance  = AfxGetInstanceHandle();
    stWndClass.hIcon  = NULL;
    stWndClass.hCursor = NULL;
    stWndClass.hbrBackground  = (HBRUSH)COLOR_BACKGROUND;
    stWndClass.lpszMenuName  = NULL;
    stWndClass.lpszClassName  = "TestWClass";

    AfxRegisterClass( &stWndClass );

「ここまでが、ウィンドウクラスの登録」
『げげ、長い！』
「こういうのは見慣れないときついかもね。だから今回は見るだけ」
『でも次の章でこれやるんだ……』
「色々入れてる部分は、ウィンドウクラスの設定」
『ウィンドウの原型の設定ってことね』
「最後の AfxRegisterClass() で、ウィンドウズにその設定のウィンドウク
ラスを登録します」
『登録したら、ウィンドウを作るの？』
「そ、こんな感じに」

    CRect stRect( 0, 0, 100, 100 );
    CWnd cWnd;
    cWnd.Create
        ( "TestWClass"
        , _T( "てすとですぅ" )
        , WS_OVERLAPPEDWINDOW
        , stRect
        , this
        , 1000 );

    return;
// 以下、前の分を取っときましょう。

『でもビルドしてもウィンドウできないよ？』
「ありゃ、そっか、 CWnd だけじゃダメなんだ、派生クラス作んなきゃいけ
ないんだなー、ま、今回はここまでってことで」
『何それ』
「とりあえず、 CWnd::Create() を呼び出せば、ウィンドウを作れるってこ
とが分かればＯＫ。で、その第１引数と、 stWndClass.lpszClassName で指
定してるのが」
『同じ "TestWClass" だね』
「これが、ウィンドウクラスの名前。最初にウィンドウクラスを登録したと
きに、ウィンドウズにこのウィンドウクラス名で登録されてるから」
『ってことは、 Create() で、そのウィンドウクラスを原型にして作るって
ことで、そのウィンドウクラス名を使ってるんだ』
「そゆこと。ここでウィンドウクラス名を指定すると、同じウィンドウクラ
ス名のウィンドウクラスを原型に、ウィンドウを作ってくれるわけ」
『ほー』
「んじゃこの部分は削除しちゃって、話を元に戻しましょう」
『つまり、エクスプローラーの CabinetWClass ってウィンドウクラス名も、
登録されてるってことなんだ』
「そういうこと。一度登録しちゃえば、そのあといくつウィンドウを作って
も、そのウィンドウクラスを元に作れるから簡単なわけ」
『なるほど』
「次の〈スタイル〉は飛ばして、〈矩形〉について」
『〈くけい〉って読むんだ。これってウィンドウの位置とサイズだよね』
「そ。見りゃ分かるか」
『分かるよん』
「じゃ、戻って〈スタイル〉について。スタイルっていうのは」
『これは知ってるよー、ウィンドウの形とかそういうの決めるのだよね』
「そう、これは整数値形式だけどね。一番下の【表示】を【プロパティ】に
して OK ボタン押して」
『ほい。んで【スタイル】見るの？』
「そ。ここに書かれてるスタイルの設定で、ウィンドウの形状とかが決まり
ます。たとえば WS_OVERLAPPEDWINDOW は〈普通のウィンドウ〉って指定」
『あ、上のウィンドウ作ってるときにも使ってるね』
「こんなふうにウィンドウ作るときにも指定できるし、作ってからも変更で
きたりします。ちなみに、なんでウィンドウスタイルが 16CF0000 みたいな
整数値になってるかわかる？」
『そういえばそうねー。なんで？』
「たとえばさっきの Create() 呼ぶときに、 WS_OVERLAPPEDWINDOW に加え
て WS_VISIBLE を指定したいってときにはどうする？」
『そりゃ | で、そっか！　この整数値は全部のスタイルを | で重ねたもの
なんだね』
「そういうこと。 | はビットごとの和を求めるのだったでしょ」
『で、それぞれ２倍ずつずれてる数字になってるわけだから、それを全部重
ねるとこうなるんだ。なるほどね』
「そういうこと。 16CF0000 って整数値じゃなくて、ビットが並んでるイ
メージの方が分かりやすいかもね」
『計算がちょっとめんどいけど』
「そうそう、こんなふうにいつでもウィンドウスタイルって取得できるんだ
けど、取得したときは 16CF0000 って整数値になってます。そこから各フラ
グを取得する方法って分かる？」
『えーっと、やっぱビットの操作するんだよね。あ、 & を使うんだ！』
「そゆこと。各フラグと、この整数値を & すれば、ビットが１かどうか分
かるからね」
『詳しくは Ver 4.05 ( No.055 ) を参照ねー。他の設定は？　ウィンドウ
っていっぱい設定あるよねー』
「どれもまだちょっと難しいかな。それに、プログラムを組みながらの方が
解りやすいしね」
『どゆこと？』
「今言ったウィンドウスタイルは、 CWnd::GetStyle() で取得できるから」
『へー』
「前も言ったでしょ、たいがいのことはちゃんとプログラムとしてできるん
だって」
『得体の知れないなんかじゃないってことね。 Spy++ もプログラムなんだ
から、 CWnd::GetStyle() 使ってウィンドウスタイル取得してるかも、だね』
「で、これに & でフラグ調べれば、同じようなことができるわけだ」
『おお！』
「それは次回ね。あと他のページもぱぱっと見ておこうか。【ウィンドウ】
見てみて」
『次のウィンドウ、前のウィンドウ、親ウィンドウ、１つ目の子ウィンドウ、
オーナーウィンドウ？』
「ウィンドウは、全部上下関係がはっきりしてて、こういうふうに並んでる
んです」
『こういうふうにって言われても……』
「たとえば、エクスプローラーに乗ってるリストビューコントロール。ああ
いったコントロール関係は、全部子ウィンドウ」
『見てみよっと』
「〈親ウィンドウ〉の右の数字は、親ウィンドウのウィンドウハンドル。ク
リックすると、表示してる情報が親ウィンドウのになるから」
『クリック！　あれ、でもよく分かんないウィンドウになっちゃった』
「もひとつ上みたいだね」
『クリック！　あ、エクスプローラーのになった！』
「逆に、エクスプローラーのウィンドウから、リストビューのウィンドウま
で行く事もできるよ。まず〈１つ目の子ウィンドウ〉を」
『クリック！』
「〈次のウィンドウ〉を３回」
『クリッククリッククリック！　はぁはぁ』
「そしたら〈１つ目の子ウィンドウ〉を」
『クリック！　……これホントにリストビューのなのかな』
「最初にウィンドウハンドルを確認しといた方が良かったね」
『そうね……なんか無駄働き？』
「あと、このリストビューのウィンドウクラス名見てみて」
『 SysListView32 ってなってる』
「これがリストビューの証拠」
『そなの？』
「そなの。その辺を踏まえつつ、次回に続く！」

/*
    Preview Next Story!
*/
「あ、次回は SysListView32 のことやんないわ」
『また伸びちゃったとか？』
「そんなとこ。来週はウィンドウスタイルについて」
『しっかり書くってことは、それなりに大事？』
「大事じゃないとこってないのかも」
『というわけで次回』
＜ Version 5.24 ウィンドウスタイルいろいろ ＞
「につづく！」
『私はともかく、水希ちゃんよくそんだけ憶えられるよね』
「僕って実は天才？」
『その天才をこんなとこで無駄に浪費してていーの？』
「うううっ」


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

・正月休み
　日記以外は更新しない可能性大。プログラマーさんみんな休みなんで。
あ、表紙は新しいかも。
[ チョー普通な日記 ]
http://www.kab-studio.com/nikki2/


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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 - 2000 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/


/*                      See you next week!!                      */


