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

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

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

/*              年末年始のお知らせ                                */
　KAB-studio.hの年内最終発行日（つまり次号）は１２月２４日になります。
年始最初の発行日は１月８日になります。
　 STL & iostream 入門の年内最終発行日は１２月２７日になります。年始
最初の発行日は１月１０日になります。
　ホームページの更新は滞りなく行われます。日記に年始の挨拶に来てくれ
るとうれしいっ！


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

・メニューバー取っ払い計画始動
　これまで目次として機能していたメニューバー（ホームページの上部にあ
るフレーム）を取り払いました。ブラウザや Java スクリプトの設定で使え
ない方も多いようなので。
　このためかぶスタ内全ページを若干改装します。改装完了予定は１月中旬。
それまでの間、お見苦しい部分があるかもしれませんが御了承の程を。
[ チョー普通な日記２０００年１２月９日 ]
http://www.kab-studio.com/nikki2/n12_12a.html#20001209


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

2000/12/10 (Sun)
　久しぶりに高校の時の友人達と食べたりボーリングしたり。なんか合って
るんですよね、リズムが。なんか謎。そして、オフミはたぶんしない(汗)。

2000/12/11 (Mon)
　急遽 CGI の組み直し！　xbm から GIF への変換をぱぱーっと。さらに
CD-R の焼き込みに手間取ったり、ボーリングとボウリングの違いとかなん
か大変ね。

2000/12/12 (Tue)
　のんびりして２５万ヒット。そしてハートが大問題！！　多大なる論議を
巻き起こしたハート騒動がここに！

2000/12/13 (Wed)
　立川に行って本屋まわり。コミックスや原画集を買ったり、あと卒論用の
本を探したり。そしてさらに盛り上がるハート問題！　でも決着がつくよう
な問題じゃないな(汗)。

2000/12/14 (Thu)
　買ってしまった、ドリームキャスト版ギルティギアゼクス！！　って、本
体持ってないのに（汗）。本体＋VM＋ジョイスティックで３万弱、買えるの
はいつの日か……。

2000/12/15 (Fri)
　トレーニング始めました。イラスト描きました。全角倍角は古いです(汗)。

2000/12/16 (Sat)
　サイト内検索密かにスタート。今年もやります「今年を振り返る」の１月
前半・後半。そして今晩はデ・ジ・キャラット〜！


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


2000/12/10 (Sun)
お便り
ATL/WTL のメーリングリスト
http://www.freeml.com/ml_view.php?ml=wtl&pg=1

2000/12/11 (Mon)
圧縮の逆、ファイルサイズを大きくするアルゴリズムはないのか
コピー防止に役立ちそう
お便り
メッセージボックスを表示させたくない場合には？
メッセージボックスダイアログのウィンドウクラス名は #32770 
システムフックとして CBT フックをセット
WM_CLOSE 送れば閉じるか
お便り
「新規作成」のメニューの作り方は？
IShellFolder::GetUIObjectOf() から IContextMenu じゃ無理かも
C:\WINDOWS\ShellNew フォルダにあるファイル
レジストリの HKEY_CLASSES_ROOT 拡張子の中に ShellNew があるもの

