メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.444) CPanelクラス2  2004/04/28


/*========================================================*/
    <<<あゆしゃの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

ブラウザの閉じるボタンで閉じてください。