#pragma twice

KAB-studio > プログラミング > #pragma twice > 088 Version 5.23 ウィンドウクラス

#pragma twice 088 Version 5.23 ウィンドウクラス

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

 Version 5.23
ウィンドウクラス

ブラッシュアップ編も終わったし、次は?
今回からは、ウィンドウとコントロールの話
コントロールって、エディットボックスとかのことだよね
そう、その辺の話。むかーしちょっとだけ触れたんだけど、エディット
ボックスとかリストボックスとかのコントロールも、全部ウィンドウの一種
なんです
ええっ、そうなの?
その辺を今回から見ていきます。えっとまず、メニューの【ツール】に
【Spy++】ってあるでしょ
前にこれ使いまくったね。えーっと、 Ver 3.4 ( No.029 ) に Ver 3.5 
( No.030 )
 、 Ver 3.13 ( No.038 ) で使ってるね
その復習も兼ねて、とりあえず使ってみましょう。 Spy++ のメニューの
【スパイ】−【ウィンドウ検索】を選んで
ほい、ダイアログ出たよ
照準みたいなのがあるでしょ。それを
ドラッグすると、その下のウィンドウに太線が付くんだよね
そう、とりあえずエクスプローラーにやってみて
ん、でも場所によってなんかキャプションとか全然違うね
さっき言ったでしょ、コントロールもウィンドウのひとつだって
ってことは、これ全部コントロールなの?
そうだよ、ファイル表示してる部分は〈リストビューコントロール〉って
いうコントロール。リソースエディタ使うと
ホントだ、ツールバーに〈リストビュー〉ってあるね。これと同じなんだ
その辺も後で見てみるからね。照準をタイトルバーに合わせて
ほい。あ、キャプションがウィンドウのタイトルと同じになった
このウィンドウが、一番上のウィンドウ。他のコントロールはこのウィン
ドウに乗ってる形になってます
 OK 押しちゃっていいの?
ちょっと待って。ここに書いてある設定についてちょっと解説してから
ほい。〈キャプション〉はウィンドウタイトルだよね
そう。〈クラス〉は、いわゆるクラスとは全然違うものだから注意
 CDialog とかじゃないってことね。じゃーなんなの?
このクラスは〈ウィンドウクラス〉って言って、ウィンドウの〈原型の名
前〉なんです
原型の名前?
次の章ぐらいに、実際に火美ちゃんに一からウィンドウを作ってもらうけ

いつになるやら……
ウィンドウを作るときには、まずウィンドウの原型をウィンドウズに登録
するんです
ほー
……とりあえずコード見とこうか
へ? 次の章じゃないの?
詳しく解説するが次ってことで。今回は見てて
ほーい
手抜きして CFileTestDlg::OnBtnShow() に書くね
いつもの return してそのあとは取っとくってのね