2000/12/12 (Tue)
Perl の話
NN6 は xbm を表示できない
xbm 画像フォーマットは C 言語形式の構造体
GIF はフォーマットを直接操作するのは面倒
Codian のものを Perl に移植
binmode して foreach( <hFile> ) { print; } するだけ
C でできることを Perl でどうすればいいのかが問題
@OneData = split( //, $CountData ); で１文字ずつ分解

2000/12/13 (Wed)
お休み

2000/12/14 (Thu)
プログラミング辞書書き
インスタンスハンドルが 0x00400000 の意味
ベースアドレスが表示される
やっぱり VC は難しい

2000/12/15 (Fri)
ぷらとわ書き
Spy++ について

2000/12/16 (Sat)
ほめかぶ作り
雰囲気は旧 VB 風
ツールバーのボタンでダイアログを表示／非表示
ツールバーのボタンを「押しっぱなし」にするには TB_CHECKBUTTON
WTL に CToolBarCtrl クラスがある
ツールバーのウィンドウハンドル
CMainFrame::OnCreate() の CreateSimpleToolBarCtrl() を呼び出しで
ATL/WTL はウィンドウハンドルとかの関係がちょっと複雑


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

・追加単語：
0x DirectInput ベースアドレス ワードアライメント

・今週の状況：
　今回はたった４単語です(汗)。送られてきた数も少ないし、その中でも
「ありますよー」が多かったし。ま、こういう週もあるよね。


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

テンプレート
#07 テンプレート引数の他の型とのオーバーロード

　前回は、テンプレート引数の数でオーバーロードできるってことを紹介し
ました。今回は「違う型」でのオーバーロードについて紹介します。
　「テンプレートなんだから、型の違いでオーバーロードできるわけがない」
って思うかもしれないけど、実はできるんです。たとえばこんなふうに。

template< class type_Normal >
void PointerOverLoad( type_Normal p_ )
{
    printf( "type_Normal: %d\n", p_ );
}

template< class type_Pointer >
void PointerOverLoad( type_Pointer *p_p )
{
    printf( "type_Pointer: %X\n", p_p );
}

　こんなふうに、普通の型と、ポインタ型とでオーバーロードすることがで
きるんです。どっちを呼ぶかは、呼び出すときに渡す引数で決定できます。

    int i = 100;
    PointerOverLoad( i );    // type_Normal: 100
    PointerOverLoad( &i );    // type_Pointer: 64FDF0

　他にも、 const のあるなしとかでもオーバーロードできます。この仕組
みは「クラスだったらメンバ関数を呼びだして、ポインタ型だったら演算子
だけで処理」みたいなことをしたいときに使います。
　……この例も、 VC6 じゃ「あいまいでオーバーロードを解決できない」
ってエラーになっちゃうね。 gcc と bcc ならうまくいくのに。実際、テン
プレート関係は VC6 だと使えない機能多いのよね。
　じゃ、 VC6 でも使える機能。このオーバーロードは、関数テンプレート
かそうじゃない関数か、でもできるんです。

void PointerOverLoad( double p_d )
{
    printf( "double: %f\n", p_d );
}

　っていう普通の関数もあった場合に、

    PointerOverLoad( 1.1 );    // double: 1.100000

　って呼び出せばこの関数が呼び出されます。関数テンプレートの方は優先
順位があとってことね。こういうのをうまく使うことで、特定の型に特化し
た特殊化ができるようになります。来週はインスタンス化についてふたたび。
じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『へー、メニューが表紙に来たんだね。あたし付き！』
「火美ちゃんはともかくとして、これは使いやすいのかな？」
『あたしは使いにくいなー。っつーかメニューバー便利だったしぃ』
「僕は Java スクリプト切ってるから、この方がいいかも」
『水希ちゃんのえっちぃ』
「べっ、別にそういう理由じゃ」
『でもさ、ここまでメニューの多いホームページも珍しいよね』
「ようこそ、サイトマップ、それに表紙のメニューが加わって」
『今度検索機能も付くんでしょ。でも複雑じゃないからいいよね』
「どういうこと？」
『階層が深くないじゃん。見たいページに２、３クリックで行けるでしょ』
「それはそうだね、普通なら【プログラム】で１ページ作るんだろうけど」
『表紙の一番最初にメニュー持ってくるのも、そういうのなのかな』
「火美ちゃんの表紙イラストが下の方になっちゃったけどね」
『でも４つある枠全部にあたしの顔があるのって、なんかいーかも』
「そういえば！」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.22
文字列クラス

「さて、ブラッシュアップ編も最終回です」
『うう、やっと終わり……で、今日は？』
「また蒸し返すことになるけど」

    char chDest[256];

『 while の外に出せばいいんじゃないの？』
「それはそう。それとは別に、ここでは char の配列を使ってるけど、他の
方法を使ってみましょう」
『それってもしかして CString のこと？』
「そう、これまでも何度も使ってるこのクラス」
『 Ver 5.19 ( No.084 ) でも使ったよね』
「まだ踏み込んで中を見ていくほど火美ちゃんもレベル高くないから」
『うー』
「今回はさわりくらいで。まず、文字列の基本は char chDest[256]; って
感じの配列。これは CString でも変わりません」
『変わんないの？』
「変わんないです。 CWnd の中に HWND m_hWnd が入ってたの憶えてる？」
『ウィンドウハンドルだよね。そっか、 CString の中にはその配列が入っ
てるってことなんだ』
「そういうこと。ただーし、この〈普通の配列〉だと、問題があります」
『問題？　あ、サイズ変えられない！！』
「そゆこと。この例だと 256 文字分しか入らないからね」
『でもさ、 char chDest[i]; とかっていうのはダメなんだよね』
「そう、だから別の方法を使います。ファイル使ったときにちょっと触れた
と思うけど、変数を好きなときに作って好きなときに削除する方法が」
『あった！　そうそう、 fopen() して fclose() するみたいな』
「そういう仕組みが C++ 言語には備わってます。それは new と delete 」

    int i;
    char *pchDest = new char[256];    // ここと。
    while( 1 )
    {
        cIFStrm
            >> i;
        if( cIFStrm.eof() )
        {
            break;
        }

        if( cIFStrm.fail() )
        {
            MessageError( IDS_E_NONINT );
            return;
        }
        sprintf( pchDest, "%d", i );
        m_cDataLstBox.AddString( pchDest );
    }
    delete[] pchDest;    // ここ。

『まず作ってるとこがかなり変わったね』

    char *pchDest = new char[256];    // ここと。

『 = の左側はいつもと同じ、単にポインタ作ってるだけだね』
「右の new は、 C++ の演算子のひとつ」
『演算子なの？』
「そ、 sizeof も演算子だったでしょ。それと同じ」
『 Ver 5.07 ( No.072 ) でそんなこと言ってたね』
「 new はその場でいきなり変数を作ることができます。たとえばこの例な
ら char 型の変数を２５６個いっぺんに作っちゃいます」
『それが配列として使えるってこと？』
「そ、作られた変数はメモリ上にずらっと並んでる、ってイメージかな」
『それをポインタで受け取るんだ』
「この例だと分かりにくいから、もひとつ簡単な例を紹介すると」

    int *pi = new int;

『ん、 int 型変数を……１個作ってるの？』
「そう、 [] がなければ１個だけ。で、これもポインタで受け取ってるで
しょ」
『うん受け取ってる』
「思い出して、ファイルポインタも」
『ポインタだ！』
「こういう〈変数の動的生成〉をするときには、メモリ上にその変数の領域
を確保して、そのポインタを受け取ってそれで操作する、って形式が普通」
『なんで？』
「作った変数が〈なくなったとき〉を表せないから」
『？？』
「普通の変数なら、寿命がある限りいつでもどこでも使えるでしょ」
『そだね、勝手になくなんないね。 fclose() でなくしたら、そのあとは使
えないんだった……あ！　そっか、 NULL 入れればいいんだ！』
「そゆこと。ポインタとして持ってて、解放したら、 NULL を入れて〈もう
持ってません〉ってことにできるわけ。 Ver 5.11 ( No.076 ) でやったね」
『そゆときに便利なんだ』
「それに、〈サイズを変える〉場合には同じアドレスになんないことが多い
から」
『どゆこと？』
「１２８サイズの領域を作る、サイズが足りなくなった、２５６サイズの領
域を作ってコピー、１２８サイズの方を削除」
『１２８サイズのアドレスと２５６サイズのアドレスは違うから、ポインタ
の中のアドレスを置き換えることになっちゃうんだ』
「そういうこと。だからポインタ」
『メモリに確保して、それをポインタとして受け取る、んでポインタで操作、
ね』
「使うのはポインタとしてそのまま何気なく使えます」
『うん、使ってるね。特に文字配列はポインタとして使うからほとんど同じ』
「で、最後に解放。これは delete 演算子でします」

    delete[] pchDest;    // ここ。

『 delete のあとの [] は？』
「２個以上確保したら [] 付けるきまりになってるから。だから、１個の」

    int *pi = new int;

「の場合には」

    delete pi;

「でＯＫ」
『なんかちょっとややこしい……けど、はっきし言ってそんな難しくない
よ？』
「たったこれだけならね。たとえば」

    char *pch2 = pchDest;

「ってポインタをコピーして」

    delete pch2;

『２度削除しちゃう！！』
「そゆこと。さらに、他の関数やクラスを超えて使うようになると……」
『つまり、管理が大変ってことなのねー』
「だから CString を使うのです！！」
『うお！』
「自分で管理をするのは大変、だから管理専用クラスに任せちゃう方がい
いってこと」
『なるほどー』
「で、こんな感じになります。最後だから関数全体！」

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

    std::ifstream cIFStrm;
    cIFStrm.open( "Data.txt" );
    if( cIFStrm.fail() )
    {
        MessageError( IDS_E_NOFILE );
        return;
    }

    int i;
    CString cDestStr;
    while( 1 )
    {
        cIFStrm
            >> i;
        if( cIFStrm.eof() )
        {
            break;
        }

        if( cIFStrm.fail() )
        {
            MessageError( IDS_E_NONINT );
            return;
        }
        cDestStr.Format( "%d", i );
        m_cDataLstBox.AddString( cDestStr );
    }
}

