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

    (C)KAB-studio 1999 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp

    送信日： 1999/11/08(Mon) No.031
    配信数： 3080（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


/*                        今週の「どう？」                        */

『じゃ、次のお便り』
「お、２週連続！」

わかりません！！
なんせ私、これまでヘッダーファイルって何かわかってませんでしたから。
でも、これからも頑張って下さいねー、私も過去ログ見ながら勉強しますから〜。

『ヘッダーって、確か……俺を使えー！！　ってヤツだよね』
「ってえーかげんその憶え方は……。えっと、ヘッダーファイルについては
Ver 2.12（ No.22 ）に書かれてるからぜひ読んでくださいね」
『ってことは今度の更新のに含まれるってことだね』
「そう！　これについては下の【縮刷版更新】について見てください。あ、
あと」
『あと？』
「ＶＣの【編集】−【ファイルから検索】で、複数のファイルから単語を見
つけ出すことができるから、これも合わせて使うと便利かな」
『こんな機能もあるんだね。でもさ、〈ヘッダーファイル〉で検索すると全
号ヒットしちゃうよ？』
「う”、最初にでかでかと書いてるからだ……」
『水希ちゃん、そういうときは〈いっしょに【#pragma twice のみ】もダウ
ンロードしてね〉って言わなきゃ』
「うーん……」
『私たちは KAB-studio.h や #pragma twice についてのご意見ご希望ご感想
を切望しています！！』
http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/Impression/
「のページで送ってください」
『お待ちしてまーす！』


/*              １９９９年１１月８日（月）の更新                  */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・KAB-studio.h 縮刷版更新。
　KAB-studio.hの縮刷版、つまりこれまでの配信分を圧縮ファイルとしてま
とめたものを更新しました。今回は１号〜３０号までです。今回も
「KAB-studio.h（#pragma twice 含む）」と「#pragma twice のみ」の両方
をダウンロードできるようにしました。読み損ねた方はぜひこの機会に。
　ちなみにダウンロードはフリーウェアインフォメーションルームにて。

フリーウェアインフォメーションルーム：
http://www2.justnet.ne.jp/~kabstudio/Freeware/


/*                        チョー普通な日記                        */
http://www2.justnet.ne.jp/~kabstudio/nikki2/

１９９９年１０月３１日（日）：
　ヴェルディ川崎について似非地元人が語る（爆）。ってゆーかこんな長く
居座るつもりはなかったんだが……。

１９９９年１１月１日（月）：
　ちょっとプログラミングしたり、ベクターさんのダウンロード数とか。眠
いねぇ。

１９９９年１１月２日（火）：
　祝１１万ヒット（汗）。そして WACOM から新タブレットと登場！　廉価
版だけどコストパフォーマンス高し！　とゆーわけで買うかも。

１９９９年１１月３日（水）：
　勤勉な彼は猫に恋い焦がれる毎日らしいにゃー。

１９９９年１１月４日（木）：
　毎週楽しみの日本伝統武術論。いきなりツッコミｘ３。そして……偶然
って怖い。

１９９９年１１月５日（金）：
　実験でへろへろ〜。この日から２週間で一気に実験レポートを仕上げる予
定なんで忙しいんです、はい。更新少なくてゴメンね（泣）。

１９９９年１１月６日（土）：
　古書市に行ってきておいしいラーメンを食べたり。ん？


/*                       #pragma twice                            */

　Version 3.6
アイコンのハンドル


「さて今回は、ダイアログのアイコンを変えてみましょう」
『タイトルの次はアイコンねー』
「んでもアイコンを変えるだけだと簡単すぎるんで、今回はＡＰＩやＭＦＣ
を使う上でのいろんな注意をしてきます」
『ふーん、なんかめんどそー』
「でもこーゆーのが役立つんだよ？」
『まぁそうかもねー』
「じゃ、まずこれから」

