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

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

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

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

・Codian に iostream を追加
　Codian に STL & iostream 入門から iostream の #16 - #17 を掲載。今
回は iostream の仕組みです！
[ Codian ]
http://www.kab-studio.com/Programing/Codian/
 

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

2001/01/14 (Sun)
　アニメ見たりテレビ見たり。それよりなにより、久々の顔写真。この写真
を使ってわてを拝め！(死)

2001/01/15 (Mon)
　ゼミに行ったら休みだった(泣)。パソコンでビデオ録画計画。 CD-R に焼
くと色々メリットがあるのですよ。

2001/01/16 (Tue)
　「自分がいいと思うもの」って結構難しいかも。特に創作系だとね。ま、
自分の信じる道を進むしかないんだけどね。

2001/01/17 (Wed)
　ザウルス欲しいなー。が、今はケチケチモード。ビデオテープ１０本
パックも買わないし。そして謎の IT ……は謎のまま。

2001/01/18 (Thu)
　卒論ちょっと書いてからゼミへ。ビックカメラ立川店は、１月下旬にでき
るらしいってもうすぐやん(汗)。あといろんなことができる理由。わて的に
は簡単だと思うんだけど……。

2001/01/19 (Fri)
　卒論が終わらない！　思った以上に量書けないし、書いた内容も、これで
いいのかとても不安。卒論って難しいねぇ。

2001/01/20 (Sat)
　引き続き卒論書き。ううっ、思った以上に進まない〜。あと、 i-mode と
か PDA とか用のページ作ろうと思うんだけど、なんか今のコンテンツの中
で「これを PDA 向けにして」とかゆーのある？　あったら教えてねん。


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

2001/01/14 (Sun)
お便り
メッセージで文字列を送る方法は？
エディットボックスのウィンドウハンドルを調べて
WM_SETTEXT を SendMessage() 
送る側と受け取る側が別々のプロセスだとメモリが独立してる
一番基本的な方法は「ファイルマッピング」
同期処理をする必要あり
おまけ１： WPARAM と LPARAM で８文字送信
おまけ２：エディットボックスを用意して WM_SETTEXT 

2001/01/15 (Mon)
お便り
「前ページ」は「全ページ」では？
その通り
誤字脱字の指摘大歓迎

2001/01/16 (Tue)
お便り
モーダルダイアログみたいに下のウィンドウを操作できなくするには？
EnableWindow() 

2001/01/17 (Wed)
お便り
CHttpConnection で CGI にデータを POST するには？
MSDN の "インターネット実用編 : WinInet" を元に
サンプルコード
Knowledge Base Article ID: Q165298 の 
"HOWTO: Simulate a Form POST Request Using WinInet" 

2001/01/18 (Thu)
お便り
実メモリを特定のプロセスに割り当てるには？
仮想メモリなので不可能
他のアプリを終了させるしか
リソースなら数の制限は取り払えない
スタックサイズは【プロジェクトの設定】で変更できる
お便り
昨日のは Knowledge Base で解決できた

2001/01/19 (Fri)
お休み

2001/01/20 (Sat)
お休み


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

・追加単語：
Active Directory cc DirectSound HTML ODL RGB SMP VTBL X ファイル 
アーリーバインディング アクセストークン エージェント指向 
シンボリックデバッグ デュアルインターフェイス フィールド 
レイトバインディング 

・今週の状況：
　今回は単語数多いです。全単語数も一気に７０９に！　多いねぇ。あ、で
も卒論でちょっと大変なんで、すこーし数が減ってくれると助かるかも(汗)。


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

テンプレート
#11 クラステンプレート

　これまでは、関数の引数をテンプレート引数にする方法を紹介してきまし
た。今回からはクラスのメンバ変数をテンプレート引数にする方法を紹介し
ます。
　まず、クラステンプレートの例を見てみましょう。

template< class type_Mem1 >
class CClassTemplate
{
public:
    type_Mem1 m_1;
};

