#pragma twice

KAB-studio > プログラミング > #pragma twice > 029 Version 3.4 ウィンドウとウィンドウハンドル

#pragma twice 029 Version 3.4 ウィンドウとウィンドウハンドル

前のページへ 表紙・目次へ 次のページへ

 Version 3.4
ウィンドウとウィンドウハンドル

これまではクラスについて見てきました
クラスは、型のひとつ。MFCのクラスを継承した新しいクラスを作って、
そのクラスの型の変数を作って、そのメンバ関数を呼び出して、色々するの
そういうことでした。今回はまず〈ハンドル〉っていうものから
ハンドルって、車に付いてて右曲がったりするの?
意味的には同じ。えっと、Ver1.5(No.008)で、ウィンドウとかアイコン
が〈ウィンドウズが管理してるもの〉って言ったよね
そういえばそんなこと言ってたね
ウィンドウやアイコンを作るときには、CreateWindow() とかの、API
に入ってる関数を使います
APIって、ウィンドウズを操作するためのライブラリ、だよね
そうそう。ウィンドウズに、これこれこーゆーウィンドウを作ってくださ
い! ってお願いするわけだね
で、作ってもらったら?
ここからがミソ。作ってもらっても、そのウィンドウやアイコンそのもの
は渡してはくれなくて、間接的に操作するための〈IDナンバー〉を渡され
るだけ
IDナンバー? ってことは数字なんだ
そう、作ったウィンドウやアイコンには数字が割り振られて、操作用のA
PIにその番号を渡すことで〈何を指定するか〉を示すわけ
そこの12番、廊下で立ってなさい! みたいな?
まー、そんな感じ。このIDナンバーこそが
ハンドル!
ってこと。このハンドルがあることで初めて、ウィンドウなんかを操作で
きるってこと
でも〈ハンドル〉って意味と違くない?
ま、〈操作するもの〉って意味かな。それにハンドルには〈名前〉とかっ
て意味もあるし
ハンドルネームとかの?
そんな感じかな。じゃ、まず、ウィンドウのハンドルを見ちゃおうか
ってそんな簡単に見られるもんなの?
見られるんだよね、これが。えっとまず、 Calc を実行して
えっと……ビルドして実行っと、なんかこうしないとよく分かんなくて
うーん、まあいっか。で、実行したらほっといてね
ほっとくの?
そう。次に、VCのメニューの【ツール】−【Spy++】を選んで
すぱいっと……あ、なんかアプリが出た
これは〈Spy++〉って言って、VCに付いてくるツールアプリのひとつ
 Spy++ のウィンドウにはツリーが表示されている。
一番上に〈デスクトップ〉って書いてあるね
これは、ウィンドウの一覧
ダメよ水希ちゃんウソついたら
え?
だって、こんなにウィンドウ開いてないもん、今だってさっきの Calc と
かVCとかしか開いてないし
実はウィンドウはね、非表示にできるんだよ
またまた水希ちゃんったら、冗談ばっかり
え??
だって、見えないウィンドウになんの価値があるの? なんの役にも立た
ないのに
実はこれが役に立つんだよね
え?
まだ難しいからもう少し先になってから話すけど、簡単に言えば、ウィン
ドウを作っておくとイベントを受け取りやすくなるから
イベントを受け取る?
そ。非表示になってて、たとえばタスクトレイのアイコンをクリックした
ときにそのイベントを受け取って、処理する。そんなことをするためにわざ
わざウィンドウを作っておくわけだ
へー、なんか複雑なのね……
ウィンドウシステムを理解してないとちょっと難しいかな。さて! この
一覧がウィンドウだってことは、こんなかに Calc があればわかるでしょ
あ、そっか。 Calc はっと……あ、あった!

00000E60 "Calc" #32770 (ダイアログ)

数字とかは実行するたびに変わるから注意してねってことで
これがホントに Calc ダイアログなのかな
ということで、前々回に作った〈ウィンドウタイトルを変えるプログラム〉
はまだ残ってる?
あ、そっか! 【=】ボタン押して、 Calc ダイアログの名前が〈あいう
えお〉になって……あれ?
Spy++ の方は、メニューの【ウィンドウ】−【最新表示】を選ばないと更
新されないから
あ、そうなんだ。最新表示っと……えっと、あいうえお……あった!!

00000E60 "あいうえお" #32770 (ダイアログ)