void CCalcDlg::OnBEqual() 
{
    HICON hIcon;
    hIcon = ::LoadIcon( reinterpret_cast< HINSTANCE >( 0 )
                        , MAKEINTRESOURCE( IDI_QUESTION ) );
    SetIcon( hIcon, FALSE );
}

『ビルドして実行。あ、ダイアログのアイコンがはてなマークになった！』
「こんなふうに、アイコンも簡単に変えられるから」
『でもこのはてなマーク、どっかで見たような……』
「 MessageBox() を使ったときに見たでしょ、Ver 2.11（ No.22 ）で」
『そうそう！　MessageBox() に MB_ICONQUESTION ってゆーの渡したら、は
てなマークが出たんだよね。……ってことは』
「ん？」
『もしかして IDI_QUESTION を変えれば、他のアイコンになるってこと？』
「それはあとのお楽しみ。とりあえず関数の中身見ていこうか」
『はーい。でもなんかよく分かんないけど』
「そう？」
『んっとねー……あ、HICON って、アイコンハンドルってこと！？』
「そ。別に難しくないでしょ」
『ってゆーか安直』
「まぁそうかも……」
『えっと、 HICON 型の変数 hIcon を作ってるんだよね、１行目。 ２行目
は……？　:: がついてるからＡＰＩだとは思うけど』
「はい分からなくなったら？」
『ＭＳＤＮ！　LoadIcon をダブルクリック、Ｆ１っと、:: が付いてるから
プラットフォームＳＤＫ……ん？？　相変わらず分かりにくい文章〜』
「ま、それはいつものこと。このＡＰＩは〈アイコンを取得する関数〉。な
んかのアイコンを使いたいときに、このＡＰＩを呼び出します」
『HINSTANCE ってなに？　一応ハンドルみたいだけど』
「これは〈インスタンスハンドル〉。インスタンス＝アプリケーションって
考えていいかな」
『つまりアプリのハンドルってこと？』
「そういうことだね。この LoadIcon() は特定のアプリからもアイコンを取
得できるんだけど、今回はウィンドウズシステムから取得します」
『はてなマークアイコンがウィンドウズのものってことね』
「で、特定のアプリを指定しないって言う意味でゼロを渡すわけ」
『〈先生の出席番号〉って感じ？』
「そんな感じ」
『その次の行は』
「っと、セミコロンで区切ってないから、まだ LoadIcon() の引数が続いて
るんだよ？」
『あ、そっか。じゃー２番目の引数、は、はてなマークをってことでしょ？』
「そう。今見た LoadIcon() のリファレンスの下の方を見てみて」
『あ、IDI_APPLICATION とか色々あるんだねー』
「これを変えればびっくりマークのアイコンとかも付けられるよ」
『あと……まけいんとれそう……って？』
「〈メーク・イント・リソース〉ね。これはただの変換。 LoadIcon() のリ
ファレンスを見るとそんなこと書いてあるでしょ」
『まーそんな感じのこと書いてあるねー』
「ちなみにこれはただの変換だから、 reinterpret_cast<>() を使うことも
できます」

                    , reinterpret_cast< LPTSTR >( IDI_QUESTION ) );

