掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
背景が透明な線を描画するには、どのようなアプローチが良いか? (ID:20607)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
図形クラス自身が描画メソッドを持つようにした前回の改良版です。 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Contnrs; type TZukei = class(TObject) // 図形クラスのベース protected Fcolor: TColor; Fwidth: integer; public procedure Draw(cvs: TCanvas); virtual; abstract; end; TLine = class(TZukei) // 直線クラス private Fstart, Fstop: TPoint; public constructor Create(start, stop: TPoint; color: TColor; width: integer); virtual; procedure Draw(cvs: TCanvas); override; end; TEllipse = class(TZukei) // 楕円クラス private Fpoint1, Fpoint2: TPoint; public constructor Create(pt1, pt2: TPoint; color: TColor; width: integer); virtual; procedure Draw(cvs: TCanvas); override; end; TForm1 = class(TForm) PaintBox1: TPaintBox; Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public ZukeiList: TObjectList; h, w: integer; end; var Form1: TForm1; implementation {$R *.dfm} constructor TLine.Create(start, stop: TPoint; color: TColor; width: integer); begin Fstart := start; Fstop := stop; Fcolor := color; Fwidth := width; end; procedure TLine.Draw(cvs: TCanvas); begin cvs.Pen.Color := Fcolor; cvs.Pen.Width := Fwidth; cvs.MoveTo(Fstart.X, Fstart.Y); cvs.LineTo(Fstop.X, Fstop.Y); end; constructor TEllipse.Create(pt1, pt2: TPoint; color: TColor; width: integer); begin Fpoint1 := pt1; Fpoint2 := pt2; Fcolor := color; Fwidth := width; end; procedure TEllipse.Draw(cvs: TCanvas); begin cvs.Pen.Color := Fcolor; cvs.Pen.Width := Fwidth; cvs.Ellipse(Fpoint1.X, Fpoint1.Y,Fpoint2.X, Fpoint2.Y); end; procedure TForm1.FormCreate(Sender: TObject); begin ZukeiList := TObjectList.Create(true); w := PaintBox1.Width; h := PaintBox1.Height; Randomize; end; procedure TForm1.FormDestroy(Sender: TObject); begin ZukeiList.Free; end; procedure TForm1.PaintBox1Paint(Sender: TObject); var i: integer; begin if ZukeiList.Count = 0 then exit; PaintBox1.Canvas.Brush.Style := bsClear; for i := 0 to ZukeiList.Count-1 do TZukei(ZukeiList[i]).Draw(PaintBox1.Canvas); end; procedure TForm1.Button1Click(Sender: TObject); var line: TLine; p1, p2: TPoint; cl: TColor; begin p1 := Point(Random(w), Random(h)); p2 := Point(Random(w), Random(h)); cl := RGB(Random(256), Random(256), Random(256)); line := TLine.Create(p1, p2, cl, Random(6)+1); ZukeiList.Add(line); PaintBox1.Refresh; end; procedure TForm1.Button2Click(Sender: TObject); var ellipse: TEllipse; p1, p2: TPoint; cl: TColor; begin p1 := Point(Random(w), Random(h)); p2 := Point(Random(w), Random(h)); cl := RGB(Random(256), Random(256), Random(256)); ellipse := TEllipse.Create(p1, p2, cl, Random(6)+1); ZukeiList.Add(ellipse); PaintBox1.Refresh; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.