MdWArrow.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit MdWArrow;
  2. interface
  3. uses
  4.   SysUtils, Windows, Messages, Classes,
  5.   Graphics, Controls, Forms, Dialogs;
  6. type
  7.   TMdWArrowDir = (adUp, adLeft, adDown, adRight);
  8.   TMdWArrow = class (TCustomControl)
  9.   private
  10.     fDirection: TMdWArrowDir;
  11.     fArrowHeight: Integer;
  12.     fFilled: Boolean;
  13.     fPen: TPen;
  14.     fBrush: TBrush;
  15.     fArrowDblClick: TNotifyEvent;
  16.     fArrowPoints: array [0..3] of TPoint;
  17.     procedure ComputePoints;
  18.     procedure SetDirection (Value: TMdWArrowDir);
  19.     procedure SetArrowHeight (Value: Integer);
  20.     procedure SetFilled (Value: Boolean);
  21.     procedure SetPen (Value: TPen);
  22.     procedure SetBrush (Value: TBrush);
  23.     procedure RepaintRequest (Sender: TObject);
  24.     procedure WMLButtonDblClk (var Msg: TWMLButtonDblClk);
  25.       message wm_LButtonDblClk;
  26.   protected
  27.     procedure Paint; override;
  28.     procedure ArrowDblClick; dynamic;
  29.   public
  30.     constructor Create (AOwner: TComponent); override;
  31.     destructor Destroy; override;
  32.     procedure SetBounds (ALeft, ATop, AWidth, AHeight: Integer); override;
  33.   published
  34.     property Width default 50;
  35.     property Height default 20;
  36.     property Direction: TMdWArrowDir
  37.       read fDirection write SetDirection default adRight;
  38.     property ArrowHeight: Integer
  39.       read fArrowHeight write SetArrowHeight default 10;
  40.     property Filled: Boolean
  41.       read fFilled write SetFilled default False;
  42.     property Pen: TPen
  43.       read fPen write SetPen;
  44.     property Brush: TBrush
  45.       read fBrush write SetBrush;
  46.     property OnClick;
  47.     property OnDragDrop;
  48.     property OnDragOver;
  49.     property OnEndDrag;
  50.     property OnMouseDown;
  51.     property OnMouseMove;
  52.     property OnMouseUp;
  53.     property OnArrowDblClick: TNotifyEvent
  54.       read fArrowDblClick write fArrowDblClick;
  55.   end;
  56. procedure Register;
  57. implementation
  58. {R ARROW4.DCR}
  59. constructor TMdWArrow.Create (AOwner: TComponent);
  60. begin
  61.   // call the parent constructor
  62.   inherited Create (AOwner);
  63.   // set the default values
  64.   fDirection := adRight;
  65.   Width := 50;
  66.   Height := 20;
  67.   fArrowHeight := 10;
  68.   fFilled := False;
  69.   // create the pen and the brush
  70.   fPen := TPen.Create;
  71.   fBrush := TBrush.Create;
  72.   // set a handler for the OnChange event
  73.   fPen.OnChange := RepaintRequest;
  74.   fBrush.OnChange := RepaintRequest;
  75. end;
  76. destructor TMdWArrow.Destroy;
  77. begin
  78.   // delete the two objects
  79.   fPen.Free;
  80.   fBrush.Free;
  81.   // call the parent destructor
  82.   inherited Destroy;
  83. end;
  84. procedure TMdWArrow.SetDirection (Value: TMdWArrowDir);
  85. begin
  86.   if fDirection <> Value then
  87.   begin
  88.     fDirection := Value;
  89.     ComputePoints;
  90.     Invalidate;
  91.   end;
  92. end;
  93. procedure TMdWArrow.SetArrowHeight (Value: Integer);
  94. begin
  95.   if fArrowHeight <> Value then
  96.   begin
  97.     fArrowHeight := Value;
  98.     ComputePoints;
  99.     Invalidate;
  100.   end;
  101. end;
  102. procedure TMdWArrow.SetFilled (Value: Boolean);
  103. begin
  104.   if fFilled <> Value then
  105.   begin
  106.     fFilled := Value;
  107.     Invalidate;
  108.   end;
  109. end;
  110. procedure TMdWArrow.SetPen (Value: TPen);
  111. begin
  112.   fPen.Assign(Value);
  113.   Invalidate;
  114. end;
  115. procedure TMdWArrow.SetBrush (Value: TBrush);
  116. begin
  117.   fBrush.Assign(Value);
  118.   Invalidate;
  119. end;
  120. procedure TMdWArrow.RepaintRequest (Sender: TObject);
  121. begin
  122.   Invalidate;
  123. end;
  124. procedure TMdWArrow.Paint;
  125. var
  126.   XCenter, YCenter: Integer;
  127. begin
  128.   // compute the center
  129.   YCenter := (Height - 1) div 2;
  130.   XCenter := (Width - 1) div 2;
  131.   // use the current pen and brush
  132.   Canvas.Pen := fPen;
  133.   Canvas.Brush := fBrush;
  134.   // draw the arrow line
  135.   case fDirection of
  136.     adUp: begin
  137.       Canvas.MoveTo (XCenter, Height-1);
  138.       Canvas.LineTo (XCenter, fArrowHeight);
  139.     end;
  140.     adDown: begin
  141.       Canvas.MoveTo (XCenter, 0);
  142.       Canvas.LineTo (XCenter, Height - 1 - fArrowHeight);
  143.     end;
  144.     adLeft: begin
  145.       Canvas.MoveTo (Width - 1, YCenter);
  146.       Canvas.LineTo (fArrowHeight, YCenter);
  147.     end;
  148.     adRight: begin
  149.       Canvas.MoveTo (0, YCenter);
  150.       Canvas.LineTo (Width - 1 - fArrowHeight, YCenter);
  151.     end;
  152.   end;
  153.   // draw the arrow head, eventually filling it
  154.   if fFilled then
  155.     Canvas.Polygon (fArrowPoints)
  156.   else
  157.     Canvas.PolyLine (fArrowPoints);
  158. end;
  159. procedure TMdWArrow.ArrowDblClick;
  160. begin
  161.   // call the handler, if available
  162.   if Assigned (fArrowDblClick) then
  163.     fArrowDblClick (Self);
  164. end;
  165. procedure Register;
  166. begin
  167.   RegisterComponents('Md', [TMdWArrow]);
  168. end;
  169. procedure TMdWArrow.ComputePoints;
  170. var
  171.   XCenter, YCenter: Integer;
  172. begin
  173.   // compute the points of the arrow head
  174.   YCenter := (Height - 1) div 2;
  175.   XCenter := (Width - 1) div 2;
  176.   // set the points depending on the direction
  177.   case fDirection of
  178.     adUp: begin
  179.       fArrowPoints [0] := Point (0, fArrowHeight);
  180.       fArrowPoints [1] := Point (XCenter, 0);
  181.       fArrowPoints [2] := Point (Width-1, fArrowHeight);
  182.       fArrowPoints [3] := Point (0, fArrowHeight);
  183.     end;
  184.     adDown: begin
  185.       fArrowPoints [0] := Point (XCenter, Height - 1);
  186.       fArrowPoints [1] := Point (0, Height - 1 - fArrowHeight);
  187.       fArrowPoints [2] := Point (Width - 1, Height - 1 - fArrowHeight);
  188.       fArrowPoints [3] := Point (XCenter, Height - 1);
  189.     end;
  190.     adLeft: begin
  191.       fArrowPoints [0] := Point (fArrowHeight, Height - 1);
  192.       fArrowPoints [1] := Point (0, YCenter);
  193.       fArrowPoints [2] := Point (fArrowHeight, 0);
  194.       fArrowPoints [3] := Point (fArrowHeight, Height - 1);
  195.     end;
  196.     adRight: begin
  197.       fArrowPoints [0] := Point (Width - 1 - fArrowHeight, Height - 1);
  198.       fArrowPoints [1] := Point (Width - 1 - fArrowHeight, 0);
  199.       fArrowPoints [2] := Point (Width - 1, YCenter);
  200.       fArrowPoints [3] := Point (Width - 1 - fArrowHeight, Height - 1);
  201.     end;
  202.   end; // case
  203. end;
  204. procedure TMdWArrow.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  205. begin
  206.   inherited SetBounds (ALeft, ATop, AWidth, AHeight);
  207.   ComputePoints;
  208. end;
  209. procedure TMdWArrow.WMLButtonDblClk(var Msg: TWMLButtonDblClk);
  210. var
  211.   HRegion: HRgn;
  212. begin
  213.   // perform default handling
  214.   inherited;
  215.   // compute the arrow head region
  216.   HRegion := CreatePolygonRgn (
  217.     fArrowPoints, 3, WINDING);
  218.   try
  219.     // check whether the click took place in the region
  220.     if PtInRegion (HRegion, Msg.XPos, Msg.YPos) then
  221.       ArrowDblClick;
  222.   finally
  223.     DeleteObject (HRegion);
  224.   end;
  225. end;
  226. end.