『こっちの方が良くない？　新しいこと憶えなくていいし』
「LPTSTR って何か分かる？」
『う”……』
「ま、どっちも同じってことでいいかな。それにホントは、どっちも要らな
かったり……」
『何か言った？』
「イヤなんでもないです。で次の行は？」
『４行目よねー、 SetIcon() はやっぱアイコンをセットするの？』
「そういうこと。 CWnd::SetIcon() は、第１引数に渡されたアイコンハン
ドルをウィンドウにセットします」
『これも CWnd のメンバ関数なんだ。ホント、CWnd のっていっぱい……と
ころで２番目の FALSE って？』
「ＭＳＤＮを見ましょう」
『ケチぃ。んっと、３２ドットアイコンなら TRUE 、１６ドットなら FALSE、
だって。でも１６ドットとかって？』
「アイコンの大きさ。３２ドットだったら、横３２ドット、高さ３２ドット
のアイコンってことだね」
『大と小ね』
「試しにこれ、TRUE に変えてみたら？」
『んっと、TRUE に書き換えて、ビルド、実行。……なんも変わんないよ？』
「そう、ウィンドウ左上のアイコンは、小さいアイコンしか使わないから、
ここのを変えたいときには FALSE を渡さなきゃダメってことだね」
『……って、じゃあ３２ドットのってどこで使うの？　大きいアイコンなん
て、どこでも使ってないんじゃない？』
「ではＡＬＴキーを押しながらＴＡＢキーを押してみましょう」
『ん？　なんか機能あったっけ……あ！』
　横長のダイアログが表示され、そこに大きいアイコンがならんでいる。そ
のうちのひとつに〈吹き出しにはてなマーク〉のアイコンがある。
『これってタスクマネージャってヤツだよね。そっかー、ここで大きいアイ
コンを使うんだー』
「そういうこと」
『……もしかして、ここだけ？』
「ここだけ」
『変なのー』
「変なのって言えば、 CWnd::SetIcon() みたいに〈TRUE で大、 FALSE で
小〉みたいなのは悪い例だからね」
『そりゃそうよねー、ぱっと見で全然判んないもの』
「というわけで真似しないようにね。さて、ここまでをまとめてみると？」
『まず HICON 型の変数、 hIcon を作って』
「うん」
『次にＡＰＩの LoadIcon() で、ウィンドウズからはてなマークのアイコン
のハンドルをもらって、hIcon に入れて』
「うんうん」
『最後にＭＦＣの CWnd::SetIcon() でアイコンをダイアログにセット！』
「そういうこと」
『そういえば、LoadIcon() のＭＦＣ版ってないの？』
「あるけど……」

    hIcon = AfxGetApp()->LoadStandardIcon( IDI_QUESTION );

『うお！　なんかむつかしい……』
「ちなみに CWnd::SetIcon() をＡＰＩですると……」

    ::SendMessage( GetSafeHwnd(), WM_SETICON
            , ICON_SMALL, (LPARAM)hIcon );

『きゃー！　さらに判んない〜！！』
「というわけで今はＡＰＩとＭＦＣを組み合わせてみたけど、ホントは統一
した方がミスしづらいからいいんだけどね」
『解るようになるまでちょっと我慢ってことねー』
「さて、今度は自分で作ったアイコンを表示してみましょう」
『それしたい！』
「まずワークスペースを開いて、そしたら下のタブから【ResourceView】を
選んで」
『ワークスペースってファイル開いたりクラス見たりしたときのよね。その
中のりそーすびゅーっと』
　【Calc リソース】を元にツリーが表示されている。
「ツリーの中から【Icon】を選んで、右クリックメニューから【Icon の挿
入】を選んで」
『挿入？』
「ってゆーか新規作成ってとこだね」
『んじゃアイコンを作っちゃおう！』
　【Icon】の下に【IDI_ICON1】が加わり、メインウィンドウに緑色の四角
が表示される。
『これ好きに描いちゃっていい！？』
「まぁ、今は他に教えることあるから簡単にね」
『またぁ！？』
「ってゆーかそーゆーことは他の時間にしましょー。別にわざわざこの時に
する必要はないんだから」
『そうだけどさー』
「じゃーさっさと終わらせて、それ描いたら次のようにプログラムを書き換
えてね」
『鬼〜悪魔〜人でなし〜』
「人じゃないのは火美ちゃんでしょうが」
『う”』

void CCalcDlg::OnBEqual() 
{
    HICON hIcon;
    hIcon = ::LoadIcon( AfxGetInstanceHandle()
                    , MAKEINTRESOURCE( IDI_ICON1 ) );
    SetIcon( hIcon, FALSE );
}