ホントだー、あいうえおがある……あ!
な、なに?
ここに書いてある #32770 ってのが、ハンドルってのでしょ!!
それが違うんだな
ええ??
実は、最初の【00000E60】がウィンドウハンドル
嘘よ嘘!!
言うと思った……どうせ〈番号じゃないじゃない!〉とか言うんでしょ
そうよー
うーん、16進数の話、簡単にしておこうかな……
じゅーろくしんすー?
そ、いつも使ってる数字のが〈10進数〉で、これは〈16進数〉
じゅっしんすー、じゅーろくしんすー……
〈なんとか進数〉っていうのは、〈なんとか〉の数字になった時にひとつ
位が上がるっていう意味
??
たとえば〈秒〉は、60秒で1分、つまり〈60になったときに【分】の
位に上がる〉から〈60進数〉
ってことは時間だったら24進数で、このビルだったら49進数ね
49進数??
このビルって階段が49段じゃない
49段上ったらひとつ上の階……まああってるけど、なんでそんなこと
知ってるの……
なんとなく。で、16進数ってことは、16になったらひとつ上の位って
ことよね
ま、試したみた方が解りやすいかな。まず Calc ダイアログを閉じて
【OK】 ボタンっと
で、いつものメンバ関数をこう書き換えて

void CCalcDlg::OnBEqual() 
{
    for( int iF1 = 0; iF1 <= 18; iF1++ )
    {
        TRACE( "%d, %X\n", iF1, iF1 );
    }
}

んーと、 for だから繰り返し。ゼロから始まって……18になるまでだ
から18回の繰り返し?
19回だよ、ゼロも入るんだから
あ、そっか。で、 TRACE() で、for でひとつずつ増やしている数を表示
して……あれ? %X って初見だね
これがミソ。 %d は数字を表示するときの記号だったでしょ
うん、いつもこれ使ってたよね
%X は、数字を16進数として表示するためのもの
これがそうなのねー、じゃ、さっそくビルドして実行っと

0, 0
1, 1
(略)
9, 9
10, A
11, B
(略)
15, F
16, 10
17, 11
18, 12

あ! アルファベット出てきた
左がいつも使ってる〈10進数〉、右は新しく出てきた〈16進数〉。ま
ず、16進数ってことは〈16になるまでは位を上げちゃいけない〉から、
10や11の代わりにAやBを使います
あ、それでアルファベットが出てくるんだ
そうするとFが15になるよね。で、さらに1増えたら、やっと次の桁
つまり10になるってことなのねー
そういうこと。で、注意!!
な、なに?
16進数っていうのはただの〈表現方法〉。だから、結局 iF1 の中に普
通の数字が入ってることには変わりないからね
つまり iF1 の中に入ってる10とかって数字を、TRACE() と %X が16
進数に変換してから表示してるってこと
そう。ま、この辺は実はもっと奥深いんだけど、それはまた今度ね
はーい。で、ハンドルも数字だと
そう。ハンドルは16進数で表示するっていう習慣があるってだけだね。
単なる数字ってことには変わりないから
つまりウィンドウの出席番号ってわけだ
さて、このウィンドウハンドルを取得するためのメンバ関数が CWnd にあ
るから、最後にこれを使ってみようか
はーい

void CCalcDlg::OnBEqual() 
{
    TRACE( "%X\n", GetSafeHwnd() );
}

この GetSafeHwnd() っていうのがそうなの?
来週もっと詳しく見るけど、この CWnd::GetSafeHwnd() の戻り値にウィ
ンドウハンドルが返ってくるから、それを TRACE() で表示してみようって
わけ
だから %X なのね。ビルドして実行

4DC

あれ、シンプルだね
最初のゼロとかは省略されて表示されるからね。これが、今表示されてい
る Calc ダイアログのウィンドウハンドル。これを確認する方法は?
さっきの Spy++ !!
そうそう。 Spy++ の表示を更新して、Calc ダイアログを探してみて
あった!

000004DC "Calc" #32770 (ダイアログ)

ホントだー、ウィンドウハンドルおんなじだね
この番号、ウィンドウハンドルでウィンドウを区別してるわけだ


/*
    Preview Next Story!
*/
次回はまたクラスに戻って、ハンドルとの関連について見ていきます
ウィンドウ操作にハンドルを使うっていうのも、ルールのひとつ?
そだね、ウィンドウズのルール
なんかめんどくさー、もっと簡単になんないかなー
たとえば?
たとえば〈ウィンドウ出ろ!〉って言うだけとか
そしたらプログラマーって要らないかもね
それはそーかも
というわけで次回
< Version 3.5 ウィンドウハンドルとAPI >
につづく!!
実際、プログラマーなんてただの下働きに過ぎないんだから……
あら黄昏ちゃった
クライアントは無理言うしさ、いいプログラム書いても評価されないしさ、
給料安いしさ、あげくにこんなとこ送られるし、皆さん、プログラマーなん
てなるもんじゃないですよ……
身も蓋もない……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。