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

Delphi控件源码

开发平台:

Delphi

  1. unit MdArrow;
  2. interface
  3. uses
  4.   SysUtils, Windows, Messages, Classes,
  5.   Graphics, Controls, Forms, Dialogs;
  6. type
  7.   TMdArrowDir = (adUp, adLeft, adDown, adRight);
  8.   TMdArrow = class (TGraphicControl)
  9.   private
  10.     fDirection: TMdArrowDir;
  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: TMdArrowDir);
  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: TMdArrowDir
  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. implementation
  57. constructor TMdArrow.Create (AOwner: TComponent);
  58. begin
  59.   // call the parent constructor
  60.   inherited Create (AOwner);
  61.   // set the default values
  62.   fDirection := adRight;
  63.   Width := 50;
  64.   Height := 20;
  65.   fArrowHeight := 10;
  66.   fFilled := False;
  67.   // create the pen and the brush
  68.   fPen := TPen.Create;
  69.   fBrush := TBrush.Create;
  70.   // set a handler for the OnChange event
  71.   fPen.OnChange := RepaintRequest;
  72.   fBrush.OnChange := RepaintRequest;
  73. end;
  74. destructor TMdArrow.Destroy;
  75. begin
  76.   // delete the two objects
  77.   fPen.Free;
  78.   fBrush.Free;
  79.   // call the parent destructor
  80.   inherited Destroy;
  81. end;
  82. procedure TMdArrow.SetDirection (Value: TMdArrowDir);
  83. begin
  84.   if fDirection <> Value then
  85.   begin
  86.     fDirection := Value;
  87.     ComputePoints;
  88.     Invalidate;
  89.   end;
  90. end;
  91. procedure TMdArrow.SetArrowHeight (Value: Integer);
  92. begin
  93.   if fArrowHeight <> Value then
  94.   begin
  95.     fArrowHeight := Value;
  96.     ComputePoints;
  97.     Invalidate;
  98.   end;
  99. end;
  100. procedure TMdArrow.SetFilled (Value: Boolean);
  101. begin
  102.   if fFilled <> Value then
  103.   begin
  104.     fFilled := Value;
  105.     Invalidate;
  106.   end;
  107. end;
  108. procedure TMdArrow.SetPen (Value: TPen);
  109. begin
  110.   fPen.Assign(Value);
  111.   Invalidate;
  112. end;
  113. procedure TMdArrow.SetBrush (Value: TBrush);
  114. begin
  115.   fBrush.Assign(Value);
  116.   Invalidate;
  117. end;
  118. procedure TMdArrow.RepaintRequest (Sender: TObject);
  119. begin
  120.   Invalidate;
  121. end;
  122. procedure TMdArrow.Paint;
  123. var
  124.   XCenter, YCenter: Integer;
  125. begin
  126.   // compute the center
  127.   YCenter := (Height - 1) div 2;
  128.   XCenter := (Width - 1) div 2;
  129.   // use the current pen and brush
  130.   Canvas.Pen := fPen;
  131.   Canvas.Brush := fBrush;
  132.   // draw the arrow line
  133.   case fDirection of
  134.     adUp: begin
  135.       Canvas.MoveTo (XCenter, Height-1);
  136.       Canvas.LineTo (XCenter, fArrowHeight);
  137.     end;
  138.     adDown: begin
  139.       Canvas.MoveTo (XCenter, 0);
  140.       Canvas.LineTo (XCenter, Height - 1 - fArrowHeight);
  141.     end;
  142.     adLeft: begin
  143.       Canvas.MoveTo (Width - 1, YCenter);
  144.       Canvas.LineTo (fArrowHeight, YCenter);
  145.     end;
  146.     adRight: begin
  147.       Canvas.MoveTo (0, YCenter);
  148.       Canvas.LineTo (Width - 1 - fArrowHeight, YCenter);
  149.     end;
  150.   end;
  151.   // draw the arrow head, eventually filling it
  152.   if fFilled then
  153.     Canvas.Polygon (fArrowPoints)
  154.   else
  155.     Canvas.PolyLine (fArrowPoints);
  156. end;
  157. procedure TMdArrow.ArrowDblClick;
  158. begin
  159.   // call the handler, if available
  160.   if Assigned (fArrowDblClick) then
  161.     fArrowDblClick (Self);
  162. end;
  163. procedure TMdArrow.ComputePoints;
  164. var
  165.   XCenter, YCenter: Integer;
  166. begin
  167.   // compute the points of the arrow head
  168.   YCenter := (Height - 1) div 2;
  169.   XCenter := (Width - 1) div 2;
  170.   // set the points depending on the direction
  171.   case fDirection of
  172.     adUp: begin
  173.       fArrowPoints [0] := Point (0, fArrowHeight);
  174.       fArrowPoints [1] := Point (XCenter, 0);
  175.       fArrowPoints [2] := Point (Width-1, fArrowHeight);
  176.       fArrowPoints [3] := Point (0, fArrowHeight);
  177.     end;
  178.     adDown: begin
  179.       fArrowPoints [0] := Point (XCenter, Height - 1);
  180.       fArrowPoints [1] := Point (0, Height - 1 - fArrowHeight);
  181.       fArrowPoints [2] := Point (Width - 1, Height - 1 - fArrowHeight);
  182.       fArrowPoints [3] := Point (XCenter, Height - 1);
  183.     end;
  184.     adLeft: begin
  185.       fArrowPoints [0] := Point (fArrowHeight, Height - 1);
  186.       fArrowPoints [1] := Point (0, YCenter);
  187.       fArrowPoints [2] := Point (fArrowHeight, 0);
  188.       fArrowPoints [3] := Point (fArrowHeight, Height - 1);
  189.     end;
  190.     adRight: begin
  191.       fArrowPoints [0] := Point (Width - 1 - fArrowHeight, Height - 1);
  192.       fArrowPoints [1] := Point (Width - 1 - fArrowHeight, 0);
  193.       fArrowPoints [2] := Point (Width - 1, YCenter);
  194.       fArrowPoints [3] := Point (Width - 1 - fArrowHeight, Height - 1);
  195.     end;
  196.   end; // case
  197. end;
  198. procedure TMdArrow.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  199. begin
  200.   inherited SetBounds (ALeft, ATop, AWidth, AHeight);
  201.   ComputePoints;
  202. end;
  203. procedure TMdArrow.WMLButtonDblClk(var Msg: TWMLButtonDblClk);
  204. var
  205.   HRegion: HRgn;
  206. begin
  207.   // perform default handling
  208.   inherited;
  209.   // compute the arrow head region
  210.   HRegion := CreatePolygonRgn (
  211.     fArrowPoints, 3, WINDING);
  212.   try
  213.     // check whether the click took place in the region
  214.     if PtInRegion (HRegion, Msg.XPos, Msg.YPos) then
  215.       ArrowDblClick;
  216.   finally
  217.     DeleteObject (HRegion);
  218.   end;
  219. end;
  220. end.