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

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

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

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

・「作者について」を更新
　２６歳の誕生日になったんで作者についてを更新しました。
[ 作者について ]
http://www.kab-studio.com/Info/Kaburaya/index.html


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

・メニューバー取っ払い完了！
　メニューバーの取り払いをほぼ完了しました！　 Codian の「次へ」とか
もちゃんと直しました。でもまだちょっと変なとこありそう……。

・Codian に iostream を追加
　Codian に STL & iostream 入門から iostream の #14 - #15 を掲載。今
回は cout と cin です（おやぁ？）。
[ Codian ]
http://www.kab-studio.com/Programing/Codian/


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

2001/01/07 (Sun)
　雪！　雪っていいなー。あとは小説書いたりゲームしたり。北条時宗もス
タート。わてはこの辺の時代が結構好き。詳しくはないけど(汗)。

2001/01/08 (Mon)
　ビデオテープがどんどんなくなってく……でも普通にビデオ買うよかいい
んで。でも最近のＤＶＤは６話入って５０００円とかだしなぁ。

2001/01/09 (Tue)
　地球少女アルジュナすげえ！！　これは見とくべきでしょう。こんだけの
クオリティのものがテレビで見られる時代になったんだなぁ。

2001/01/10 (Wed)
　マックワールドエキスポの基調講演ストリーミングを見てました。新
パワーブックＧ４は結構よさげでない？　あと「ＯＫです」。

2001/01/11 (Thu)
　目覚まし時計買ったり部屋の片付けしたり、４コママンガ描いたり誕生日
プレゼントにエプロンもらったり、電話代下がったり本に載らなかったり。

2001/01/12 (Fri)
　卒論をげしっと書く。ページ数があまり稼げなくてちょっと不安。 Suica 
いい。就職前研修に「話力研修」登場。定番はこれでしょうやっぱ。

2001/01/13 (Sat)
　ビリヤードしてサンマルク行って２６歳の誕生日（爆）。いつのまーにか
こんなとしー。


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

2001/01/07 (Sun)
お休み

2001/01/08 (Mon)
Perl プログラミング
regex は結構大変
「あるタグに囲まれた文」を現す正規表現
<SCRIPT[^>]*>[^>]*document.write\( document.title \)\;[^<]*<\/SCRIPT>
冗長？
01 を数値化するのには最初の 0 を取ればいいだけ
開発環境は VC 
ツールに設定すると簡単

2001/01/09 (Tue)
assert() 系で「中止」すると ExitProcess() する
デストラクタ呼ばれないからまずい？
例外投げても catch しないとデストラクタ呼ばれないし

2001/01/10 (Wed)
お便り
他の起動してるアプリのウィンドウハンドルを取得するには？
FindWindow() 
ウィンドウ名とウィンドウクラス名で
WindowFromPoint() 
画面の１点から
GetWindow() か EnumWindows() 
ウィンドウを片っ端から
Knowledge Base Article ID: Q33161 "Using the GetWindow() Function"
GetWindowText() と GetClassName() 
ウィンドウハンドルから取得
お便り
エディットボックスへの右詰表示をコードで実現するには？
ダイアログのスタイルに DS_LOCALEDIT をセットしてから
エディットボックスのスタイルに ES_RIGHT や WS_EX_RIGHT 
GetWindowLong() や GetWindowRect() で情報取得
Destroy して新たにエディットボックスを Create 
複数行だとうまくいくかも
Knowledge Base Q108940 "Text Alignment in Single Line Edit Controls" 

2001/01/11 (Thu)
お休み

2001/01/12 (Fri)
ぷらとわ書き
DDX で結び付けたコントロールのハンドルを CWnd::GetDlgItem() 
このハンドルは Attach() できない

2001/01/13 (Sat)
お休み


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

・追加単語：
OEM 強制終了 スタブ 割り込み

・今週の状況：
　た、たった４単語！　ヒット数が減ってるわけでもないし、なんか謎。


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

テンプレート
#10 テンプレートライブラリのメリット

　前回言ったように、テンプレートライブラリはすべてヘッダーファイルで
構成されています。その理由は、すでにコンパイルされていたらテンプレート
として機能しないから。テンプレートを使うときには、テンプレート引数を
他の型に置き換えて、ソースコードを生成して、それをコンパイルする、
っていう「インスタンス化」の手順を踏む必要があるから、すでにコンパイ
ルされててもそれは関数テンプレートとして機能しないわけ。

　だから、もし関数テンプレートをライブラリとして配布するときには、
ソースファイルや中間ファイル、 DLL としては配布できません。配布する
ときにはヘッダーファイルに関数テンプレートを入れて、そのヘッダーファ
イルだけを配布します。