　テンプレートの部分は、関数テンプレートとほとんど同じ。まずクラスの
前に template って付けて、 < > でテンプレート引数を宣言します。あと
は、普通のクラスと同じ。違うところは、メンバ変数の型をテンプレート引
数に置き換えている部分だけ。
　次に、使い方。

void Use_CClassTemplate()
{
    CClassTemplate< int > cClsTmplInt;
    cClsTmplInt.m_1 = 100;
    printf( "%d\n", cClsTmplInt.m_1 );
    // 100
}

　クラステンプレートは、必ずそのあとに「テンプレート引数に置き換える
型」を指定します。関数テンプレートのように自動的に設定されることはあ
りません。必ず明示する必要があります。
　テンプレート引数を明示することで、テンプレート引数の部分はその明示
した型にそのまま置き換えられます。つまり、上の例だと type_Mem1 は 
int に置き換えられるってこと。この時点でインスタンス化されます。
　あとは「置き換えたクラス」として使えばいいわけ。関数テンプレートは
呼び出すたびにテンプレート引数の指定が関係してくるけど、クラステンプ
レートだと、その型の変数は寿命が来ない限り使えるっていう違いがあるか
な。次回はインスタンス化について。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『卒論、大変そうだね』
「大変そうだね……」
『あたし達が手伝えることってないかな』
「何もしない……」
『まさに！』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.26
コントロールをゲットしよう！

「コントロール編もいよいよ大詰め！」
『いつの間にそんなシリーズが？　ってゆーかもう２６回……』
「あと１０回は続くかも」
『げげ』
「さて、前回は新しくボタンを作ってみました」
『そーそー』
「今回は、逆にすでにあるコントロールを操作してみましょう」
『？　だって、 m_cDataLstBox みたいにクラスウィザード使えば』
「じゃあ使わない場合」
『……できんの？　そんなこと』
「もちろん。前も言ったけど、得体のしれないものも」
『ちゃんとプログラムで実現できる！　そりゃアプリもプログラムだからそ
うなんだろうけど……』
「じゃ、試してみようか」

