エンタープライズ:特集 2003/09/22 21:29:00 更新
C Magazine

[C Magazine連載]プログラムのレシピ(第2回)
ドローツールを作る (3/6)

C MAGAZINE 2002年10月号より転載

矩形クラスと楕円クラス
 矩形(DRectangle)と楕円(DOval)については、必要な属性やメソッドのほとんどが基本クラスから継承できるので、簡単に作れます。基本クラスとの主な相違点は描画です。そこで、描画メソッドをオーバライドします。

 プログラム例はList2です。List2-(1)は矩形クラス、List2-(3)は楕円クラスです。

List2 矩形クラスと楕円クラス(DObject.h)

//========================================= (1)
// 矩形
class DRectangle : public DObject {
public:

   // コンストラクタ,複製
   DRectangle();
   DRectangle(DRectangle* src);
   virtual DObject* Clone();

   //===================================== (2)
   // 描画(通常,当たり判定)
   virtual void Paint(TCanvas* canvas);

};

//========================================= (3)
// 楕円
class DOval : public DObject {
public:

   // コンストラクタ,複製
   DOval();
   DOval(DOval* src);
   virtual DObject* Clone();

   //===================================== (4)
   // 描画(通常,当たり判定)
   virtual void Paint(TCanvas* canvas);
   virtual void PaintHitArea(TCanvas* canvas, TColor color);

};

 矩形の場合はList2-(2)のように、通常描画のメソッドだけをオーバライドします。当たり判定用の描画メソッドは、基本クラスのものを継承します。基本クラスでは、「図形の四隅の内部にクリックした点があるかどうか」という単純な当たり判定処理を用意しました。これは矩形でも共通に使えます。

 楕円の場合はList2-(4)のように、当たり判定用の描画メソッドもオーバライドします。これは、楕円の場合には図形の四隅だけでは内外の判定ができないからです。

ポリゴンクラス
 ポリゴン(DPolygon)は、個々の頂点を扱う必要があるので、矩形や楕円に比べると少し複雑です。まず頂点の座標を管理するために、配列やリストなどを用意します。そして、頂点を追加したり削除したりするためのメソッドも作ります。

 忘れてはいけないのは、図形の位置やサイズを設定するメソッドのオーバライドです。たとえばポリゴンが移動したときには、ポリゴンに属する頂点も移動させてやる必要があります。

 プログラム例はList3です。List3-(1)は頂点座標を記録するためのクラスで、List3-(2)がポリゴンクラスの本体です。

List3 ポリゴンクラス(DObject.h)

//========================================= (1)
// 頂点を扱うためのクラス
class DPoint {
public:
   float X, Y;
   DPoint(float x, float y) : X(x), Y(y) {}
   DPoint(DPoint* src) : X(src->X), Y(src->Y) {}
};

//========================================= (2)
// ポリゴンのクラス
class DPolygon : public DObject {
protected:

   //===================================== (3)
   // 頂点リスト
   TList* Points;

public:

   // コンストラクタ,複製
   DPolygon();
   DPolygon(DPolygon* src);
   DPolygon(bool filled, bool closed);
   virtual DObject* Clone();

   //===================================== (4)
   // 頂点の操作
   void AddPoint(float x, float y);
   void MovePoint(int index, float x, float y);
   void DeletePoint(int index);
   DPoint GetPoint(int index);
   int PointsCount() { return Points->Count; }

   //===================================== (5)
   // 描画(通常,当たり判定)
   virtual void Paint(TCanvas* canvas);
   virtual void PaintHitArea(TCanvas* canvas, TColor color);

   //===================================== (6)
   // 位置やサイズの設定
   virtual void SetPos(float left, float top);
   virtual void SetRect(TRect rect);

};

 List3-(3)は頂点リストで、List3-(4)は頂点を操作するためのメソッドです。一方、List3-(5)、(6)は基本クラスのメソッドをオーバライドしたものです。List3-(5)は描画メソッド、List3-(6)は先ほど説明した位置やサイズの設定メソッドです。

テキストクラス
 テキスト(DText)では、文字列を管理するための変数やメソッドを追加します。また、フォントを設定するメソッドをオーバライドしなければいけません。これは、フォントが変わったときに、それに合わせてテキスト全体の大きさも変える必要があるからです。

 プログラム例はList4です。List4-(1)は文字列用の変数、List4-(2)は文字列用のメソッドです。List4-(3)では描画メソッドを、List4-(4)ではフォント設定メソッドをそれぞれオーバライドします。

List4 テキストクラス(DObject.h)

// テキスト
class DText : public DObject {
protected:

   //===================================== (1)
   // 文字列リスト
   TStringList* Lines;

public:

   // コンストラクタ,複製
   DText();
   DText(DText* src);
   DText(float x, float y, TStrings* lines);
   virtual DObject* Clone();

   //===================================== (2)
   // 文字列リストの取得と設定
   TStrings* GetLines() { return Lines; }
   void SetLines(TStrings* lines);

   //===================================== (3)
   // 描画(通常,当たり判定)
   virtual void Paint(TCanvas* canvas);

   //===================================== (4)
   // 属性の設定
   virtual void SetFont(TFont* font);

};

[C Magazine連載]プログラムのレシピ(第2回)
ドローツールとは
制作上のポイント
図形のクラス設計
図形の基本クラス
矩形クラスと楕円クラス
ポリゴンクラス
テキストクラス
グループ化機能
図形の当たり判定
サンプルプログラムの使い方
おわりに
・実行ファイル/リソース一式(.lzh形式/1.31MB)
・リスト(.lzh形式/3.40KB)

関連リンク
▼C MAGAZINE
▼ひぐぺん工房
▼「デスクトップマスコットを作ろう」紹介ページ
▼「デスクトップマスコットを作ろう」著者ページ

前のページ | 1 2 3 4 5 6 | 次のページ

[松浦健一郎(ひぐぺん工房),JAVA Developer]