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

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

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

/*              重要なお知らせ（それなりに重要）                  */

　「まぐまぐ」で１２月から始まる新サービス「まぐクリック」の登録を、
何を血迷ったか先走ってしてしまいました（汗）。
　その結果、１２月から、まぐまぐ経由で配信されたものには広告が挿入さ
れることになります。また、１１月くらいにはテスト用のダミー広告が挿入
されるそうです。
　というわけで、これからのまぐまぐ経由のものは少し見栄えが悪くなるか
もしれません。御了承ください。

　何が重要って、広告を挿入することで、広告主さんから（まぐクリックを
通して）作者である僕の方にお金が入ってくることになるんで、もしかした
ら営利主義に走るかもしんない（爆）。
　その結果、読者の皆さんにご迷惑をおかけするかもしれないということを
お断りするとともに、あらかじめ謝っておきます。ごめんなさい。
　具体的には、Pubzine 経由での配信を取りやめにして、まぐまぐに移行し
てもらうとか……。もちろんまだ本決まりではないので慌てなくても大丈夫
です。
　ま、見返りがある分がんばるかいがあるってものなので、さらなるパワー
アップを期待してくれるとうれしいです。

まぐクリック
http://www.magclick.com/


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

『じゃ、次のお便り』
「あ、今日は来てる……」

　こんばんは。
　サンデープログラマ（？）のFractと申します。
　結構面白く読ませてもらってます。
　最近jpegファイル読み込んでそこの輝度情報を調べるプログラムを作りた
いなと試行錯誤しているのですが、なんかメモリーリークって起こられるん
ですよ。ちゃんとDeleateObject（）してるつもりなんだけど怒られてしまっ
て悩んでます。メモリーリークの原因を調べるよい方法を紹介してください。
　あとjpegとかTiffとかの展開なんかは素人は触らんほうがよいのでしょうか？
あちこちからDLLとか出てますけどその使い方とかもやっていただけると私は
非常に助かります^^;。
　がんばってくださいね。
　ではでは

『ねーねー、めもりーりーくって？』
「メモリリークって言うのはねぇ……変数、あるでしょ」
『うん、iBox とかのことだよね』
「その変数を〈自由に作って自由に削除〉する方法があるんだけど、このと
きに、作ったんだけど削除し忘れちゃうことが〈メモリリーク〉」
『ってことはまだ先の話ってことねー』
「ま、そういうこと。ホントは、メモリリークは〈診断機能〉が働いてない
と見つかりません。ってことは、なんの診断機能が働いたのか調べてみて、
そこから進んでけばいいかな」
『なんか難しそう……』
「あ、あと、この投稿欄は一応質問を受け付けてないから、画像ファイルの
話とかはメールか日記の方で送ってください。そっちの方で解説します」
『あのおばちゃんのページお休み中だもんね』
「お、おば……」
『私たちは KAB-studio.h や #pragma twice についてのご意見ご希望ご感想
を切望しています！！』
http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/Impression/
「のページで送ってください」
『お待ちしてまーす！』


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

・表紙を１１月バージョンに。
　毎月恒例、新しい表紙です。１０月のが祝１０万ヒットと兼ねてた関係で
ちょっと久しぶりですが、その時間の長さに反比例する出来になってしまい
ました（泣）。完成しただけでも奇跡ってことで許してねん。

表紙：
http://www2.justnet.ne.jp/~kabstudio/

・イラストをふたつ追加。
　CG Galleryにイラストをふたつ追加しました。もちろんひとつは表紙です。
　もうひとつは「かおるうの心の部屋祝１０００ヒット摩耶っち」です。ふ
たつめのギフトイラストってことですねー。実は１１月表紙よりもいい出来
なんじゃないかとすら思ってます（爆）。

CG Gallery：
http://www2.justnet.ne.jp/~kabstudio/CG/Gallery/
かおるうの心の部屋：
http://www.fsinet.or.jp/~kaoruu/


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

１９９９年１０月２４日（日）：
　実験レポートをばばばと作成。ってゆーかホントに今年は勤勉だ。うん。

１９９９年１０月２５日（月）：
　コロコロエルサ購入、その恥ずかしい体験記を赤裸々に公開＜って今時こ
んな手通じんか。

１９９９年１０月２６日（火）：
　昔読んだ「ドラえもん」に「エイプリルフールのウソは、期待させといて
裏切るのよりも、驚かせといて安心させる方がいい」って書いてあった。誰
かそれ、寝てるわてに言って。ほんと。

１９９９年１０月２７日（水）：
　モモとタッチおじさんの政権論争。そんなことが語られる日記です。

１９９９年１０月２８日（木）：
　このメールマガジンに広告載っけてお金もらおうとゆーはなし。実はすで
にもう……。

１９９９年１０月２９日（金）：
　実験半分終了〜。疲れたっすー、エクセルサーガっすー、システムイメー
ジリストっすー。