// いつものメンバ関数。
void CFileTestDlg::OnBtnShow() 
{
    CListBox *pcListBox
        = (CListBox *)GetDlgItem( IDC_LST_DATA );
    pcListBox->AddString( "あいうえお" );
    return;
//  あとは取っておきましょう。

『ん？　なんか複雑だけど、でも AddString() って使ったのだよね』
「そう、リストボックスに追加するメンバ関数。じゃ、最初から見ていきま
しょう」
『最初はポインタ作ってるね』
「そう、 CListBox のポインタ。このポインタで受け取ってるのは？」
『 GetDlgItem() の戻り値。 API のかな、 MFC のメンバ関数かな』
「こういう類の関数は、 API だとたいがい最初にウィンドウハンドルを渡
すから」
『そういえば前回の ShowWindow() もそうだね。ってことは MFC のメンバ
関数なんだ。 MSDN …… CWnd::GetDlgItem() ね。 CDialog のじゃないん
だ』
「基本的には、ダイアログじゃなくてもコントロールは貼り付けられるから
ね」
『で、引数は……リストボックスの ID だね。戻り値は、そのコントロール
の CWnd ポインタなんだ』
「えーっと、コントロールは全部ウィンドウだって言ったよね」
『うん聞いた』
「じゃ、そのページの下の方の【階層図】っていうの見て」
『ほいクリック。なんか大きな画像が出てきた……でもちょっと見にくい
ね』
「印刷したのがパッケージに入ってるから普通はそっち見ればいいんだけど」
『あたし見れないもん……』
「で、中段左端に」
『 CWnd あるね』
「この図は継承関係を表してて、下のクラスは上のクラスから派生してる
っていうのを示してます」
『そっか、これ見れば CDialog が CWnd から継承してるって分かるんだね』
「で、下段中央に」
『コントロール、 CButton とか CListBox とか。つまりこういうのも全部 
CWnd から継承してるんだ』
「まとめるね。コントロールはウィンドウの一種」
『だからコントロールのクラスは CWnd から派生してるんだ』
「そうすれば CWnd の機能はそのまま使えるからね。コントロールもウィン
ドウだからウィンドウハンドルを持ってて、それを CWnd が管理するから」
『だから CDialog::GetDlgItem() の戻り値の CWnd * を CListBox * にキャ
ストしちゃっていいんだ』
「……よくない」
『へ？』
「ま、 MSDN に〈していい〉って書いてあるし、してるサンプルコードが多
いから大丈夫なんだろうけど、ホントはこれはしちゃダメ」
『そうなの？』
「そう。さっきの図で、 CWnd の下に CListBox があるでしょ」
『うん、そりゃ CWnd から CListBox が派生されてるんだから』
「この、上のクラスのポインタから、下のクラスのポインタに無理矢理キャ
ストすることを〈ダウンキャスト〉って言って、ホントはしない方がいい
キャストなんです」
『しちゃいけない？』
「継承してるってことは、 CListBox は CWnd に色々新しいのを付け加えて
あるってことでしょ」
『そりゃ、 AddString() は CWnd にないもんね』
「ってことは、 CWnd を CListBox に無理矢理キャストしちゃうと、 CWnd 
の〈足りない状態〉で、 CListBox の操作をするから……」
『……それってかなりやばくない？』
「ま、このコントロール関係のクラスは、そういう問題が起きないように作
られてるみたいだから大丈夫なんだろうけど、ホントはこういうのはしない
方がいいかな」
『そうなんだ……でも、じゃーどうするの？』
「この辺は、〈クラス〉の仕組みそのものが複雑で、それを MFC が無理矢
理使ってるから問題になってるから」
『あ、 API でやればいいんだ！』
「そういうこと。でも API の方が面倒なんで、まずは API と MFC の両方
を使ってしてみましょう」

// いつものメンバ関数。
void CFileTestDlg::OnBtnShow() 
{
    CButton cShowBtn;
    cShowBtn.Attach
        ( ::GetDlgItem( GetSafeHwnd(), IDC_BTN_SHOW ) );
    cShowBtn.SetWindowText( "あいうえお" );
    cShowBtn.Detach();
    return;
//  あとは取っておきましょう。

『あ、 CListBox が CButton になった』
「いやね、今回の方法はもうクラスウィザードで変数と結び付けられちゃっ
てるコントロールには使えないんで、代わりに〈表示〉ボタンで」
『 m_cDataLstBox みたいになってるとダメってこと？』
「そういうこと。 MFC がそうなってるかどうか監視してて、なってるとエ
ラーになっちゃうんだよね」
『キビシー』
「だから、クラスウィザードで結びつけてないボタンを例にします。逆に言
うと、 m_cDataLstBox を関連させないようにしちゃえば CListBox でもで
きるから」
『そういうもんなのね。で、２行目の Attach() って初見。 MSDN 見ると、 
CWnd のメンバ関数だね』
「何度も言うけど、コントロールもウィンドウ」
『うん、何度も聞いた』
「 CWnd の中にはウィンドウハンドルを格納してるわけだけど」
『 CWnd::GetSafeHwnd() で取り出せるヤツね』
「そのウィンドウハンドルを CWnd に格納させるのが CWnd::Attach() 」
『？』
「前回見たとおり、ボタンを作るには CButton::Create() を呼ばなきゃい
けなかったでしょ。ってことは、 CButton の変数を作ったときには、ボタ
ンそのものは存在しないわけ」
『うん、あ、だから cShowBtn の中のウィンドウハンドルは空なんだ！』
「そゆこと。だから、そこに Attach() でコントロールのウィンドウハンド
ルを格納させるわけ」
『そのコントロールのウィンドウハンドルは、 API の GetDlgItem() で拾
えるんだね。これって、ホントに MFC のにウィンドウハンドル付け加えた
のだね』
「でしょう、 API はたいがい、最初にウィンドウハンドルとかを渡すから」
『で、 SetWindowText() って呼んでる』
「 CWnd::SetWindowText() は、ホントはウィンドウのタイトルを変えるた
めのメンバ関数。たとえば……」

// いつものメンバ関数。
void CFileTestDlg::OnBtnShow() 
{
    SetWindowText( "かきくけこ" );
    return;
//  あとは取っておきましょう。

『うお、ダイアログのタイトルバーが〈かきくけこ〉になった！』
「だけど、ボタンの場合にはボタンの名前が変わります」
『あ、〈あいうえお〉になってる。へー気付かなかった……なんかちょっと
複雑。あ！』
「そう、前回ちょっとしたでしょ」
『ボタンだとその文字、ウィンドウだとタイトル、ね。同じものね〜』
「ウィンドウズの仕様だからしょうがないんだけどね。で、最後に 
CWnd::Detach() を呼ぶんだけど、これがちょっとクセモノかな」
『ってゆーか、なんのために呼んでるの？』
「じゃ、これ呼ばないで試してみて」
『ほい……あ、なんかダイアログ出てエラーになった！』
「こっから少し複雑になるから注意してね。まず、 std::ifstream を思い
出して」
『いきなりだね。ファイルからデータを取り出すクラスだよね』
「 fopen() も思い出して」
『 API の、ファイルを開くのだよね』
「 fopen() で開いたファイルは」
『 fclose() で閉じなきゃいけないんだよね。でも std::ifstream の方は
なんにもしないで勝手に閉じてくれるんだよね』
「そう。クラスには〈デストラクタ〉って言って、変数がなくなるときに自
動的に呼ばれる関数があるんです」
『そんなかで fclose() してくれるんだよね』
「そういうこと。で、この〈デストラクタの後処理〉は、 CWnd にも付いて
ます」
『 CWnd はファイルと関係ないじゃん』
「ファイルハンドルの代わりに？」
『ウィンドウハンドルを持ってる……ってことは、 CWnd のデストラクタは
ウィンドウハンドルを閉じちゃう？』
「そう、それはすなわち〈ウィンドウを削除しちゃう〉ってこと」
『えええっ！？　それってまずいじゃない。あ！　だから CWnd::Detach() 
を呼ぶの？』
「そういうこと！　CWnd はデストラクタで、自分が持ってるウィンドウを
削除します。でも、今回みたいに〈ずっと表示されてるウィンドウをちょっ
と操作するために CWnd に Attach() する〉場合には」
『削除されちゃったら困る！！』
「だから、削除されないように CWnd::Detach() を呼びます。このメンバ関
数は CWnd が持ってるウィンドウハンドルを NULL に置き換えてくれるから、
削除されません」
『自動でしてくれるのが、仇になっちゃうんだ』
「っていうか、このデストラクタの機能が役立つ場面ってほとんどないか
な……」
『質問！』
「はい火美ちゃん」
『最初の CListBox * のときは、こーゆーこと全然考えなくていーの？』
「そう、ポインタだからね。もしポインタがなくなるときにデストラクタが
呼ばれちゃったら、ポインタの数だけデストラクタが呼ばれちゃうでしょ？」
『そっか、ポインタは本体指し示してるだけなんだもんね』
「そういうこと。デストラクタは本体が消える時の１度だけ呼ばれればいい
から」
『じゃ、そのダウンキャストだっけ、それ以外は MFC 使った方がメリット
多いってことになるの？』
「そういうことになるね。ポインタが返ってきてそれを操作するようになっ
てるのも、こういう煩わしさから解放する意味があるのかも」
『あ、でも、もしかしたら全部 API でやると面倒じゃないとか？』
「そんなことはないんだよねー」
『げげ』
「というわけで次回に続く！」

/*
    Preview Next Story!
*/
『最近ちょっと難しくない？』
「それは言えるね。 C++ の細かいこととか教えてるし」
『ウィンドウズのこともねー。なんか〈仕様〉ってやな感じ』
「そういうのに振り回され続けるのがこの仕事……」
『というわけで次回』
＜ Version 5.27 メッセージを送ろう！ ＞
「につづく！」
『ま、慣れちゃえば問題なし！』
「それはどうかと思うけど……」


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

・KAB-studio.h 縮刷版更新
　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!!                      */