　この配布方法のメリットは結構あります。まずマルチプラットフォーム
っていう点。ライブラリで呼び出す関数やテンプレートの複雑さとかを除け
ば、コンパイラや OS にまったく依存しません。 STL なんかがそう。 SGI 
のサイトでダウンロードできる STL は、多くの OS の多くのコンパイラで
使用できるように設計されてます。同じ OS でも、コンパイラが違うと中間
ファイルやデバッグ用ファイルの形式が違うから使えなかったりするし。
　次に使うのが楽っていう点。インクルードして呼び出すだけだし、コピー
して貼り付けてコンパイル、ってだけでも使えるのもメリットかな。非テン
プレートライブラリの中には、ソースファイルをダウンロードして DLL と
してコンパイルしてから使うっていうのもあるんだけど、それだとコンパイ
ル自体に時間が掛かっちゃうからね。

　メリットかデメリットか判らない部分としては、定義部がそのまま見える
ってことがあるかな。実装が見えることで使う側は理解が進むし、バグが
あったらすぐ直せるし、自分のライブラリに応用することも簡単。でも逆に、
実装寄りの使い方をする危険性があるし、やっちゃいけない改造をしかねな
いし、ばらしたくない部分を隠すことができない、っていう大きな問題も。
　基本的に、テンプレートライブラリはオープンソースの流れに沿ったもの
ってことも言えるかもね。特に、テンプレートライブラリは「プログラムの
パーツ」として機能する物が多いから、みんなでそのパーツを作っていくっ
て雰囲気かも。

　完全なデメリットっていうのはないんじゃないかな。今のところ思い付か
ないけど。でも、人によっては上の「ソースを公開する」って点が大きなデ
メリットかもね。来週はクラステンプレートについて。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『ぱーるって何？』
「 Perl はプログラミング言語のひとつだよ」
『なんか、ホームページにどうとか書いてあるけど』
「 Perl は文字列の検索と置換が簡単にできるからね」
『だからタグの置き換えとか簡単にできるってこと？』
「そういうこと。ちょっと勉強すれば、 VC で作るよりずっと簡単かも」
『 CGI にも使えるって話、多いよね』
「っていうか、 CGI 許してるところは Perl しか使えないのが普通」
『なんで Perl なの？』
「ひとつは、ビルドしなくていいから」
『え、じゃあ .exe とかないってこと？』
「そゆこと。プログラムだけでいいの。あとは、制限が効くとか、色々」
『……あたしも勉強しといた方がいい？』
「いろんな言語を勉強するのは悪くないよ」
『学校で数学や国語も勉強するのと同じね』
「どっかで聞いたフレーズだな……ま、そういうこと」
『じゃ、教えて〜？』
「う、ぷらとわがさらに終わらなくなる！！」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 5.25
ボタンを作ろう！

「さて、前回はコントロールもウィンドウって所まで見ていきました」
『そーそー。 CreateWindow() でボタンが作れるってゆーし』
「では実際に作ってみましょう！」
『ええっ！？』

