| エンタープライズ:特集 | 2003/07/04 17:20:00 更新 |
C MAGAZINE 2002年8月号より転載
プログラムのレシピ――プログラミングの考え方・作り方 (8/13)
|
グラフィックエディタの製作(4) 基本機能の作成−画像の拡大縮小表示 |
| 画像の拡大縮小表示 |
基本的な機能はこれでできあがりですが、画像の拡大縮小表示機能もついでに作っておきましょう。拡大縮小表示は描画機能や編集機能にも関係しますから、早めに作っておくのが得策です。
画像を拡大縮小表示するための機能も、既存のライブラリにあります。Win32 APIならばStretchBlt関数、VCLならばStretchDrawメソッドまたはCopyRectメソッドが使えます。
拡大縮小率が固定では不便ですから、これを変更するためのユーザインタフェイスも必要ですね。ダイアログを出すとかスライダを使うとか、いろいろな方法がありますが、ここでは簡単にメニューを使いましょう。メニューに、「2倍、4倍、……」および「1/2倍、1/4倍、……」といった項目を追加して、これで拡大縮小率を設定する仕掛けにします。
●プログラム例まず拡大縮小率を保持するために、ZoomRateというdouble型のメンバ変数を追加しました。そして、Fig. 7のように拡大と縮小に関するメニュー項目を配置します。拡大と縮小はそれぞれサブメニューに分けました。

拡大縮小率の設定処理はList 8のように書きます。メニュー項目(TMenuItem)の1つ1つにイベント処理を設定するのはたいへんなので、拡大と縮小をそれぞれ1つずつのイベント処理にまとめました。オブジェクトインスペクタを使ってTMenuItemのTagプロパティに拡大縮小率を設定しておきます。このように、Tagプロパティはユーザが自由な目的に使えるプロパティです。
| List 8 拡大縮小率の設定(UGEditorForm.cpp) |
// 拡大縮小率を設定し、ペイントボックスのサイズを調整する
void TGEditorForm::Zoom(double zoomRate) {
if (ZoomRate!=zoomRate) {
ZoomRate=zoomRate;
ResizePaintBox();
}
}
// 拡大率を設定するメニュー項目のイベント処理
void __fastcall TGEditorForm::MZoomInClick(TObject *Sender)
{ Zoom(((TMenuItem*)Sender)-> Tag); }
// 縮小率を設定するメニュー項目のイベント処理
void __fastcall TGEditorForm::MZoomOutClick(TObject *Sender)
{ Zoom(1.0/((TMenuItem*)Sender)-> Tag); }
|
描画については、List 6とList 7をList 9のように書き換えます。まず、拡大縮小率に合わせてペイントボックスの大きさを調整します(List 9-(1))。そしてStretchDrawメソッドを使ってビットマップを拡大縮小表示します(List 9- 2))。TPaintBoxクラスのClientRectプロパティを引数にすると、ペイントボックス一杯にビットマップを描くことができます。
| List 9 拡大縮小表示(UGEditorForm.cpp) |
// ビットマップのサイズや拡大率が変更されたとき、
// ペイントボックスの大きさを変える
void TGEditorForm::ResizePaintBox() {
int w=Bitmap-> Width;
int h=Bitmap-> Height;
//========================================================== (1)
// 拡大縮小率に合わせて大きさを調整する
w*=ZoomRate; h*=ZoomRate;
PaintBox-> Width=w;
PaintBox-> Height=h;
PaintBox-> Invalidate();
}
// ペイントボックスを再描画する
void __fastcall TGEditorForm::PaintBoxPaint(TObject *Sender) {
//========================================================== (2)
// ペイントボックスの大きさに合わせて
// ビットマップを描画する
TCanvas *c=PaintBox-> Canvas;
c-> StretchDraw(PaintBox-> ClientRect,Bitmap);
}
|
前のページ | 1 2 3 4 5 6 7 8 9 10 11 12 13 | 次のページ
[松浦健一郎(ひぐぺん工房),C MAGAZINE]
Copyright © ITmedia, Inc. All Rights Reserved.

