Pies.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:4k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit Pies;
  2. interface
  3. uses Classes, Controls, Forms, Graphics, StdCtrls;
  4. type
  5.   //定义一个角度类,用于馅饼类的角度属性类型使用
  6.   TAngles = class(TPersistent)
  7.   private
  8.     FStartAngle: Integer; //开始角度
  9.     FEndAngle: Integer;//终止角度
  10.     FOnChange: TNotifyEvent;//变化事件
  11.     procedure SetStart(Value: Integer); //写属性StartAngle的方法
  12.     procedure SetEnd(Value: Integer); //写属性EndAngle的方法
  13.   public
  14.     procedure Assign(Value: TAngles); //给StartAngle,EndAngle属性赋值
  15.     procedure Changed; //过程,表示已改变
  16.   published
  17.     property StartAngle: Integer read FStartAngle write SetStart;
  18.     property EndAngle: Integer read FEndAngle write SetEnd;
  19.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  20.   end;
  21.   //定义馅饼类
  22.   TPie = class(TGraphicControl)
  23.     FPen: TPen; //定义画笔
  24.     FBrush: TBrush;//定义刷子
  25.     FEdit: TEdit; //
  26.     FAngles: TAngles; //定义角度
  27.     constructor Create(AOwner: TComponent); override;
  28.     procedure Paint; override;
  29.     procedure SetBrush(Value: TBrush); //设置刷子属性
  30.     procedure SetPen(Value: TPen); //设置画笔属性
  31.     procedure SetAngles(Value: TAngles); //设置角度属性
  32.     procedure StyleChanged(Sender: TObject);//当刷子、画笔、角度改变时,处理过程
  33.   published
  34.     property Angles: TAngles read FAngles write SetAngles;
  35.     property Brush: TBrush read FBrush write SetBrush;
  36.     property Pen: TPen read FPen write SetPen;
  37.     property OnClick;
  38.     property OnDblClick;
  39.     property OnDragDrop;
  40.     property OnDragOver;
  41.     property OnEndDrag;
  42.     property OnMouseDown;
  43.     property OnMouseMove;
  44.     property OnMouseUp;
  45.   end;
  46. implementation
  47. uses Windows;
  48. //=====TAngles类的实现==============//
  49. procedure TAngles.Assign(Value: TAngles);
  50. begin
  51.   StartAngle := Value.StartAngle;
  52.   EndAngle := Value.EndAngle;
  53. end;
  54. procedure TAngles.SetStart(Value: Integer);
  55. begin
  56.   if Value <> FStartAngle then
  57.   begin
  58.     FStartAngle := Value;
  59.     //给FOnchanged事件赋值,表示已改变
  60.     Changed;
  61.   end;
  62. end;
  63. procedure TAngles.SetEnd(Value: Integer);
  64. begin
  65.   if Value <> FEndAngle then
  66.   begin
  67.     FEndAngle := Value;
  68.     //给FOnchanged事件赋值,表示已改变
  69.     Changed;
  70.   end;
  71. end;
  72. procedure TAngles.Changed;
  73. begin
  74.   if Assigned(FOnChange) then FOnChange(Self);
  75. end;
  76. //====================TPie类的实现==========//
  77. constructor TPie.Create(AOwner: TComponent);
  78. begin
  79.   inherited Create(AOwner);
  80.   Width := 100;
  81.   Height := 100;
  82.   FPen := TPen.Create;
  83.   FPen.OnChange := StyleChanged;
  84.   FBrush := TBrush.Create;
  85.   FBrush.OnChange := StyleChanged;
  86.   FAngles := TAngles.Create;
  87.   FAngles.OnChange := StyleChanged;
  88.   FAngles.StartAngle := 180;
  89.   FAngles.EndAngle := 90;
  90. end;
  91. //当馅饼改变时,重画整个组件
  92. procedure TPie.StyleChanged(Sender: TObject);
  93. begin
  94.   Invalidate;
  95. end;
  96. //设置刷子属性
  97. procedure TPie.SetBrush(Value: TBrush);
  98. begin
  99.   FBrush.Assign(Value);
  100. end;
  101. //设置画笔属性
  102. procedure TPie.SetPen(Value: TPen);
  103. begin
  104.   FPen.Assign(Value);
  105. end;
  106. //设置角度属性
  107. procedure TPie.SetAngles(Value: TAngles);
  108. begin
  109.   FAngles.Assign(Value);
  110.   Invalidate;
  111. end;
  112. //重载paint过程
  113. procedure TPie.Paint;
  114. var
  115.   StartA, EndA: Integer;
  116.   midX, midY, stX, stY, endX, endY: Integer;
  117.   sX, sY, eX, eY: Real;
  118. begin
  119.   StartA := FAngles.StartAngle;
  120.   EndA := FAngles.EndAngle;
  121.   midX := Width div 2;
  122.   midY := Height div 2;
  123.   sX := Cos((StartA / 180.0) * pi);
  124.   sY := Sin((StartA / 180.0) * pi);
  125.   eX := Cos((EndA / 180.0) * pi);
  126.   eY := Sin((EndA / 180.0) * pi);
  127.   stX := Round(sX * 100);
  128.   stY := Round(sY * 100);
  129.   endX := Round(eX * 100);
  130.   endY := Round(eY * 100);
  131.   with Canvas do
  132.   begin
  133.     Pen := FPen;
  134.     Brush := FBrush;
  135.     Pie(0,0, Width,Height, midX + stX, midY - stY, midX + endX, midY - endY);
  136.   end;
  137. end;
  138. end.