// いつものメンバ関数。
void CFileTestDlg::OnBtnShow() 
{
    HWND hWnd
        = ::CreateWindow
            ( "BUTTON"
            , "てすと"
            , WS_CHILD | BS_PUSHBUTTON | BS_TEXT
            , 10, 10, 100, 30
            , GetSafeHwnd()
            , (HMENU)1050
            , AfxGetInstanceHandle()
            , NULL );
    ::ShowWindow( hWnd, SW_SHOW );
    return;
//  あとは取っておきましょう。

『ビルドして実行！　うわ、ホントにダイアログにボタンができた！　こん
なふうにしてボタンが作れるなんてなんか感動……』
「他の OS はこういうふうに作ること多いかな。ウィンドウズはダイアログ
エディタで簡単にできるようになってるんだけどね」
『なんかこの関数って呼ぶのめんどそうだし……』
「でも今の火美ちゃんの知識でも全然大丈夫だと思うよ。まず最初の引数」
『これはウィンドウクラス名だね。これが BUTTON だから』
「ボタンが作られたってわけ。ちなみにウィンドウクラス名は大文字小文字
区別しないから。たとえば今作ったボタンを Spy++ で見ると……」
『 Button になってる』
「そういうこと。２番目は〈キャプション〉」
『これはボタンに出る文字だね』
「ちなみに、普通のウィンドウだとタイトルバーの名前になります」
『ん、なんか複雑？』
「３番目はウィンドウスタイル。 WS_CHILD は〈子ウィンドウ〉って意味」
『子ウィンドウ？　あ、 Ver 5.23 ( No.088 ) でやったね』
「ウィンドウには親子関係とかが作られてるから。それはちょっと飛ばして」
『 BS_PUSHBUTTON は CreateWindow() のリファレンスに書いてあるね。ボ
タンのスタイルなんだ』
「押しボタン式で、文字列を表示するってもの。たとえば  BS_PUSHBUTTON 
を BS_CHECKBOX に変えると」
『×ボタンのになった！！　へー、ってことはこれはボタンの一種なんだ』
「そゆこと。こういうの知らないと、別のコントロールだと思っちゃうよね」
『うん、そうだと思ってた』
「第４〜第７引数はボタンの位置とサイズ」
『これで位置決めするのってめんどいよね。ダイアログエディタがあれば簡
単なのに』
「あと、ダイアログの左上からってことに注意」
『あ、ホントだ。画面全体の左上じゃないんだね』
「ウィンドウでこういうのの操作をするときには、その辺に注意した方がい
いかな」
『第８引数は CFileTestDlg::GetSafeHwnd() を呼んでるってことは……ダ
イアログのウィンドウハンドルだね』
「そう、ここではボタンの〈親ウィンドウ〉を指定してます」
『あ、ここでしっかり指定しないといけないんだ。自動だと思ってた』
「 API の世界に自動って言葉はないって思った方がいいかも。ここで親ウィ
ンドウを指定しているから、ボタンの位置がその親ウィンドウの左上からに
なるわけ」
『じゃーこれを他のウィンドウにしたら？』
「そのウィンドウの左上から」
『じゃあそれをリストボックスのにしたら？』
「リストボックスの左上から」
『なんか変……』
「ま、その辺が柔軟だから色々できるんだけどね」
『第９引数はなんか変だね。 HMENU にキャストしてる』
「普通のウィンドウだと、ここにはメニューのハンドルを指定します」
『だから HMENU ね』
「でもコントロールなんかの子ウィンドウの場合には ID を指定します」
『 ID って、あー IDC_BTN_SHOW とかだ！』
「そゆこと。それも整数値だったでしょ」
『そうそう、 resource.h の中で書かれてるんだよね』
「この ID もそれと同じ。ホントは」
『 #define とか const int とかでってゆーんでしょ？』
「そゆこと。第９引数はちょっと難しいけど、〈インスタンスハンドル〉っ
ていうのを渡してます」
『前にやったね、 Ver 3.6 ( No.031 ) とかで』
「これは一応、アプリのハンドルって考えればいいかな。これは 
AfxGetInstanceHandle() で取得できるからそれを渡せばＯＫ」
『第１０引数は NULL だね』
「これは…… MSDN の CWnd::OnCreate() を見てみて」
『ほい見たよ』
「んーと、ちょっと戻って、 OnBtnShow() はボタンが押されたときに呼ば
れるメンバ関数でしょ」
『うんそだよ。 CWnd::OnCreate() もそういうの？』
「そういうの。これはウィンドウが作られる時に呼ばれるメンバ関数。で、
そのとき渡される CREATESTRUCT のページを」
『ほい』
「その第１引数は」
『 LPVOID 型の lpCreateParams ってゆーの』
「実は、これが CreateWindow() の第１０引数そのものなんです」
『ええっ！？　そーいえば同じ LPVOID 型だし……でも CreateWindow() の
リファレンス見るとなんか違くない？　 CREATESTRUCT のポインタを渡すっ
て読めるけど』
「げ！　……あー、これは訳が間違ってるんじゃないかな。 CreateWindow()
の英文リファレンスを見れば」
『 CREATESTRUCT を通して渡される、って読めるね』
「このポインタは、あるクラスへのポインタをこの第１０引数から渡して、 
CWnd::OnCreate() で受け取って初期化に使う、ってふうに使います」
『そっか、そうすればクラスの大きさとか関係なしに送れるんだね』
「この仕組みは API じゃよく使われてるから」
『でも、キャストし間違えたら……』
「 API はそういう部分多いからねぇ、使う時は気を付けないと」
『ここまででウィンドウ作りは終わりね。 ShowWindow() は、まんまウィン
ドウを表示させるのってことでいいの？』
「そう、ま、ホントはこの API はウィンドウを消したり最大化したりもで
きるんだけどね」
『やってみたい！』
「んじゃやってみましょう」

void CFileTestDlg::OnBtnShow() 
{
    ShowWindow( SW_SHOWMAXIMIZED );
    return;
//  あとは取っとく。

『あれ、最初のと引数が違うよ？』
「最初のは API 、これは MFC の CWnd::ShowWindow() メンバ関数」
『そーいえば、 :: が最初に付いてるってことは API だからなんだよね』
「そう。 ShowWindow() も CreateWindow() も同名のメンバ関数が CWnd に
あるからね。逆に、 CWnd のってことを明示するなら」

    CWnd::ShowWindow( SW_SHOWMAXIMIZED );

『そっか、 ::ShowWindow() ってゆーのは〈どのクラスにも属してない〉っ
て意味なんだ！』
「そういうこと。じゃ、ビルドして」
『実行！　うわ、ダイアログが画面いっぱいに！』
「これができるのも、ダイアログが基本的にはフツーのウィンドウだから」
『そーゆーの、結構融通きくんだねー』
「と、話を戻して、普通にウィンドウを表示するなら SW_SHOW を渡せばＯ
Ｋ」
『 MFC で思ったんだけど、 MFC のなんかのクラスでもこーゆーボタン作る
ことできるの？』
「もちろんできるよ。 MFC には CButton っていうクラスがあって、これを
使うとかなり簡単に作れるから」

CButton g_cButton;

void CFileTestDlg::OnBtnShow() 
{
    CRect cRect( 10, 10, 110, 40 );
    g_cButton.Create
        ( "てすと"
        , BS_PUSHBUTTON | BS_TEXT
        , cRect
        , this
        , 1050 );
    g_cButton.ShowWindow( SW_SHOW );
    return;
//  あとは取っておきましょう。

『あ、関数の外に変数がある』
「グローバル変数って言って、他の関数とかからも使える変数」
『 API とかランタイムとかの関数ってそうだよね』
「そう、その変数版。だーけーどー、ホントは使っちゃダメ」
『なんで？』
「いつの間にか書き換えちゃったりする可能性があるから。できるだけ書き
換えられる範囲は狭い方がいいからね」
『それって const ポインタ使うのと同じ考えだよね』
「そういうこと！　 const を使うのと同じように、グローバル変数は使わ
ない方が」
『書き換えられる範囲が狭まるってことね。これが悪い例だとすると、いい
例って？』
「 CFileTestDlg のメンバ変数にすること」
『 m_cDataLstBox なんかとおなじよーに？』
「そう、まさにそう」
『でもメンバ変数って CFileTestDlg のどのメンバ変数からでも使えるんだ
から、五十歩百歩じゃない？』
「う”……それはかなり難しい話になってくるからまた今度」
『あたしもそーゆー話ができるようになったのねー』
「子供の方が核心突くのうまいってゆーし」
『なんかゆった？』
「なんでも」
『……あとふたつ分かんないとこがあるんだけど。まず CRect のとこ』
「 CRect は MFC のクラスで、左上の x と y 、右下の x と y を格納する
クラス。【コンストラクタ】って憶えてる？」
『 Ver 5.17 ( No.082 ) でやったね。変数作るときに呼ぶ関数だよね』
「そう。ここで cRect( 10, 10, 110, 40 ) ってやってる部分は、そのコン
ストラクタを呼び出して、４つのメンバ変数にいっぺんに値を入れてるんで
す」
『そーゆー便利なのがあるのね。あと this って？　色が変わってるから 
C++ 言語のなんかなんだろうけど』
「 this は……今呼ばれてるメンバ関数は？」
『 CFileTestDlg::OnBtnShow() だけど』
「これもメンバ関数なんだから、当然 ????.OnBtnShow(); って感じに呼ば
れてるはずでしょ。その ???? のアドレス、つまり &???? が this」
『？？？？？　どーゆー意味？』
「前にやったでしょ、どんなクラスも、ちゃんと変数として作られてて、そ
のメンバ関数もその変数を通して呼ばれてるんだって」
『うん憶えてるよ。えーっと、 Ver 3.3 ( No.028 ) とかでやったよね、こ
れだと、 FileTest.cpp の CFileTestApp::InitInstance() で作られてる、
CFileTestDlg dlg; の dlg がその変数なんだよね』
「そう、だから基本的には dlg.OnBtnShow() って呼ばれてるってこと」
『うんうん』
「で、その dlg.OnBtnShow() の中で dlg そのものを取得したいときは？」
『そのとき this を使う……アドレスってことは、 this は &dlg になるっ
てことなんだ！』
「そういうこと！」

/*
    Preview Next Story!
*/
『はっきし言って、自分でボタン作れるのって、感動！』
「自分で操作できるのって楽しいからね」
『ホント、この前も言ったけど、色々できてくると楽しい！』
「でも、ある意味今が一番辛いかも……」
『というわけで次回』
＜ Version 5.26 コントロールをゲットしよう！ ＞
「につづく！」
『げ、なんでエラー消えないの？　なんで変なダイアログ出るのぉ！？』
「ほらね」


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

・KAB-studio.h 縮刷版更新
　KAB-studio.h の縮刷版を更新予定。でも卒論で忙しいから延期するか
も(汗)。

・Codian に iostream を追加
　Codian に STL & iostream 入門から iostream の #16 - #18 を掲載。今
回は iostream のカスタマイズです！
[ Codian ]
http://www.kab-studio.com/Programing/Codian/


/*                          ご注意！！                            */

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


