メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.584) CE4 パレット描画処理  2005/07/08


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第584回 CE4 パレット描画処理
 発行    2005年7月8日(金曜日)
 発行数   約2600

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。
・セキュリティ突破のため、暗号化された単語があります。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 あゆしゃは最近、あることに夢中です。それは、

★攻殻のDVDを買い揃えること!

 現在12本。

 このDVDを見た後は意識が電脳化していますので、囲碁を打つと
なぜが勝率がいい、今日この頃です。

 (置き碁ではありますが)段位クラスにも勝ってしまいます。

 やっぱりいいなぁ、電脳化。。

{magclick}
/*========================================================*/
 今回のお題  << CE4 パレット描画処理 >>
/*========================================================*/

 前回、パレットの描画について変数遷移図を作成しました。

「パレット」
 |
 | <初期化、サイズ変更>初期化、○を表示
 |
 | <更新、選択変更>前回の強調を解除、強調を再描画
 |
 | 描画
 ↓
「スクリーン」

 これを元に、描画処理を考えます。

/*========================================================*/

 OnPaintのなかで、とりあえずサイズを取得します。

// ウィンドウの幅を取得する
CRect rc;
GetClientRect( &rc );
int width = rc.Width();
int height = rc.Height();
// ついでにマウス座標を取得
CPoint mpos;
GetCursorPos( &mpos );
ScreenToClient( &mpos );

 裏画面の更新を処理します。
 裏画面は1つのクラスを作り、処理の詳細はそこに記述する、
ということにして、OnPaintに記述するのはがらだけです。

 ChkResizeは、サイズをチェックして変わっていたら変更し、
その場合にTRUEを返すものとします。

BOOL bUpdateBack = imgBack.ChkResize( width, height );

(中略)

 最後に、裏画面をクライアントDCに描画します。
 imgBackはオブジェクトで、メンバ変数のimgはCImageです。
 継承をすると少々面倒なので、メンバ変数でもつものとします。

imgBack.img.BitBlt( CClientDC( this ), 0, 0 );

/*========================================================*/

 中略の部分、裏画面を描画する前に、裏画面の更新処理として
変数遷移図のパレット描画処理を入れます。

 パレット描画処理は別クラスを作り、半分はそこで処理するよう
にしましょう。

 パレットのスペルはpaletteですが、paletは省略形だと思って
ください。

// 初期化、画面サイズ変更判定
BOOL bUpdatePalet = imgPalet.ChkResize( width, height );
// 円を描画
if( bUpdatePalet ) imgPalet.DrawBall();
// bUpdatePaletがFALSEならば、前回の強調を解除、強調を描画
imgPalet.CheckSelect( mpos ); // 選択位置を計算
if( bUpdatePalet || imgPalet.IsChangeSelect() ) {
    if( ! bUpdatePalet ) imgPalet.EraseSelect();
    imgPalet.DrawSelect();
    bUpdatePalet = TRUE;
}

 最後に、更新されているようならば裏画面を更新します。

HDC hBack = imgBack.GetDC();
if( bUpdatePalet ) {
    imgPalet.BitBlt( hBack, 0, 0 );
}
imgBack.ReleasaeDC();

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 なんだか面倒な判定をしていますが、今後、こういう処理が何十
というボリュームで出てきます。

 ので、こういうちまちまとした定義は必要になります。

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は7月11日(月曜日)に、第585回をお送りします。
 お題は「CE5 CCEImageクラス」

 今回出てきた、ChkResizeなどの基本的な処理を担当するクラス
を考えます。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
脳潜入用意 なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F 

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

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