１９９９年１０月３０日（土）：
　摩耶っち完成！　久しぶりのわてっぽいイラストでいい感じかも。そして
「最大化ボタン」や「メニューの右端の右向き三角」がどーやって描かれて
るかの秘密が今暴かれる！


/*                       #pragma twice                            */

　Version 3.5
ウィンドウハンドルとＡＰＩ


「この前は〈ウィンドウハンドル〉ってものについて見てみました」
『ウィンドウの出席番号よねー』
「今回はこれをもっと突き詰めて見てみるね。この前使った……」

void CCalcDlg::OnBEqual() 
{
    SetWindowText( "あいうえお" );
}

『あ、これこの前使った〈ウィンドウタイトルを変える関数〉だね』
「Ver 3.2（ No.27 ）の時に使ったね。まずはこの CWnd::SetWindowText()
のＡＰＩ版を使ってみましょう」
『ＡＰＩ版、ねぇ。えっと、とりあえずＭＳＤＮだよね』
　SetWindowText() をダブルクリック、Ｆ１キーが押される。ＭＳＤＮが開
き、ダイアログが表示される。
『ＡＰＩのだから、【プラットフォームＳＤＫ】ってのなんだよね』
「そうそう、ＡＰＩ＝ＳＤＫで大丈夫でしょ」
　【SetWindowText() プラットフォームＳＤＫ】をダブルクリックすると、
SetWindowText についての情報が表示される。

（以下、ＭＳＤＮからの引用）

BOOL SetWindowText(
  HWND hWnd, // handle to window or control
  LPCTSTR lpString // address of string
);

（引用、ここまで））
 
『あ、この前使ったのと引数が違う……あ、もしかして！』
「もしかして？」
『この１番目の HWND ってのが、ウィンドウハンドルなんじゃない？』
「そう！　この第１引数に渡すのがウィンドウハンドル。で、 HWND が、
ウィンドウのハンドルの型」
『えっちうぃんど？』
「う”、僕はそう発音してるけど……」
『私、番号って言うから int 型だと思ってた』
「そしたらウィンドウもアイコンも全部同じになっちゃうでしょ」
『あ、そっか』
「ウィンドウを操作するためのハンドルが、ウィンドウハンドル、HWND な
のです」
『これ、わざわざウィンドウハンドル渡さなきゃなんないの？』
「ＡＰＩのを使う時には〈タイトルを変えるウィンドウ〉を指定しなきゃい
けないからね」
『ＭＦＣの時にはいいの？』
「これは今度見るけど、 CWnd は中にウィンドウハンドルを持ってて、自動
的に渡してくれるから省略できるわけ」
『そっか、そういうのが便利ってことなんだ』
「ま、そうなるかな。さて、実際にこのＡＰＩを使ってみましょう」
『げ、なんか難しそう……』
「全然難しくないよ。まず第１引数は空欄にしておいて、その他のとこを
ＡＰＩのに書き換えてみて」
『んっと……ＡＰＩの時には最初に :: を付けるんだから……』

void CCalcDlg::OnBEqual() 
{
    ::SetWindowText( , "あいうえお" );
}

『かな？』
「そうそう。で、あとはなんか適当にウィンドウハンドルを渡せればいいわ
けだ。そうだね…… SetWindowText() を呼び出す前に、HWND 型の変数を作っ
てみて」
『はーい』

void CCalcDlg::OnBEqual() 
{
    HWND windowhandle;
    ::SetWindowText( , "あいうえお" );
}

『変数名、よく分かんなかったから適当付けちゃったけど……』
「僕はこんなふうにしてるかな」

    HWND hWnd;

「最初の h がハンドルって意味、その次の Wnd がウィンドウって意味」
『ってただ大文字小文字変えただけじゃない』
「そうとも言う。さて次に、この前使った Spy++ を起動して」
『あ、それでウィンドウハンドルを見るんだ。【ツール】−【Spy++】っと』
　Spy++ が起動し、ウィンドウ一覧が表示される。
「こんなかからＭＳＤＮを探してみて」
『はーい……って、もしかしてＭＳＤＮのタイトル変えるってゆーの！？』
「そ、こういうのも簡単にできるってことでね」

00000758 "MSDN ライブラリ Visual Studio 6.0" HH Parent

「ウィンドウハンドルは実行するたびに変わるから、注意してください」
『で、この最初の 00000758 っての入れればいいんだよね』
「っと、ちょっと待って。これにはちょっとコツがあって、こんなふうにし
ないとダメなんだよね」

    hWnd = reinterpret_cast< HWND >( 0x00000758 );

