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

Delphi控件源码

开发平台:

Delphi

  1. {*****************************************************}
  2. {                                                     }
  3. {     Varian Component Workshop                       }
  4. {                                                     }
  5. {     Varian Software NL (c) 1996-2000                }
  6. {     All Rights Reserved                             }
  7. {                                                     }
  8. {*****************************************************}
  9. unit VrRaster;
  10. {$I VRLIB.INC}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   VrTypes, VrClasses, VrControls, VrSysUtils;
  15. type
  16.   TVrCustomRaster = class;
  17.   TVrRasterLed = class(TVrCollectionItem)
  18.   private
  19.     FActive: Boolean;
  20.     procedure SetActive(Value: Boolean);
  21.   public
  22.     constructor Create(Collection: TVrCollection); override;
  23.     property Active: Boolean read FActive write SetActive;
  24.   end;
  25.   TVrRasterLeds = class(TVrCollection)
  26.   private
  27.     FOwner: TVrCustomRaster;
  28.     function GetItem(Index: Integer): TVrRasterLed;
  29.   protected
  30.     procedure Update(Item: TVrCollectionItem); override;
  31.   public
  32.     constructor Create(AOwner: TVrCustomRaster);
  33.     property Items[Index: Integer]: TVrRasterLed read GetItem;
  34.   end;
  35.   TVrRasterStyle = (rsRaised, rsLowered, rsNone, rsFlat);
  36.   TVrCustomRaster = class(TVrGraphicImageControl)
  37.   private
  38.     FColumns: TVrColInt;
  39.     FRows: TVrRowInt;
  40.     FPalette: TVrPalette;
  41.     FStyle: TVrRasterStyle;
  42.     FPlainColors: Boolean;
  43.     FMultiSelect: Boolean;
  44.     FSpacing: Integer;
  45.     FBevel: TVrBevel;
  46.     ViewPort: TRect;
  47.     CellXSize: Integer;
  48.     CellYSize: Integer;
  49.     Collection: TVrRasterLeds;
  50.     function GetCount: Integer;
  51.     function GetItem(Index: Integer): TVrRasterLed;
  52.     procedure SetColumns(Value: TVrColInt);
  53.     procedure SetRows(Value: TVrRowInt);
  54.     procedure SetStyle(Value: TVrRasterStyle);
  55.     procedure SetPlainColors(Value: Boolean);
  56.     procedure SetMultiSelect(Value: Boolean);
  57.     procedure SetSpacing(Value: Integer);
  58.     procedure SetPalette(Value: TVrPalette);
  59.     procedure SetBevel(Value: TVrBevel);
  60.     procedure PaletteModified(Sender: TObject);
  61.     procedure BevelChanged(Sender: TObject);
  62.     procedure SetActiveState(Origin: Integer; State: Boolean);
  63.   protected
  64.     procedure CreateObjects;
  65.     procedure GetItemRect(Index: Integer; var R: TRect);
  66.     procedure CalcPaintParams;
  67.     procedure UpdateLed(Index: Integer);
  68.     procedure UpdateLeds;
  69.     procedure Paint; override;
  70.     property Columns: TVrColInt read FColumns write SetColumns default 5;
  71.     property Rows: TVrRowInt read FRows write SetRows default 5;
  72.     property Style: TVrRasterStyle read FStyle write SetStyle default rsLowered;
  73.     property Palette: TVrPalette read FPalette write SetPalette;
  74.     property PlainColors: boolean read FPlainColors write SetPlainColors default true;
  75.     property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default True;
  76.     property Spacing: Integer read FSpacing write SetSpacing default 2;
  77.     property Bevel: TVrBevel read FBevel write SetBevel;
  78.   public
  79.     constructor Create(AOwner: TComponent); override;
  80.     destructor Destroy; override;
  81.     property Count: Integer read GetCount;
  82.     property Items[Index: Integer]: TVrRasterLed read GetItem;
  83.   end;
  84.   TVrRaster = class(TVrCustomRaster)
  85.     property Columns;
  86.     property Rows;
  87.     property Style;
  88.     property Palette;
  89.     property PlainColors;
  90.     property MultiSelect;
  91.     property Spacing;
  92.     property Bevel;
  93. {$IFDEF VER110}
  94.     property Anchors;
  95.     property Constraints;
  96. {$ENDIF}
  97.     property Color;
  98.     property Cursor;
  99.     property DragMode;
  100. {$IFDEF VER110}
  101.     property DragKind;
  102. {$ENDIF}
  103.     property DragCursor;
  104.     property ParentColor default True;
  105.     property ParentShowHint;
  106.     property ShowHint;
  107.     property Visible;
  108.     property OnClick;
  109. {$IFDEF VER130}
  110.     property OnContextPopup;
  111. {$ENDIF}    
  112.     property OnDblClick;
  113.     property OnMouseMove;
  114.     property OnMouseDown;
  115.     property OnMouseUp;
  116.     property OnDragOver;
  117.     property OnDragDrop;
  118. {$IFDEF VER110}
  119.     property OnEndDock;
  120. {$ENDIF}
  121.     property OnEndDrag;
  122. {$IFDEF VER110}
  123.     property OnStartDock;
  124. {$ENDIF}
  125.     property OnStartDrag;
  126.   end;
  127. implementation
  128. { TVrRasterLed }
  129. constructor TVrRasterLed.Create(Collection: TVrCollection);
  130. begin
  131.   FActive := false;
  132.   inherited Create(Collection);
  133. end;
  134. procedure TVrRasterLed.SetActive(Value: Boolean);
  135. begin
  136.   if FActive <> Value then
  137.   begin
  138.     FActive := Value;
  139.     Changed(false);
  140.   end;
  141. end;
  142. { TVrRasterLeds }
  143. constructor TVrRasterLeds.Create(AOwner: TVrCustomRaster);
  144. begin
  145.   inherited Create;
  146.   FOwner := AOwner;
  147. end;
  148. function TVrRasterLeds.GetItem(Index: Integer): TVrRasterLed;
  149. begin
  150.   Result := TVrRasterLed(inherited Items[Index]);
  151. end;
  152. procedure TVrRasterLeds.Update(Item: TVrCollectionItem);
  153. begin
  154.   if Item <> nil then
  155.     FOwner.UpdateLed(Item.Index) else
  156.     FOwner.UpdateLeds;
  157. end;
  158. {TVrCustomRaster}
  159. constructor TVrCustomRaster.Create(AOwner: TComponent);
  160. begin
  161.   inherited Create(AOwner);
  162.   ControlStyle := ControlStyle + [csOpaque, csReplicatable];
  163.   Width := 145;
  164.   Height := 70;
  165.   ParentColor := true;
  166.   FStyle := rsLowered;
  167.   FMultiSelect := true;
  168.   FSpacing := 2;
  169.   FPalette := TVrPalette.Create;
  170.   FPalette.OnChange := PaletteModified;
  171.   FPlainColors := true;
  172.   FColumns := 5;
  173.   FRows := 5;
  174.   FBevel := TVrBevel.Create;
  175.   with FBevel do
  176.   begin
  177.     InnerStyle := bsNone;
  178.     InnerWidth := 1;
  179.     InnerSpace := 0;
  180.     InnerColor := clBlack;
  181.     OnChange := BevelChanged;
  182.   end;
  183.   Collection := TVrRasterLeds.Create(Self);
  184.   CreateObjects;
  185. end;
  186. destructor TVrCustomRaster.Destroy;
  187. begin
  188.   FPalette.Free;
  189.   FBevel.Free;
  190.   Collection.Free;
  191.   inherited Destroy;
  192. end;
  193. procedure TVrCustomRaster.CreateObjects;
  194. var
  195.   I, N: Integer;
  196. begin
  197.   Collection.Clear;
  198.   N := FColumns * FRows;
  199.   for I := 0 to Pred(N) do
  200.     TVrRasterLed.Create(Collection);
  201. end;
  202. function TVrCustomRaster.GetCount: Integer;
  203. begin
  204.   Result := Collection.Count;
  205. end;
  206. function TVrCustomRaster.GetItem(Index: Integer): TVrRasterLed;
  207. begin
  208.   Result := Collection.Items[Index];
  209. end;
  210. procedure TVrCustomRaster.PaletteModified(Sender: TObject);
  211. begin
  212.   UpdateControlCanvas;
  213. end;
  214. procedure TVrCustomRaster.BevelChanged(Sender: TObject);
  215. var
  216.   R: TRect;
  217. begin
  218.   if not Loading then
  219.   begin
  220.     R := ClientRect;
  221.     FBevel.GetVisibleArea(R);
  222.     InflateRect(ViewPort, R.Left, R.Top);
  223.     BoundsRect := Bounds(Left, Top, WidthOf(ViewPort),
  224.       HeightOf(ViewPort));
  225.   end;
  226.   UpdateControlCanvas;
  227. end;
  228. procedure TVrCustomRaster.SetActiveState(Origin: Integer; State: Boolean);
  229. var
  230.   I: Integer;
  231. begin
  232.   for I := 0 to Pred(Count) do
  233.     if I <> Origin then Collection.Items[I].Active := State;
  234. end;
  235. procedure TVrCustomRaster.UpdateLed(Index: Integer);
  236. var
  237.   R: TRect;
  238.   Item: TVrRasterLed;
  239.   function GetCurrentColor(Value: Boolean): TColor;
  240.   begin
  241.     Result := FPalette.Low;
  242.     if Value then Result := FPalette.High;
  243.   end;
  244. begin
  245.   Item := Collection.Items[Index];
  246.   if (Item.Active) and (not FMultiSelect) then
  247.     SetActiveState(Index, false);
  248.   GetItemRect(Index, R);
  249.   InflateRect(R, -FSpacing, -FSpacing);
  250.   case FStyle of
  251.     rsRaised:
  252.       begin
  253.         DrawOutline3D(DestCanvas, R, clBlack, clBlack, 1);
  254.         if not FPlainColors then
  255.           DrawOutline3D(DestCanvas, R, GetCurrentColor(Item.Active), clBlack, 1)
  256.         else
  257.         begin
  258.           if not Item.Active then
  259.             DrawOutline3D(DestCanvas, R, FPalette.High, FPalette.Low, 1)
  260.           else DrawOutline3D(DestCanvas, R, clBtnHighlight, FPalette.High, 1);
  261.         end;
  262.       end;
  263.     rsLowered:
  264.       begin
  265.         DrawOutline3D(DestCanvas, R, clBtnShadow, clBtnHighlight, 1);
  266.         DrawOutline3D(DestCanvas, R, clBlack, clBlack, 1);
  267.       end;
  268.     rsFlat:
  269.       DrawOutline3D(DestCanvas, R, clBlack, clBlack, 1);
  270.     rsNone:;
  271.   end;
  272.   with DestCanvas do
  273.   begin
  274.     if FPlainColors then
  275.     begin
  276.       Brush.Style := bsSolid;
  277.       Brush.Color := GetCurrentColor(Item.Active);
  278.       FillRect(R);
  279.     end
  280.     else DrawGradient(DestCanvas, R,
  281.       GetCurrentColor(Item.Active), clBlack, voVertical, 1);
  282.   end;
  283. end;
  284. procedure TVrCustomRaster.UpdateLeds;
  285. var
  286.   I: Integer;
  287. begin
  288.   for I := 0 to Count - 1 do
  289.     UpdateLed(I);
  290. end;
  291. procedure TVrCustomRaster.Paint;
  292. var
  293.   R: TRect;
  294. begin
  295.   CalcPaintParams;
  296.   ClearBitmapCanvas;
  297.   DestCanvas := BitmapCanvas;
  298.   try
  299.     R := ClientRect;
  300.     FBevel.Paint(DestCanvas, R);
  301.     UpdateLeds;
  302.     inherited Paint;
  303.   finally
  304.     DestCanvas := Self.Canvas;
  305.   end;
  306. end;
  307. procedure TVrCustomRaster.CalcPaintParams;
  308. var
  309.   NewWidth, NewHeight: Integer;
  310. begin
  311.   ViewPort := ClientRect;
  312.   FBevel.GetVisibleArea(ViewPort);
  313.   CellXSize := WidthOf(ViewPort) div FColumns;
  314.   CellYSize := HeightOf(ViewPort) div FRows;
  315.   NewWidth := (ViewPort.Left * 2) + (CellXSize * FColumns);
  316.   NewHeight := (ViewPort.Top * 2) + (CellYSize * FRows);
  317.   if (NewWidth <> Width) or (NewHeight <> Height) then
  318.     BoundsRect := Bounds(Left, Top, NewWidth, NewHeight);
  319. end;
  320. procedure TVrCustomRaster.GetItemRect(Index: Integer; var R: TRect);
  321. var
  322.   X, Y: Integer;
  323. begin
  324.   X := (Index mod FColumns) * CellXSize;
  325.   Y := (Index div FColumns) * CellYSize;
  326.   R := Bounds(ViewPort.Left + X, ViewPort.Top + Y, CellXSize, CellYSize);
  327. end;
  328. procedure TVrCustomRaster.SetPalette(Value: TVrPalette);
  329. begin
  330.   FPalette.Assign(Value);
  331. end;
  332. procedure TVrCustomRaster.SetBevel(Value: TVrBevel);
  333. begin
  334.   FBevel.Assign(Value);
  335. end;
  336. procedure TVrCustomRaster.SetColumns(Value: TVrColInt);
  337. begin
  338.   if (FColumns <> Value) then
  339.   begin
  340.     FColumns := Value;
  341.     CreateObjects;
  342.     UpdateControlCanvas;
  343.   end;
  344. end;
  345. procedure TVrCustomRaster.SetRows(Value: TVrRowInt);
  346. begin
  347.   if (FRows <> Value) then
  348.   begin
  349.     FRows := Value;
  350.     CreateObjects;
  351.     UpdateControlCanvas;
  352.   end;
  353. end;
  354. procedure TVrCustomRaster.SetStyle(Value: TVrRasterStyle);
  355. begin
  356.   if FStyle <> Value then
  357.   begin
  358.     FStyle := Value;
  359.     UpdateControlCanvas;
  360.   end;
  361. end;
  362. procedure TVrCustomRaster.SetMultiSelect(Value: Boolean);
  363. begin
  364.   if FMultiSelect <> Value then
  365.   begin
  366.     FMultiSelect := Value;
  367.     if not Value then SetActiveState(-1, false)
  368.       else UpdateLeds;
  369.   end;
  370. end;
  371. procedure TVrCustomRaster.SetPlainColors(Value: Boolean);
  372. begin
  373.   if FPlainColors <> Value then
  374.   begin
  375.     FPlainColors := Value;
  376.     UpdateControlCanvas;
  377.   end;
  378. end;
  379. procedure TVrCustomRaster.SetSpacing(Value: Integer);
  380. begin
  381.   if (FSpacing <> Value) and (Value >= 0) then
  382.   begin
  383.     FSpacing := Value;
  384.     UpdateControlCanvas;
  385.   end;
  386. end;
  387. end.