|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第444回 CPanelクラス2 発行 2004年4月28日(月曜日) 発行数 約3000 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンはまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・このメールマガジンは、横60文字で作成しています。 また、インデントはすべて半角スペース4つで構成しています。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、まぐまぐさんのホームページでお願いします。 ・まぐまぐさんのバックナンバー(下欄参照)を活用して下さい。 ・ここは私の復習の場です。内容は約1ヶ月内外に私が勉強した 内容になっています。最新の技術があれば、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 ・セキュリティ突破のため、暗号化された単語があります。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 そういえば、もうゴールデンウィークですね。皆さんは旅行など にでも、でかけられるのでしょうか。 私にはあまり関係のない話ですが、しかし普通の日よりも少し お遊びの時間が増えるのは確かです。 検索CGIに、1行プレビューをつけたいと思っていたので、 その改造でもしましょうか。 あと、ファントムの再攻略もいいかも。 ファントム、4コマなどがでていますが、よいです! {magclick} /*========================================================*/ 今回のお題 << CPanelクラス2 >> /*========================================================*/ というわけで、CPanelクラスです。 の前に、 CXXXDlg::OnSize( ... ) { CDialog::OnSize( ... ); CWnd* pWnd1 = GetDlgItem( IDC_ITEM1 ); CWnd* pWnd2 = GetDlgItem( IDC_ITEM2 ); CWnd* pWnd3 = GetDlgItem( IDC_ITEM3 ); if( ! cx || ! cy || ! pWnd1 || ! pWnd2 || ! pWnd3 ) return; CRect rc1, c2, rc3; pWnd1->GetWindowRect( &rc1 ); pWnd2->GetWindowRect( &rc2 ); pWnd3->GetWindowRect( &rc3 ); ScreenToClient( &rc1 ); ScreenToClient( &rc2 ); ScreenToClient( &rc3 ); rc1.right = cx - rc1.left; // 右いっぱいに rc2.right = cx - rc2.left; // 右いっぱいに rc3.right = cx - rc3.left; // 右いっぱいに rc2.top = rc1.bottom + rc2.left; // 上いっぱいに rc2.bottom = rc3.top - rc2.left; // 下いっぱいに pWnd1->MoveWindow( &rc1 ); pWnd2->MoveWindow( &rc2 ); pWnd3->MoveWindow( &rc3 ); } 前回のこの処理、微妙に間違っています。 一番下に配置するはずの rc3 について、top と bottom を 修正していませんでした。 つられて、rc2 も上下に最大化されないようになっていました。 int h = rc3.Height(); rc3.bottom = cy - rc3.left; rc3.top = rc3.bottom - h; rc2.top をいじる手前に、この計算が必要です。 /*========================================================*/ さて前回、使い方について紹介しました。 今回は、CPanel の内部について、少し解説します。 内部の処理は大きく分けて2つあります。1つは登録、もう1つ はリサイズの実行です。 サイズの登録として、SetTopLeft など、たくさんメンバ関数が ありますが、これらは TOP_LEFT などのインデックスをユーザに 指定させないためのインターフェースです。 結局は1つの関数を呼び出す窓口となっています。 配置する場所は、3*3の9マスです。 インデックスはテンキーと同じ感じで1〜9を割り当てて います。 ゲームのプログラムで、十字キーの入力について右を6、右上を 9などと定義するのと、同じです。 データは10個の配列としてもち、最初の0番目の要素は、 無視しています。 こうすると、右側は+1、上側は+3という感じに、 相対アクセスが楽になり、便利でもあります。 さて、その登録関数ですが、ちょっといろいろやっています。 まず、登録する位置を探します。同じ場所にいくつも配置される 可能性があるので、リストをつらつらとたどっています。 そして、端からの相対位置を保存しています。 TopLeft などに配置したコントロールは、ほとんど動きません が、微妙に動きます。 マージンの計算によって、少しだけ動くのです。 他のコントロールとの並びもありますので、動かしたほうが 全体的にすっきりするということです。 また、TopLeft などにいくつものコントロールを登録した場合、 あらかじめ、どのコントロールをどこに配置して、どのように サイズ調整を行うのか、ということを、登録しておく必要があり ます。 なお、中央配置というオプションがありますが、実は上手く 動いていません。少し修正が必要なのです。fixed については、 無視してください。 /*========================================================*/ もう1つのお仕事が、リサイズの実行です。 ここでは、かなりいろいろやっています。 が、長いだけで、シンプルでもあります。 つまり、左舷3つ、右舷3つ、中央3つ、上段3つ、中段3つ、 下段3つの、合計6種類の処理が動いているのです。 ぎざぎざカットのように並んでいるループはそのような意味が あり、それさえ分かれば簡単です。 最後のループで、実際にウィンドウを移動させています。 {magclick} /*========================================================*/ さいごに /*========================================================*/ 一見すると、膨大な計算をやっているように見えますが、 ★そのとおりです。 が、OnSize に手で処理を書くよりも楽ですし、登録されて いない部分ではループを飛ばしているので、意外に軽いかも、 しれません。 OnSize にべったりと書いたものが、もっとも最適化されている ものですが、まぁ、汎用というのは、こんなものではないでしょう か。 CString にしたって色々やって重いのだろうけど、便利だから 使いまくりですよね。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は5月7日(金曜日)に、第445回を送ります。 お題は「WINDOWPLACEMENT」 ゴールデンウィーク開けに、お送りします。 同時にアップした、WndPlace.h について、少し説明します。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 八方槍ふたたび なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ まぐまぐアイディー 0000020674 まぐまぐバックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ 登録と解除 http://www.mag2.com/m/0000020674.htm ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp めーらっくす <<過去ログがタイトル別になっています>> http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F |