『？？　なんかチンプンカンプン……』
「まず【 0x 】から」
『そのあとのはウィンドウハンドルだよね』
「そう。ウィンドウハンドルは１６進数で書かれてるって言ったよね」
『うん、言ってた。ってことは……』
「１６進数で書かれた数字の前に【 0x 】を付けると、１０進数に自動的に
変換します」
『変数の中じゃ１０進数なんだもんね』
「そ。ま、１６進数の前には 0x でいいかな」
『じゃあ reinterpret_cast< HWND >() は？　HWND って型なんだから、な
んか変数作ってるの？　でもなんか関数っぽいし、これ』
「関数って考えた方がいいかな」

reinterpret_cast< 変換先の型 >( 変換する値 )

「って感じで呼び出すと、【変換先の型】に変換してくれます」
『変換？　なんでそんなことする必要あるの？』
「ほら、今回の最初の方で言ったでしょ、 int 型をハンドルにしたら、ウィ
ンドウのかアイコンのか分かんないって」
『あ』
「HWND は【ウィンドウハンドル】だから、普通の数字とは区別されてるわ
け」
『確かに全然区別なく使えちゃったらやばそうよねー』
「その区別を取っ払うために reinterpret_cast<>() ってものを使うわけ」
『確かに、面倒だけどこの方が安全そうねー』
「というわけでまとめれば、１６進数の数字をまず 0x で１０進数に変換し
て、さらに〈普通の数字〉から reinterpret_cast<>() で〈ウィンドウハン
ドルの数字〉に変換して、最後に HWND 型の変数 hWnd に入れてる、ってこ
とになるかな」
『２度変換するってことね』
「で、まとめると……」

void CCalcDlg::OnBEqual() 
{
    HWND hWnd;
    hWnd = reinterpret_cast< HWND >( 0x00000758 );
    ::SetWindowText( hWnd, "あいうえお" );
}

『あ、SetWindowText() に hWnd を渡してる』
「こうやって、操作するウィンドウを指定するわけだね。で……」
『ビルドして実行……』
　ＭＳＤＮのウィンドウタイトルが「あいうえお」に変わる。
『あははははは！！　ホントに変わったぁ！』
「こんなふうに、ＡＰＩ経由だとどんなウィンドウでも操作できる、ってこ
だね」
『なーんか面白い！　こーゆーことできるんだ』
「んじゃ真面目に戻って、Calc ダイアログのタイトルを変えるの、同じよ
うにＡＰＩでしてみて」
『えっと、Spy++ で……ってその前に実行しないと……って、ビルドすると
きには一度終了しなきゃいけないんだから、そしたらウィンドウハンドル変
わっちゃうわけで……結論、無理！』
「なんでやねん！　Calc ダイアログのウィンドウハンドル、この前見方教
えたでしょ！」
『あ、そういえば Calc ダイアログのウィンドウハンドル、表示したよね。
このとき使ったのは…… GetSafeHwnd() だ！』
「そう、CWnd::GetSafeHwnd() は、操作対象のウィンドウハンドルを返すメ
ンバ関数。つまりここで使えば CCalcDlg が持ってるウィンドウのハンドル
が返ってくるってわけだね」
『えっと、確認確認』
　ＭＳＤＮの【キーワード欄】に GetSafeHwnd と書き込み、下の欄から選び
ダブルクリックする。右側の欄に情報が表示される。

HWND GetSafeHwnd( ) const;

『ホントだ、戻り値が HWND になってる！』
「これを使えばいいんだから？」
『さっきのプログラムを書き換えると……』

void CCalcDlg::OnBEqual() 
{
    HWND hWnd;
    hWnd = reinterpret_cast< HWND >( GetSafeHwnd() );
    ::SetWindowText( hWnd, "あいうえお" );
}

『こう？』
「いや、CWnd::GetSafeHwnd() は直接 HWND を返すんだから、変換する必要
はないでしょ？」
『あ、そっか』

void CCalcDlg::OnBEqual() 
{
    HWND hWnd;
    hWnd = GetSafeHwnd();
    ::SetWindowText( hWnd, "あいうえお" );
}

『ま、そう考えると hWnd 変数とかもいらないんだろうけどねー』
「最初は複数行に分けて書いたほうが分かりやすいと思うよ？」
『かもねー。ビルドして実行、うん、この前と同じ結果！』



/*
    Preview Next Story!
*/
『それにしても、ウィンドウタイトルってこんな簡単に変えられるんだ』
「火美ちゃんのウィンドウを〈ぱっつんあたま〉に変えてあげましょう」
『げ！　じゃ、じゃあ水希ちゃんのを〈むっつりすけべ〉に』
「人にウィンドウタイトルはありません」
『ふ、不覚！！』
「というわけで次回」
＜ Version 3.6 アイコンのハンドル ＞
『につづく！！』
「あれ、ファイルがコピーできない……」
『……』
「なにい、いつの間にかファイルがごみ箱にぃ！？」
『……（にやり）』



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

・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/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!!                      */


