エンタープライズ:特集 2003/07/04 17:20:00 更新
C Magazine

C MAGAZINE 2002年8月号より転載
プログラムのレシピ――プログラミングの考え方・作り方 (8/13)

グラフィックエディタの製作(4)
基本機能の作成−画像の拡大縮小表示

画像の拡大縮小表示

 基本的な機能はこれでできあがりですが、画像の拡大縮小表示機能もついでに作っておきましょう。拡大縮小表示は描画機能や編集機能にも関係しますから、早めに作っておくのが得策です。

 画像を拡大縮小表示するための機能も、既存のライブラリにあります。Win32 APIならばStretchBlt関数、VCLならばStretchDrawメソッドまたはCopyRectメソッドが使えます。

 拡大縮小率が固定では不便ですから、これを変更するためのユーザインタフェイスも必要ですね。ダイアログを出すとかスライダを使うとか、いろいろな方法がありますが、ここでは簡単にメニューを使いましょう。メニューに、「2倍、4倍、……」および「1/2倍、1/4倍、……」といった項目を追加して、これで拡大縮小率を設定する仕掛けにします。

●プログラム例

 まず拡大縮小率を保持するために、ZoomRateというdouble型のメンバ変数を追加しました。そして、Fig. 7のように拡大と縮小に関するメニュー項目を配置します。拡大と縮小はそれぞれサブメニューに分けました。

Fig7

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.