『ま、とりあえずビルドして実行っと。あ！　ダイアログのアイコンがさっ
き描いたのになった！』
「さっきはウィンドウズシステムからアイコンを取得したけど、今度は今の
アプリから取得したわけだね」
『そのための AfxGetInstanceHandle() ってこと？』
「そう。さっきはゼロを渡したところに、今度は AfxGetInstanceHandle() 
の戻り値を返してます」
『つまりこの戻り値が、今実行したアプリの……えっと、インスタンス、ハ
ンドル、ってことなのね』
「そういうこと。ちなみにこの関数はＭＦＣの関数だから」
『CWnd のメンバ関数？』
「ううん、::LoadIcon() とかと同じ、どのクラスにも属さない関数」
『へー、ＭＦＣにもそういうのがあるんだ』
「ま、要するにこの関数を呼び出せば、関数を呼びだしてるプログラムを実
行してるアプリのハンドルが取得できるってことだね」
『……なんかこんがらがりそう。で、それを LoadIcon() に渡して、アプリ
からアイコンってことね』
「さて、これをもっと簡単に書くと、こうなります」

void CCalcDlg::OnBEqual() 
{
    HICON hIcon;
    hIcon = AfxGetApp()->LoadIcon( IDI_ICON1 );
    SetIcon( hIcon, FALSE );
}

『あ、これさっき見たのに似てる！』
「そう、これがＭＦＣを使った方法」
『なんかよくわかんない〜』
「でも、余分なのなくてすっきりしてるでしょ」
『確かに』
「LoadIcon() のリファレンスって、ＡＰＩのの他にあったでしょ」
『そういえば……』
　LoadIcon をダブルクリックしてＦ１キーを押す。【該当するトピック】
ダイアログが表示される。
『あ、 CWinApp::LoadIcon() ってある！』
「上の例はこれを呼んでるってことだね」
『ふーん……』
「よく分かってないでしょー」
『もちろん！』
「じゃあ思い出してみて、今の Calc プロジェクトにあるクラスは？」
『今使ってる CCalcDlg と、あと CCalcApp っての』
「CCalcApp はなんてクラスから派生してた？」
『…… CWinApp クラスだ！』
「 CCalcDlg がウィンドウハンドルを管理しているのと同じで、 CCalcApp
はインスタンスハンドルを管理してます」
『それぞれ CDialog と CWinApp から派生してるわけよね』
「というわけで、 CCalcDlg のメンバ関数を呼ぶと、ＡＰＩを呼ぶときに渡
したウィンドウハンドルを省略できる、代わりに渡してくれる、ってことが
CCalcApp にもあてはまるってこと」
『 CWinApp::LoadIcon() を呼び出せば、ＡＰＩの LoadIcon() を呼び出し
たときに渡すインスタンスハンドルを代わりに渡してくれるってこと、かな』
「で、CCalcDlg のメンバ関数を呼び出すときに必要なのが AfxGetApp()->
って感じに憶えてもらえればいいかな」
『ってことは、やっぱ色々奥深いんだ』
「そういうことだねー」



/*
    Preview Next Story!
*/
『今日はむつかしかったなー』
「……全部ＭＦＣが悪いんだ……」
『え？』
「ＭＦＣがもっと普通でシンプルだったら、こんな苦労しなくても……」
『というわけで次回』
＜ Version 3.7 ハンドルとメンバ変数 ＞
「につづく！！」
『……私プログラマーなるのやめよっかなー』
「じゃー何になる？」
『カリスマ美容師！！』
「みーはー」
『むっ』


/*            １９９９年１１月１５日（月）の更新予定              */

・更新なし。
　懐かしい響きだなー（爆）。もしかしたら来週や再来週にはなーんかでき
るかもしんない。できなければ１２月中旬まで待ってねってことで（汗）。



/*                          ご注意！！                            */

・このメールを返信しないでください。
・感想はこのページから送ってください。
http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/Impression/
・購読登録を解除したいときにはこのページで行なってください。
＊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://www2.justnet.ne.jp/~kabstudio/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

    (C)KAB-studio 1999 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp
*/


/*                      See you next week!!                      */


