您的位置:首页 > 其它

一个可以显示多边形的 TMyShape 类 - 回复 "董勇" 的问题

2008-11-18 13:13 381 查看
测试效果图:



自定义的 MyShape 单元:
unit MyShape;

interface

uses
Windows, Classes, Graphics, Controls;

type
TMyShapeType = (stRectangle, stSquare, stRoundRect, stRoundSquare,
stEllipse, stCircle, stPolygon);

TPoints = array of TPoint;

TMyShape = class(TGraphicControl) {根据 TShape 改写}
private
FPen: TPen;
FBrush: TBrush;
FShape: TMyShapeType;
FPonits: TPoints;
procedure SetBrush(Value: TBrush);
procedure SetPen(Value: TPen);
procedure SetShape(Value: TMyShapeType);
procedure SetPonits(const Value: TPoints);
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
procedure StyleChanged(Sender: TObject);
property Align;
property Anchors;
property Brush: TBrush read FBrush write SetBrush;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Constraints;
property ParentShowHint;
property Pen: TPen read FPen write SetPen;
property Shape: TMyShapeType read FShape write SetShape default stRectangle;
property ShowHint;
property Visible;
property OnContextPopup;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseActivate;
property OnMouseDown;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
property Ponits: TPoints read FPonits write SetPonits;
end;

implementation

{ MyTShape }

constructor TMyShape.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable];
Width := 65;
Height := 65;
FPen := TPen.Create;
FPen.OnChange := StyleChanged;
FBrush := TBrush.Create;
FBrush.OnChange := StyleChanged;
end;

destructor TMyShape.Destroy;
begin
FPen.Free;
FBrush.Free;
inherited Destroy;
end;

procedure TMyShape.Paint;
var
X, Y, W, H, S: Integer;
begin
with Canvas do
begin
Pen := FPen;
Brush := FBrush;
X := Pen.Width div 2;
Y := X;
W := Width - Pen.Width + 1;
H := Height - Pen.Width + 1;
if Pen.Width = 0 then
begin
Dec(W);
Dec(H);
end;
if W < H then S := W else S := H;
if FShape in [stSquare, stRoundSquare, stCircle] then
begin
Inc(X, (W - S) div 2);
Inc(Y, (H - S) div 2);
W := S;
H := S;
end;
case FShape of
stRectangle, stSquare:
Rectangle(X, Y, X + W, Y + H);
stRoundRect, stRoundSquare:
RoundRect(X, Y, X + W, Y + H, S div 4, S div 4);
stCircle, stEllipse:
Ellipse(X, Y, X + W, Y + H);
stPolygon:
Polygon(FPonits);
end;
end;
end;

procedure TMyShape.StyleChanged(Sender: TObject);
begin
Invalidate;
end;

procedure TMyShape.SetBrush(Value: TBrush);
begin
FBrush.Assign(Value);
end;

procedure TMyShape.SetPen(Value: TPen);
begin
FPen.Assign(Value);
end;

procedure TMyShape.SetShape(Value: TMyShapeType);
begin
if FShape <> Value then
begin
FShape := Value;
Invalidate;
end;
end;

procedure TMyShape.SetPonits(const Value: TPoints);
var
i,x,y: Integer;
begin
FPonits := Value;
for i := 0 to Length(Value) - 1 do
begin
x := Value[i].X;
y := value[i].Y;
if Left > x then Left := x;
if Top > y then Top := y;
if Width < x then Width := x;
if Height < y then Height := y;
end;
Invalidate;
end;

end.


测试代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses MyShape;

var
shape: TMyShape;

procedure TForm1.Button1Click(Sender: TObject);
var
pts: TPoints;
i: Integer;
begin
Randomize;
SetLength(pts, Random(4)+3); {随机测试: 最少是三角形、最多是七边形}
for i := 0 to Length(pts) - 1 do
begin
pts[i].X := Random(ClientWidth);
pts[i].Y := Random(ClientHeight);
end;
shape.Ponits := pts;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
pts: TPoints;
begin
shape := TMyShape.Create(Self);

SetLength(pts, 4);
pts[0] := Point(ClientWidth div 2, 10);
pts[1] := Point(ClientWidth - 10, ClientHeight div 2);
pts[2] := Point(ClientWidth div 2, ClientHeight - 10);
pts[3] := Point(10, ClientHeight div 2);

shape.Ponits := pts;
shape.Shape := stPolygon;
shape.Parent := Self;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
shape.Free;
end;

end.

测试窗体:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 206
ClientWidth = 339
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 256
Top = 160
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