void CFileTestDlg::OnBtnShow() 
{
    WNDCLASS stWndClass;
    stWndClass.style = CS_BYTEALIGNWINDOW;
    stWndClass.lpfnWndProc = &AfxWndProc;
    stWndClass.cbClsExtra  = 0;
    stWndClass.cbWndExtra  = 0;
    stWndClass.hInstance  = AfxGetInstanceHandle();
    stWndClass.hIcon  = NULL;
    stWndClass.hCursor = NULL;
    stWndClass.hbrBackground  = (HBRUSH)COLOR_BACKGROUND;
    stWndClass.lpszMenuName  = NULL;
    stWndClass.lpszClassName  = "TestWClass";

    AfxRegisterClass( &stWndClass );

ここまでが、ウィンドウクラスの登録
げげ、長い!
こういうのは見慣れないときついかもね。だから今回は見るだけ
でも次の章でこれやるんだ……
色々入れてる部分は、ウィンドウクラスの設定
ウィンドウの原型の設定ってことね
最後の AfxRegisterClass() で、ウィンドウズにその設定のウィンドウク
ラスを登録します
登録したら、ウィンドウを作るの?
そ、こんな感じに

    CRect stRect( 0, 0, 100, 100 );
    CWnd cWnd;
    cWnd.Create
        ( "TestWClass"
        , _T( "てすとですぅ" )
        , WS_OVERLAPPEDWINDOW
        , stRect
        , this
        , 1000 );

    return;
// 以下、前の分を取っときましょう。

でもビルドしてもウィンドウできないよ?
ありゃ、そっか、 CWnd だけじゃダメなんだ、派生クラス作んなきゃいけ
ないんだなー、ま、今回はここまでってことで
何それ
とりあえず、 CWnd::Create() を呼び出せば、ウィンドウを作れるってこ
とが分かればOK。で、その第1引数と、 stWndClass.lpszClassName で指
定してるのが
同じ "TestWClass" だね
これが、ウィンドウクラスの名前。最初にウィンドウクラスを登録したと
きに、ウィンドウズにこのウィンドウクラス名で登録されてるから
ってことは、 Create() で、そのウィンドウクラスを原型にして作るって
ことで、そのウィンドウクラス名を使ってるんだ
そゆこと。ここでウィンドウクラス名を指定すると、同じウィンドウクラ
ス名のウィンドウクラスを原型に、ウィンドウを作ってくれるわけ
ほー
んじゃこの部分は削除しちゃって、話を元に戻しましょう
つまり、エクスプローラーの CabinetWClass ってウィンドウクラス名も、
登録されてるってことなんだ
そういうこと。一度登録しちゃえば、そのあといくつウィンドウを作って
も、そのウィンドウクラスを元に作れるから簡単なわけ
なるほど
次の〈スタイル〉は飛ばして、〈矩形〉について
〈くけい〉って読むんだ。これってウィンドウの位置とサイズだよね
そ。見りゃ分かるか
分かるよん
じゃ、戻って〈スタイル〉について。スタイルっていうのは
これは知ってるよー、ウィンドウの形とかそういうの決めるのだよね
そう、これは整数値形式だけどね。一番下の【表示】を【プロパティ】に
して OK ボタン押して
ほい。んで【スタイル】見るの?
そ。ここに書かれてるスタイルの設定で、ウィンドウの形状とかが決まり
ます。たとえば WS_OVERLAPPEDWINDOW は〈普通のウィンドウ〉って指定
あ、上のウィンドウ作ってるときにも使ってるね
こんなふうにウィンドウ作るときにも指定できるし、作ってからも変更で
きたりします。ちなみに、なんでウィンドウスタイルが 16CF0000 みたいな
整数値になってるかわかる?
そういえばそうねー。なんで?
たとえばさっきの Create() 呼ぶときに、 WS_OVERLAPPEDWINDOW に加え
て WS_VISIBLE を指定したいってときにはどうする?
そりゃ | で、そっか! この整数値は全部のスタイルを | で重ねたもの
なんだね
そういうこと。 | はビットごとの和を求めるのだったでしょ
で、それぞれ2倍ずつずれてる数字になってるわけだから、それを全部重
ねるとこうなるんだ。なるほどね
そういうこと。 16CF0000 って整数値じゃなくて、ビットが並んでるイ
メージの方が分かりやすいかもね
計算がちょっとめんどいけど
そうそう、こんなふうにいつでもウィンドウスタイルって取得できるんだ
けど、取得したときは 16CF0000 って整数値になってます。そこから各フラ
グを取得する方法って分かる?
えーっと、やっぱビットの操作するんだよね。あ、 & を使うんだ!
そゆこと。各フラグと、この整数値を & すれば、ビットが1かどうか分
かるからね
詳しくは Ver 4.05 ( No.055 ) を参照ねー。他の設定は? ウィンドウ
っていっぱい設定あるよねー
どれもまだちょっと難しいかな。それに、プログラムを組みながらの方が
解りやすいしね
どゆこと?
今言ったウィンドウスタイルは、 CWnd::GetStyle() で取得できるから
へー
前も言ったでしょ、たいがいのことはちゃんとプログラムとしてできるん
だって
得体の知れないなんかじゃないってことね。 Spy++ もプログラムなんだ
から、 CWnd::GetStyle() 使ってウィンドウスタイル取得してるかも、だね
で、これに & でフラグ調べれば、同じようなことができるわけだ
おお!
それは次回ね。あと他のページもぱぱっと見ておこうか。【ウィンドウ】
見てみて
次のウィンドウ、前のウィンドウ、親ウィンドウ、1つ目の子ウィンドウ、
オーナーウィンドウ?
ウィンドウは、全部上下関係がはっきりしてて、こういうふうに並んでる
んです
こういうふうにって言われても……
たとえば、エクスプローラーに乗ってるリストビューコントロール。ああ
いったコントロール関係は、全部子ウィンドウ
見てみよっと
〈親ウィンドウ〉の右の数字は、親ウィンドウのウィンドウハンドル。ク
リックすると、表示してる情報が親ウィンドウのになるから
クリック! あれ、でもよく分かんないウィンドウになっちゃった
もひとつ上みたいだね
クリック! あ、エクスプローラーのになった!
逆に、エクスプローラーのウィンドウから、リストビューのウィンドウま
で行く事もできるよ。まず〈1つ目の子ウィンドウ〉を
クリック!
〈次のウィンドウ〉を3回
クリッククリッククリック! はぁはぁ
そしたら〈1つ目の子ウィンドウ〉を
クリック! ……これホントにリストビューのなのかな
最初にウィンドウハンドルを確認しといた方が良かったね
そうね……なんか無駄働き?
あと、このリストビューのウィンドウクラス名見てみて
 SysListView32 ってなってる
これがリストビューの証拠
そなの?
そなの。その辺を踏まえつつ、次回に続く!

/*
    Preview Next Story!
*/
あ、次回は SysListView32 のことやんないわ
また伸びちゃったとか?
そんなとこ。来週はウィンドウスタイルについて
しっかり書くってことは、それなりに大事?
大事じゃないとこってないのかも
というわけで次回
< Version 5.24 ウィンドウスタイルいろいろ >
につづく!
私はともかく、水希ちゃんよくそんだけ憶えられるよね
僕って実は天才?
その天才をこんなとこで無駄に浪費してていーの?
うううっ
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。