VrLights.pas
上传用户:hbszzs
上传日期:2008-08-20
资源大小:628k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*****************************************************}
  2. {                                                     }
  3. {     Varian Component Workshop                       }
  4. {                                                     }
  5. {     Varian Software NL (c) 1996-2000                }
  6. {     All Rights Reserved                             }
  7. {                                                     }
  8. {*****************************************************}
  9. unit VrLights;
  10. {$I VRLIB.INC}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
  14.   VrTypes, VrClasses, VrControls, VrSysUtils;
  15. type
  16.   TVrLightsState = (lsGreen, lsYellow, lsRed);
  17.   TVrLightsStates = set of TVrLightsState;
  18.   TVrLightsVisible = set of TVrLightsState;
  19.   TVrLightsOrder = (loGreenToRed, loRedToGreen);
  20.   TVrLightsType = (ltGlassRounded, ltGlassRect, ltGlassSquare, ltGlassDiamond);
  21.   TVrLightsImages = array[0..1] of TBitmap;
  22.   TVrLights = class(TVrGraphicImageControl)
  23.   private
  24.     FLedState: TVrLightsStates;
  25.     FSpacing: Integer;
  26.     FOrder: TVrLightsOrder;
  27.     FOrientation: TVrOrientation;
  28.     FLedType: TVrLightsType;
  29.     FNumLeds: Integer;
  30.     FLedsVisible: TVrLightsVisible;
  31.     FImages: TVrLightsImages;
  32.     FImageWidth: Integer;
  33.     FImageHeight: Integer;
  34.     FOnChange: TNotifyEvent;
  35.     procedure SetLedState(Value: TVrLightsStates);
  36.     procedure SetSpacing(Value: Integer);
  37.     procedure SetOrder(Value: TVrLightsOrder);
  38.     procedure SetOrientation(Value: TVrOrientation);
  39.     procedure SetLedsVisible(Value: TVrLightsVisible);
  40.     procedure SetLedType(Value: TVrLightsType);
  41.   protected
  42.     procedure LoadBitmaps; virtual;
  43.     procedure DrawLed(X, Y, Index: Integer; Active: Boolean);
  44.     procedure DrawHori;
  45.     procedure DrawVert;
  46.     procedure Paint; override;
  47.     procedure Change; dynamic;
  48.   public
  49.     constructor Create(AOwner: TComponent); override;
  50.     destructor Destroy; override;
  51.   published
  52.     property LedState: TVrLightsStates read FLedState write SetLedState default [];
  53.     property Spacing: Integer read FSpacing write SetSpacing default 5;
  54.     property Order: TVrLightsOrder read FOrder write SetOrder default loGreenToRed;
  55.     property Orientation: TVrOrientation read FOrientation write SetOrientation default voHorizontal;
  56.     property LedsVisible: TVrLightsVisible read FLedsVisible write SetLedsVisible default [lsGreen, lsYellow, lsRed];
  57.     property LedType: TVrLightsType read FLedType write SetLedType default ltGlassRect;
  58.     property Transparent default false;
  59.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  60.     property Align;
  61. {$IFDEF VER110}
  62.     property Anchors;
  63.     property Constraints;
  64. {$ENDIF}
  65.     property Color default clBlack;
  66.     property DragCursor;
  67. {$IFDEF VER110}
  68.     property DragKind;
  69. {$ENDIF}
  70.     property DragMode;
  71.     property Hint;
  72.     property ParentColor default false;
  73.     property ParentShowHint;
  74.     property PopupMenu;
  75.     property ShowHint;
  76.     property Visible;
  77.     property OnClick;
  78. {$IFDEF VER130}
  79.     property OnContextPopup;
  80. {$ENDIF}    
  81.     property OnDblClick;
  82.     property OnDragDrop;
  83.     property OnDragOver;
  84. {$IFDEF VER110}
  85.     property OnEndDock;
  86. {$ENDIF}
  87.     property OnEndDrag;
  88.     property OnMouseDown;
  89.     property OnMouseMove;
  90.     property OnMouseUp;
  91. {$IFDEF VER110}
  92.     property OnStartDock;
  93. {$ENDIF}
  94.     property OnStartDrag;
  95.   end;
  96. implementation
  97. {$R VRLIGHTS.D32}
  98. const
  99.   ResId: array[TVrLightsType] of PChar =
  100.     ('RND', 'RECT', 'SQR', 'DMD');
  101. {TVrLights}
  102. constructor TVrLights.Create(AOwner: TComponent);
  103. begin
  104.   inherited Create(AOwner);
  105.   ControlStyle := ControlStyle + [csOpaque];
  106.   Width := 80;
  107.   Height := 45;
  108.   ParentColor := false;
  109.   Color := clBlack;
  110.   FSpacing := 5;
  111.   FOrder := loGreenToRed;
  112.   FOrientation := voHorizontal;
  113.   FNumLeds := 3;
  114.   FLedsVisible := [lsGreen, lsYellow, lsRed];
  115.   FLedType := ltGlassRect;
  116.   AllocateBitmaps(FImages);
  117.   LoadBitmaps;
  118. end;
  119. destructor TVrLights.Destroy;
  120. begin
  121.   DeallocateBitmaps(FImages);
  122.   inherited Destroy;
  123. end;
  124. procedure TVrLights.LoadBitmaps;
  125. var
  126.   ResName: array[0..40] of Char;
  127. begin
  128.   FImages[0].Handle := LoadBitmap(HInstance,
  129.     StrFmt(ResName, 'LIGHTS_%s_%s', [ResId[FLedType], 'OFF']));
  130.   FImages[1].Handle := LoadBitmap(hInstance,
  131.     StrFmt(ResName, 'LIGHTS_%s_%s', [ResId[FLedType], 'ON']));
  132.   FImageWidth := FImages[0].Width div 3;
  133.   FImageHeight := FImages[0].Height;
  134. end;
  135. procedure TVrLights.SetLedState(Value: TVrLightsStates);
  136. begin
  137.   if FLedState <> Value then
  138.   begin
  139.     FLedState := Value;
  140.     UpdateControlCanvas;
  141.     Change;
  142.   end;
  143. end;
  144. procedure TVrLights.SetSpacing(Value: Integer);
  145. begin
  146.   if FSpacing <> Value then
  147.   begin
  148.     FSpacing := Value;
  149.     UpdateControlCanvas;
  150.   end;
  151. end;
  152. procedure TVrLights.SetOrder(Value: TVrLightsOrder);
  153. begin
  154.   if FOrder <> Value then
  155.   begin
  156.     FOrder := Value;
  157.     UpdateControlCanvas;
  158.   end;
  159. end;
  160. procedure TVrLights.SetOrientation(Value: TVrOrientation);
  161. begin
  162.   if FOrientation <> Value then
  163.   begin
  164.     FOrientation := Value;
  165.     UpdateControlCanvas;
  166.   end;
  167. end;
  168. procedure TVrLights.SetLedsVisible(Value: TVrLightsVisible);
  169. var
  170.   I: Integer;
  171. begin
  172.   if FLedsVisible <> Value then
  173.   begin
  174.     FLedsVisible := Value;
  175.     FNumLeds := 0;
  176.     for I := 0 to 2 do
  177.       if TVrLightsState(I) in Value then Inc(FNumLeds);
  178.     UpdateControlCanvas;
  179.   end;
  180. end;
  181. procedure TVrLights.SetLedType(Value: TVrLightsType);
  182. begin
  183.   if FLedType <> Value then
  184.   begin
  185.     FLedType := Value;
  186.     LoadBitmaps;
  187.     UpdateControlCanvas;
  188.   end;
  189. end;
  190. procedure TVrLights.Change;
  191. begin
  192.   if Assigned(FOnChange) then FOnChange(Self);
  193. end;
  194. procedure TVrLights.DrawLed(X, Y, Index: Integer; Active: Boolean);
  195. var
  196.   D, R: TRect;
  197. begin
  198.   with BitmapCanvas do
  199.   begin
  200.     Brush.Style := bsClear;
  201.     D := Bounds(X, Y, FImageWidth, FImageHeight);
  202.     R := Bounds(Index * FImageWidth, 0, FImageWidth, FImageHeight);
  203.     BrushCopy(D, FImages[ord(Active)], R, clBlack);
  204.   end;
  205. end;
  206. procedure TVrLights.DrawHori;
  207. var
  208.   X, Y, I: Integer;
  209. begin
  210.   X := (FNumLeds * FImageWidth) + (Pred(FNumLeds) * FSpacing);
  211.   X := (ClientWidth - X) div 2;
  212.   Y := (ClientHeight - FImageHeight) div 2;
  213.   case FOrder of
  214.     loGreenToRed:
  215.       for I := 0 to 2 do
  216.       begin
  217.         if not (TVrLightsState(I) in FLedsVisible) then
  218.           Continue;
  219.         DrawLed(X, Y, I, TVrLightsState(I) in FLedState);
  220.         Inc(X, FImageWidth + FSpacing);
  221.       end;
  222.     loRedToGreen:
  223.       for I := 2 downto 0 do
  224.       begin
  225.         if not (TVrLightsState(I) in FLedsVisible) then
  226.           Continue;
  227.         DrawLed(X, Y, I, TVrLightsState(I) in FLedState);
  228.         Inc(X, FImageWidth + FSpacing);
  229.       end;
  230.   end;
  231. end;
  232. procedure TVrLights.DrawVert;
  233. var
  234.   X, Y, I: Integer;
  235. begin
  236.   X := (ClientWidth - FImageWidth) div 2;
  237.   Y := (FNumLeds * FImageHeight) + (Pred(FNumLeds) * FSpacing);
  238.   Y := (ClientHeight - Y) div 2;
  239.   case FOrder of
  240.     loGreenToRed:
  241.       for I := 0 to 2 do
  242.       begin
  243.         if not (TVrLightsState(I) in FLedsVisible) then
  244.           Continue;
  245.         DrawLed(X, Y, I, TVrLightsState(I) in FLedState);
  246.         Inc(Y, FImageHeight + FSpacing);
  247.       end;
  248.     loRedToGreen:
  249.       for I := 2 downto 0 do
  250.       begin
  251.         if not (TVrLightsState(I) in FLedsVisible) then
  252.           Continue;
  253.         DrawLed(X, Y, I, TVrLightsState(I) in FLedState);
  254.         Inc(Y, FImageHeight + FSpacing);
  255.       end;
  256.   end;
  257. end;
  258. procedure TVrLights.Paint;
  259. begin
  260.   ClearBitmapCanvas;
  261.   if FOrientation = voHorizontal then
  262.     DrawHori else DrawVert;
  263.   inherited Paint;
  264. end;
  265. end.