『 CString 型の変数 cDestStr 、サイズ決めなくていいの？』
「 CString は自動的にサイズを決めてくれるんです。たとえば」

    cDestStr = "ABC";

「ってしたら４文字分のサイズにしてくれるんです」
『おー！　あと Format() ってメンバ関数は、 sprintf() と同じ機能？』
「そう、 CString には便利なメンバ関数がそろってて、これもそのひとつ」
『リファレンス見るといっぱいあるもんね。 operator = って？』
「 operator っていうのはクラスに演算子を持たせるもの」
『はっ、もしかして std::ifstream で使った << ってこれ？』
「そういうこと。これは = 演算子だから……あ、そう、上の "ABC" 入れて
るのがこの演算子を使った例」
『あ、そーなんだ。ってことは、普通のクラスはこういうことできないって
こと？』
「そゆこと。できるようにするには operator を使わないといけないわけ」
『これはさすがに難しそう……』
「あと……ちょっと CListBox::AddString() のリファレンス見てみて」
『ほい F1 。あ、受け取る型が LPCTSTR なのに CString 渡せてる、って前
にもそういうことあったね』
「そう、で、また CString のメンバ関数一覧を見て、 operator LPCTSTR 
ってあるでしょ」
『うお、なんかいかにもって感じ！』
「これは LPCTSTR 型を求められてもうまく処理できるよう operator で設
定されてるってこと」
『だから CString を渡せるんだ』
「 LPCTSTR を求められたら中の文字列へのポインタを返すようになってる
から、うまくいくわけ」
『ほー』
「ほーって、も少したったら自分でこれくらい書けるようになってもらうか
ら」
『げげ！』

/*
    Preview Next Story!
*/
『とりあえずブラッシュアップ終了！　で、次は？』
「次からはウィンドウについて」
『ウィンドウはもう結構やったと思うんだけど』
「ところがウィンドウズの世界は奥が深いんだよね……」
『というわけで次回』
＜ Version 5.23 ウィンドウクラス ＞
「につづく！」
『ほんっと、教えても教えてもキリがないって感じね』
「そんだけウィンドウズプログラミングが大変って証拠かも」


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

・KAB-studio サイト内検索スタート！
　KAB-studio に含まれる膨大なページからの全文検索サービスをスタート
します！
　実は google のを利用させてもらうだけだけど（汗）。でもこれで必要な
ページを簡単に探し出せるようになるはず。便利ですよ〜。


/*                          ご注意！！                            */

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


