エンタープライズ:特集 | 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.