fcdbimager.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:25k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit fcdbimager;
  2. {
  3. //
  4. // Components : TfcImager
  5. //
  6. // Copyright (c) 1999 by Woll2Woll Software
  7. // 4/21/99 - RSW - Added CopyToClipboard method
  8. // 8/2/99 - Check if parent is nil in BitmapChange event.
  9. }
  10. interface
  11. uses
  12.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  13.   fcCommon, fcBitmap, fcChangeLink;
  14. {$i fcIfDef.pas}
  15. type
  16.   TfcImagerDrawStyle = (dsNormal, dsCenter, dsStretch, dsTile, dsProportional);
  17.   TfcBitmapOptions = class;
  18.   TfcRotate = class(TPersistent)
  19.   private
  20.     FBitmapOptions: TfcBitmapOptions;
  21.     FCenterX: Integer;
  22.     FCenterY: Integer;
  23.     FAngle: Integer;
  24.     procedure SetAngle(Value: Integer);
  25.     procedure SetCenterX(Value: Integer);
  26.     procedure SetCenterY(Value: Integer);
  27.   public
  28.     constructor Create(BitmapOptions: TfcBitmapOptions);
  29.   published
  30.     property CenterX: Integer read FCenterX write SetCenterX;
  31.     property CenterY: Integer read FCenterY write SetCenterY;
  32.     property Angle: Integer read FAngle write SetAngle;
  33.   end;
  34.   TfcAlphaBlend = class(TPersistent)
  35.   private
  36.     FBitmapOptions: TfcBitmapOptions;
  37.     FAmount: Byte;
  38.     FBitmap: TfcBitmap;
  39.     FChanging: Boolean;
  40.     function GetTransparent: Boolean;
  41.     procedure SetAmount(Value: Byte);
  42.     procedure SetBitmap(Value: TfcBitmap);
  43.     procedure SetTransparent(Value: Boolean);
  44.   protected
  45.     procedure BitmapChanged(Sender: TObject); virtual;
  46.   public
  47.     constructor Create(BitmapOptions: TfcBitmapOptions);
  48.     destructor Destroy; override;
  49.   published
  50.     property Amount: Byte read FAmount write SetAmount;
  51.     property Bitmap: TfcBitmap read FBitmap write SetBitmap;
  52.     property Transparent: Boolean read GetTransparent write SetTransparent;
  53.   end;
  54.   TfcWave = class(TPersistent)
  55.   private
  56.     FBitmapOptions: TfcBitmapOptions;
  57.     FXDiv, FYDiv, FRatio: Integer;
  58.     FWrap: Boolean;
  59.     procedure SetXDiv(Value: Integer);
  60.     procedure SetYDiv(Value: Integer);
  61.     procedure SetRatio(Value: Integer);
  62.     procedure SetWrap(Value: Boolean);
  63.   public
  64.     constructor Create(BitmapOptions: TfcBitmapOptions);
  65.   published
  66.     property XDiv: Integer read FXDiv write SetXDiv;
  67.     property YDiv: Integer read FYDiv write SetYDiv;
  68.     property Ratio: Integer read FRatio write SetRatio;
  69.     property Wrap: Boolean read FWrap write SetWrap;
  70.   end;
  71.   TfcBitmapOptions = class(TPersistent)
  72.   private
  73.     FComponent: TComponent;
  74.     FAlphaBlend: TfcAlphaBlend;
  75.     FColor: TColor;
  76.     FContrast: Integer;
  77.     FEmbossed: Boolean;
  78.     FTintColor: TColor;
  79.     FGaussianBlur: Integer;
  80.     FGrayScale: Boolean;
  81.     FHorizontallyFlipped: Boolean;
  82.     FInverted: Boolean;
  83.     FLightness: Integer;
  84.     FRotation: TfcRotate;
  85.     FSaturation: Integer;
  86.     FSharpen: Integer;
  87.     FSponge: Integer;
  88.     FTile: Boolean;
  89.     FVerticallyFlipped: Boolean;
  90.     FWave: TfcWave;
  91.     FOnChange: TNotifyEvent;
  92.     FOrigPicture: TPicture;
  93.     FDestBitmap: TfcBitmap;
  94.     FUpdateLock: Integer;
  95.     // Property Access methods;
  96.     procedure SetColor(Value: TColor);
  97.     procedure SetBooleanProperty(Index: Integer; Value: Boolean);
  98.     procedure SetTintColor(Value: TColor);
  99.     procedure SetIntegralProperty(Index: Integer; Value: Integer);
  100.   public
  101.     constructor Create(AComponent: TComponent);
  102.     destructor Destroy; override;
  103.     procedure BeginUpdate; virtual;
  104.     procedure Changed; virtual;
  105.     procedure EndUpdate;
  106.     property DestBitmap: TfcBitmap read FDestBitmap write FDestBitmap;
  107.     property OrigPicture: TPicture read FOrigPicture write FOrigPicture;
  108.     property Tile: Boolean read FTile write FTile;
  109.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  110.   published
  111.     property AlphaBlend: TfcAlphaBlend read FAlphaBlend write FAlphaBlend;
  112.     property Color: TColor read FColor write SetColor;
  113.     property Contrast: Integer index 4 read FContrast write SetIntegralProperty;
  114.     property Embossed: Boolean index 0 read FEmbossed write SetBooleanProperty;
  115.     property TintColor: TColor read FTintColor write SetTintColor;
  116.     property GaussianBlur: Integer index 3 read FGaussianBlur write SetIntegralProperty;
  117.     property GrayScale: Boolean index 2 read FGrayScale write SetBooleanProperty;
  118.     property HorizontallyFlipped: Boolean index 3 read FHorizontallyFlipped write SetBooleanProperty;
  119.     property Inverted: Boolean index 1 read FInverted write SetBooleanProperty;
  120.     property Lightness: Integer index 0 read FLightness write SetIntegralProperty;
  121.     property Rotation: TfcRotate read FRotation write FRotation;
  122.     property Saturation: Integer index 1 read FSaturation write SetIntegralProperty;
  123.     property Sharpen: Integer index 5 read FSharpen write SetIntegralProperty;
  124.     property Sponge: Integer index 2 read FSponge write SetIntegralProperty;
  125.     property VerticallyFlipped: Boolean index 4 read FVerticallyFlipped write SetBooleanProperty;
  126.     property Wave: TfcWave read FWave write FWave;
  127.   end;
  128.   TfcCustomImager = class(TGraphicControl)
  129.   private
  130.     { Private declarations }
  131.     FAutoSize: Boolean;
  132.     FBitmapOptions: TfcBitmapOptions;
  133.     FDrawStyle: TfcImagerDrawStyle;
  134.     FEraseBackground: Boolean;
  135.     FPreProcess: Boolean;
  136.     FWorkBitmap: TfcBitmap;
  137. //    FBitmap: TfcBitmap;
  138.     FPicture: TPicture;
  139.     FChangeLinks: TList;
  140.     FRespectPalette: boolean;
  141.     function GetRespectPalette: Boolean;
  142.     function GetSmoothStretching: Boolean;
  143.     function GetTransparent: Boolean;
  144.     function GetTransparentColor: TColor;
  145.     procedure SetAutoSize(Value: Boolean);
  146. //    procedure SetBitmap(Value: TfcBitmap);
  147.     procedure SetDrawStyle(Value: TfcImagerDrawStyle);
  148.     procedure SetEraseBackground(Value: Boolean);
  149.     procedure SetPreProcess(Value: Boolean);
  150.     procedure SetPicture(Value: TPicture);
  151.     procedure SetRespectPalette(Value: Boolean);
  152.     procedure SetSmoothStretching(Value: Boolean);
  153.     procedure SetTransparent(Value: Boolean);
  154.     procedure SetTransparentColor(Value: TColor);
  155.     function GetDrawRect: TRect;
  156.     procedure NotifyChanges;
  157.   protected
  158.     procedure SetParent(Value: TWinControl); override;
  159.     procedure BitmapOptionsChange(Sender: TObject); virtual;
  160.     procedure BitmapChange(Sender: TObject);
  161.     procedure UpdateAutoSize; virtual;
  162.     procedure Loaded; override;
  163.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  164.     procedure Paint; override;
  165.     procedure WndProc(var Message: TMessage); override;
  166. //    procedure ParentMessages(var Message: TMessage; var ProcessMessage: Boolean); virtual;
  167.     property EraseBackground: Boolean read FEraseBackground write SetEraseBackground default True;
  168.   public
  169.     UpdatingAutoSize: Boolean;
  170.     InSetBounds: boolean;
  171.     Patch: Variant;
  172.     constructor Create(AOwner: TComponent); override;
  173.     destructor Destroy; override;
  174.     function PictureEmpty: Boolean; virtual;
  175.     procedure Invalidate; override;
  176.     procedure RegisterChanges(ChangeLink: TfcChangeLink); virtual;
  177.     procedure Resized; virtual;
  178.     procedure UpdateWorkBitmap; virtual;
  179.     procedure UnRegisterChanges(ChangeLink: TfcChangeLink); virtual;
  180.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  181.     procedure CopyToClipboard; virtual;
  182.     property Align;
  183.     property AutoSize: Boolean read FAutoSize write SetAutoSize;
  184.     property BitmapOptions: TfcBitmapOptions read FBitmapOptions write FBitmapOptions;
  185.     property DrawStyle: TfcImagerDrawStyle read FDrawStyle write SetDrawStyle;
  186.     property PreProcess: Boolean read FPreProcess write SetPreProcess;
  187. //    property Bitmap: TfcBitmap read FBitmap write SetBitmap;
  188.     property Picture: TPicture read FPicture write SetPicture;
  189.     property RespectPalette: Boolean read GetRespectPalette write SetRespectPalette default True;
  190.     property SmoothStretching: Boolean read GetSmoothStretching write SetSmoothStretching;
  191.     property Transparent: Boolean read GetTransparent write SetTransparent;
  192.     property TransparentColor: TColor read GetTransparentColor write SetTransparentColor;
  193.     property WorkBitmap: TfcBitmap read FWorkBitmap;
  194.   end;
  195.   TfcImager = class(TfcCustomImager)
  196.   published
  197.     { Published declarations }
  198.     property Align;
  199.     property AutoSize;
  200. //    property Bitmap;
  201.     property BitmapOptions;
  202.     property DrawStyle;
  203. //    property EraseBackground;
  204.     property Picture;
  205.     property PreProcess;
  206.     property RespectPalette;
  207.     property SmoothStretching;
  208.     property Transparent;
  209.     property TransparentColor;
  210.     property Visible;
  211.     {$ifdef fcDelphi4Up}
  212.     property Anchors;
  213.     property Constraints;
  214.     property OnEndDock;
  215.     property OnStartDock;
  216.     {$endif}
  217.     property OnClick;
  218.     property OnDblClick;
  219.     property OnDragDrop;
  220.     property OnDragOver;
  221.     property OnEndDrag;
  222.     property OnMouseDown;
  223.     property OnMouseMove;
  224.     property OnMouseUp;
  225.     property OnStartDrag;
  226.   end;
  227. implementation
  228. uses clipbrd;
  229. constructor TfcRotate.Create(BitmapOptions: TfcBitmapOptions);
  230. begin
  231.   inherited Create;
  232.   FCenterX := -1;
  233.   FCenterY := -1;
  234.   FBitmapOptions := BitmapOptions;
  235. end;
  236. procedure TfcRotate.SetCenterX(Value: Integer);
  237. begin
  238.   if FCenterX <> Value then
  239.   begin
  240.     FCenterX := Value;
  241.     FBitmapOptions.Changed;
  242.   end;
  243. end;
  244. procedure TfcRotate.SetCenterY(Value: Integer);
  245. begin
  246.   if FCenterY <> Value then
  247.   begin
  248.     FCenterY := Value;
  249.     FBitmapOptions.Changed;
  250.   end;
  251. end;
  252. procedure TfcRotate.SetAngle(Value: Integer);
  253. begin
  254.   if FAngle <> Value then
  255.   begin
  256.     FAngle := Value;
  257.     FBitmapOptions.Changed;
  258.   end;
  259. end;
  260. constructor TfcAlphaBlend.Create(BitmapOptions: TfcBitmapOptions);
  261. begin
  262.   inherited Create;
  263.   FBitmapOptions := BitmapOptions;
  264.   FBitmap := TfcBitmap.Create;
  265. //  FBitmap.OnChange := BitmapChanged;
  266. end;
  267. destructor TfcAlphaBlend.Destroy;
  268. begin
  269.   FBitmap.Free;
  270.   inherited;
  271. end;
  272. procedure TfcAlphaBlend.BitmapChanged(Sender: TObject);
  273. begin
  274.   if FChanging then Exit;
  275.   FChanging := True;
  276.   FBitmapOptions.Changed;
  277.   FChanging := False;
  278. end;
  279. function TfcAlphaBlend.GetTransparent: Boolean;
  280. begin
  281.   result := Bitmap.Transparent;
  282. end;
  283. procedure TfcAlphaBlend.SetTransparent(Value: Boolean);
  284. begin
  285.   Bitmap.Transparent := Value;
  286. end;
  287. procedure TfcAlphaBlend.SetAmount(Value: Byte);
  288. begin
  289.   if FAmount <> Value then
  290.   begin
  291.     FAmount := Value;
  292.     FBitmapOptions.Changed;
  293.   end;
  294. end;
  295. procedure TfcAlphaBlend.SetBitmap(Value: TfcBitmap);
  296. begin
  297.   FBitmap.Assign(Value);
  298. end;
  299. constructor TfcWave.Create(BitmapOptions: TfcBitmapOptions);
  300. begin
  301.   inherited Create;
  302.   FBitmapOptions := BitmapOptions;
  303. end;
  304. procedure TfcWave.SetXDiv(Value: Integer);
  305. begin
  306.   if FXDiv <> Value then
  307.   begin
  308.     FXDiv := Value;
  309.     FBitmapOptions.Changed;
  310.   end;
  311. end;
  312. procedure TfcWave.SetYDiv(Value: Integer);
  313. begin
  314.   if FYDiv <> Value then
  315.   begin
  316.     FYDiv := Value;
  317.     FBitmapOptions.Changed;
  318.   end;
  319. end;
  320. procedure TfcWave.SetRatio(Value: Integer);
  321. begin
  322.   if FRatio <> Value then
  323.   begin
  324.     FRatio := Value;
  325.     FBitmapOptions.Changed;
  326.   end;
  327. end;
  328. procedure TfcWave.SetWrap(Value: Boolean);
  329. begin
  330.   if FWrap <> Value then
  331.   begin
  332.     FWrap := Value;
  333.     FBitmapOptions.Changed;
  334.   end;
  335. end;
  336. constructor TfcBitmapOptions.Create(AComponent: TComponent);
  337. begin
  338.   inherited Create;
  339.   FComponent := AComponent;
  340.   FAlphaBlend := TfcAlphaBlend.Create(self);
  341.   FRotation := TfcRotate.Create(self);
  342.   FColor := clNone;
  343.   FTintColor := clNone;
  344.   FSaturation := -1;
  345.   FWave := TfcWave.Create(self);
  346. end;
  347. destructor TfcBitmapOptions.Destroy;
  348. begin
  349.   FAlphaBlend.Free;
  350.   FRotation.Free;
  351.   FWave.Free;
  352.   inherited;
  353. end;
  354. procedure TfcBitmapOptions.Changed;
  355. var TmpBitmap: TfcBitmap;
  356. begin
  357.   if (csLoading in FComponent.ComponentState) or DestBitmap.Empty or ((OrigPicture.Graphic = nil) or OrigPicture.Graphic.Empty) or (FUpdateLock > 0) then Exit;
  358.   if (DestBitmap.Width = OrigPicture.Width) and (DestBitmap.Height = OrigPicture.Height) then
  359.     DestBitmap.Assign(OrigPicture.Graphic)
  360.   else begin
  361.     if Tile then fcTileDraw(OrigPicture.Graphic, DestBitmap.Canvas, Rect(0, 0, DestBitmap.Width, DestBitmap.Height))
  362.     else begin
  363.       TmpBitmap := TfcBitmap.Create;
  364.       TmpBitmap.Assign(OrigPicture.Graphic);
  365.       TmpBitmap.SmoothStretching := TfcCustomImager(FComponent).SmoothStretching;
  366.       try
  367.         DestBitmap.Canvas.StretchDraw(Rect(0, 0, DestBitmap.Width, DestBitmap.Height), TmpBitmap);
  368.       finally
  369.         TmpBitmap.Free;
  370.       end;
  371.     end;
  372.   end;
  373.   if FGrayScale then DestBitmap.GrayScale;
  374.   if FLightness <> 0 then DestBitmap.Brightness(FLightness);
  375.   if (FAlphaBlend.Amount <> 0) and not FAlphaBlend.Bitmap.Empty then
  376.     DestBitmap.AlphaBlend(FAlphaBlend.Bitmap, FAlphaBlend.Amount, True);
  377.   if FColor <> clNone then with fcGetColor(ColorToRGB(FColor)) do
  378.     DestBitmap.Colorize(r, g, b);
  379.   if FTintColor <> clNone then with fcGetColor(ColorToRGB(FTintColor)) do
  380.     DestBitmap.ColorTint(r div 2, g div 2, b div 2);
  381.   if FSponge <> 0 then DestBitmap.Sponge(FSponge);
  382.   if FSaturation <> -1 then DestBitmap.Saturation(FSaturation);
  383.   if FGaussianBlur <> 0 then DestBitmap.GaussianBlur(FGaussianBlur);
  384.   if FEmbossed then DestBitmap.Emboss;
  385.   if FInverted then DestBitmap.Invert;
  386.   if FContrast <> 0 then DestBitmap.Contrast(FContrast);
  387.   if FSharpen <> 0 then DestBitmap.Sharpen(FSharpen);
  388.   if FHorizontallyFlipped then DestBitmap.Flip(True);
  389.   if FVerticallyFlipped then DestBitmap.Flip(False);
  390.   with FWave do if (Ratio <> 0) and (XDiv <> 0) and (YDiv <> 0) then
  391.     DestBitmap.Wave(XDiv, YDiv, Ratio, Wrap);
  392.   if FRotation.Angle <> 0 then with Rotation do
  393.     DestBitmap.Rotate(Point(CenterX, CenterY), Angle);
  394.   if Assigned(FOnChange) then FOnChange(self);
  395. end;
  396. procedure TfcBitmapOptions.BeginUpdate;
  397. begin
  398.   inc(FUpdateLock);
  399. end;
  400. procedure TfcBitmapOptions.EndUpdate;
  401. begin
  402.   if FUpdateLock > 0 then dec(FUpdateLock);
  403.   Changed;
  404. end;
  405. procedure TfcBitmapOptions.SetColor(Value: TColor);
  406. begin
  407.   if FColor <> Value then
  408.   begin
  409.     FColor := Value;
  410.     Changed;
  411.   end;
  412. end;
  413. procedure TfcBitmapOptions.SetTintColor(Value: TColor);
  414. begin
  415.   if FTintColor <> Value then
  416.   begin
  417.     FTintColor := Value;
  418.     Changed;
  419.   end;
  420. end;
  421. procedure TfcBitmapOptions.SetIntegralProperty(Index: Integer; Value: Integer);
  422.   procedure DoCheck(StorageVar: PInteger);
  423.   begin
  424.     if StorageVar^ <> Value then
  425.     begin
  426.       StorageVar^ := Value;
  427.       Changed;
  428.     end;
  429.   end;
  430. begin
  431.   case Index of
  432.     0: DoCheck(@FLightness);
  433.     1: DoCheck(@FSaturation);
  434.     2: DoCheck(@FSponge);
  435.     3: DoCheck(@FGaussianBlur);
  436.     4: DoCheck(@FContrast);
  437.     5: DoCheck(@FSharpen);
  438.   end;
  439. end;
  440. type PBoolean = ^Boolean;
  441. procedure TfcBitmapOptions.SetBooleanProperty(Index: Integer; Value: Boolean);
  442.   procedure DoCheck(StorageVar: PBoolean);
  443.   begin
  444.     if StorageVar^ <> Value then
  445.     begin
  446.       StorageVar^ := Value;
  447.       Changed;
  448.     end;
  449.   end;
  450. begin
  451.   case Index of
  452.     0: DoCheck(@FEmbossed);
  453.     1: DoCheck(@FInverted);
  454.     2: DoCheck(@FGrayScale);
  455.     3: DoCheck(@FHorizontallyFlipped);
  456.     4: DoCheck(@FVerticallyFlipped);
  457.   end;
  458. end;
  459. constructor TfcCustomImager.Create(AOwner: TComponent);
  460. begin
  461.   inherited Create(AOwner);
  462. //  FBitmap := TfcBitmap.Create;
  463. //  FBitmap.OnChange := BitmapChange;
  464.   FEraseBackground:= True;
  465.   FPicture := TPicture.Create;
  466.   FPicture.OnChange := BitmapChange;
  467.   FWorkBitmap := TfcBitmap.Create;
  468.   FRespectPalette:= True;
  469.   FWorkBitmap.RespectPalette := True;
  470.   FWorkBitmap.UseHalftonePalette:= True;
  471.   FBitmapOptions := TfcBitmapOptions.Create(self);
  472.   FBitmapOptions.OnChange := BitmapOptionsChange;
  473.   FBitmapOptions.DestBitmap := FWorkBitmap;
  474.   FBitmapOptions.OrigPicture := FPicture;
  475.   ControlStyle := ControlStyle + [csOpaque];
  476.   FPreProcess := True;
  477.   FChangeLinks := TList.Create;
  478.   Width := 100;
  479.   Height := 100;
  480. end;
  481. destructor TfcCustomImager.Destroy;
  482. begin
  483.   FPicture.Free;
  484.   FPicture:= nil;
  485.   FBitmapOptions.Free;
  486.   FWorkBitmap.Free;
  487.   FChangeLinks.Free;
  488.   inherited Destroy;
  489. end;
  490. function TfcCustomImager.GetDrawRect: TRect;
  491. begin
  492.   case DrawStyle of
  493.     dsNormal: result := Rect(0, 0, Picture.Width, Picture.Height);
  494.     dsCenter: with Point(Width div 2 - FWorkBitmap.Width div 2,
  495.         Height div 2 - FWorkBitmap.Height div 2) do
  496.       result := Rect(x, y, Width - x, Height - y);
  497.     dsTile, dsStretch: result := Rect(0, 0, Width, Height);
  498.     dsProportional: result := fcProportionalRect(Rect(0, 0, Width, Height), FWorkBitmap.Width, FWorkBitmap.Height);
  499.   end
  500. end;
  501. procedure TfcCustomImager.SetDrawStyle(Value: TfcImagerDrawStyle);
  502. begin
  503.   if FDrawStyle <> Value then
  504.   begin
  505.     FDrawStyle := Value;
  506.     BitmapOptions.Tile := FDrawStyle = dsTile;
  507.     Resized;
  508.     Invalidate;
  509.   end;
  510. end;
  511. procedure TfcCustomImager.SetEraseBackground(Value: Boolean);
  512. var r: TRect;
  513. begin
  514.   if FEraseBackground <> Value then
  515.   begin
  516.     FEraseBackground := Value;
  517.     if Parent <> nil then begin
  518.        r:= BoundsRect;
  519.        InvalidateRect(Parent.Handle, @r, True);
  520. //       Parent.Invalidate;
  521.     end
  522.   end;
  523. end;
  524. procedure TfcCustomImager.SetParent(Value: TWinControl);
  525. begin
  526.   inherited;
  527. end;
  528. procedure TfcCustomImager.BitmapOptionsChange(Sender: TObject);
  529. var r: TRect;
  530. begin
  531.   if Parent <> nil then
  532.   begin
  533.     r := BoundsRect;
  534.     InvalidateRect(Parent.Handle, @r, Transparent);
  535.   end;
  536.   NotifyChanges;
  537. end;
  538. procedure TfcCustomImager.NotifyChanges;
  539. var i: Integer;
  540. begin
  541.   for i := 0 to FChangeLinks.Count - 1 do with TfcChangeLink(FChangeLinks[i]) do
  542.   begin
  543.     Sender := WorkBitmap;
  544.     Change;
  545.   end;
  546. end;
  547. procedure TfcCustomImager.BitmapChange(Sender: TObject);
  548. var r: TRect;
  549. begin
  550.   Resized;
  551.   r := BoundsRect;
  552.   if Parent<>nil then { 8/2/99 }
  553.      InvalidateRect(Parent.Handle, @r, True);
  554.   NotifyChanges;
  555. end;
  556. procedure TfcCustomImager.Resized;
  557. begin
  558. //  if (not InSetBounds) and EraseBackground and not Transparent and not PictureEmpty and not WorkBitmap.Empty and (Parent <> nil) then
  559. //    SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0);
  560.   if csLoading in ComponentState then Exit;
  561.   if not PreProcess and not (DrawStyle in [dsNormal, dsCenter]) then
  562.     FWorkBitmap.SetSize(Width, Height)
  563.   else begin
  564.      if BitmapOptions.Rotation.Angle <> 0 then { 10/5/99 }
  565.         FWorkBitmap.SetSize(fcMax(Picture.Width, Picture.Height), fcMax(Picture.Height, Picture.Width))
  566.      else
  567.         FWorkBitmap.SetSize(Picture.Width, Picture.Height)
  568.   end;
  569.   UpdateWorkBitmap;
  570.   UpdateAutoSize;
  571. end;
  572. procedure TfcCustomImager.UpdateAutoSize;
  573. begin
  574.   if FAutoSize and not PictureEmpty and not (csLoading in ComponentState) and (Align = alNone) then
  575.   begin
  576.     UpdatingAutosize := True;
  577. {    if DrawStyle = dsProportional then
  578.     begin
  579.       with fcProportionalRect(Rect(0, 0, Width, Height), Bitmap.Width, Bitmap.Height) do
  580.         if (Width <> Right - Left) or (Height <> Bottom - Top) then
  581.           SetBounds(self.Left, self.Top, self.Left + (Right - Left), self.Top + (Bottom - Top))
  582.     end else }if (Width <> Picture.Width) or (Height <> Picture.Height) then
  583.       SetBounds(Left, Top, Picture.Width, Picture.Height);
  584.     UpdatingAutosize := False;
  585.   end;
  586. end;
  587. procedure TfcCustomImager.UpdateWorkBitmap;
  588. begin
  589.   if not PictureEmpty and not (csLoading in ComponentState) then
  590.   begin
  591.     if FWorkBitmap.Empty then Resized;
  592.     BitmapOptions.Changed;
  593.   end;
  594. end;
  595. procedure TfcCustomImager.SetPicture(Value: TPicture);
  596. begin
  597.   FPicture.Assign(Value);
  598. end;
  599. procedure TfcCustomImager.SetPreProcess(Value: Boolean);
  600. begin
  601.   if FPreProcess <> Value then
  602.   begin
  603.     FPreProcess := Value;
  604.     Resized;
  605.   end;
  606. end;
  607. procedure TfcCustomImager.SetTransparent(Value: Boolean);
  608. begin
  609.   if not PictureEmpty then Picture.Graphic.Transparent := Value;
  610.   Invalidate;
  611. end;
  612. procedure TfcCustomImager.SetTransparentColor(Value: TColor);
  613. begin
  614.   WorkBitmap.TransparentColor := Value;
  615.   UpdateWorkBitmap;
  616.   Invalidate;
  617.   ColorToString(clNone);
  618. end;
  619. function TfcCustomImager.GetRespectPalette;
  620. begin
  621. //  result := WorkBitmap.RespectPalette;
  622.   result:= FRespectPalette;
  623. end;
  624. function TfcCustomImager.GetSmoothStretching: Boolean;
  625. begin
  626.   result := WorkBitmap.SmoothStretching;
  627. end;
  628. function TfcCustomImager.GetTransparent: Boolean;
  629. begin
  630.   result := False;
  631.   if not PictureEmpty then result := Picture.Graphic.Transparent;
  632. end;
  633. function TfcCustomImager.GetTransparentColor: TColor;
  634. begin
  635.   result := WorkBitmap.TransparentColor;
  636. end;
  637. procedure TfcCustomImager.SetAutoSize(Value: Boolean);
  638. begin
  639.   if FAutoSize <> Value then
  640.   begin
  641.     FAutoSize := Value;
  642.     UpdateAutoSize;
  643.   end;
  644. end;
  645. {
  646. procedure TfcCustomImager.SetBitmap(Value: TfcBitmap);
  647. begin
  648.   FBitmap.Assign(Value);
  649. end;
  650. }
  651. function TfcCustomImager.PictureEmpty: Boolean;
  652. begin
  653.   result := (FPicture=Nil) or (FPicture.Graphic = nil) or (FPicture.Graphic.Empty);
  654. end;
  655. procedure TfcCustomImager.Invalidate;
  656. var r: TRect;
  657. begin
  658.   if InSetBounds then exit;
  659.   r := BoundsRect;
  660.   if Parent <> nil then InvalidateRect(Parent.Handle, @r, True);
  661. end;
  662. procedure TfcCustomImager.RegisterChanges(ChangeLink: TfcChangeLink);
  663. begin
  664.   FChangeLinks.Add(ChangeLink);
  665. end;
  666. procedure TfcCustomImager.UnRegisterChanges(ChangeLink: TfcChangeLink);
  667. begin
  668.   FChangeLinks.Remove(ChangeLink);
  669. end;
  670. procedure TfcCustomImager.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  671. var SizeChanged: Boolean;
  672.     OldControlStyle: TControlStyle;
  673. begin
  674.   SizeChanged := (AWidth <> Width) or (AHeight <> Height);
  675.   if SizeChanged and not UpdatingAutosize then begin
  676.      InSetBounds:= True; { RSW - Don't erase background when resizing }
  677.      { 5/7/99 - Setting parent to opaque so it doesn't clear background.
  678.        This allows imager to not flicker when resizing imager }
  679.      if Parent<>nil then
  680.      begin
  681.         OldControlStyle:= Parent.ControlStyle;
  682.         Parent.ControlStyle:= Parent.ControlStyle + [csOpaque];
  683.      end;
  684.      inherited;
  685.      if Parent<>nil then Parent.ControlStyle:= OldControlStyle;
  686.      if Visible then Update;
  687.      Resized;
  688.      InSetBounds:= False;
  689.   end
  690.   else inherited;
  691. end;
  692. procedure TfcCustomImager.SetRespectPalette(Value: Boolean);
  693. begin
  694.   FRespectPalette:= Value;
  695.   WorkBitmap.RespectPalette := Value;
  696.   if value then
  697.      if (BitmapOptions.Color<>clNone) or (BitmapOptions.TintColor<>clNone) then
  698.         WorkBitmap.RespectPalette:= False;
  699.   Invalidate;
  700. end;
  701. procedure TfcCustomImager.SetSmoothStretching(Value: Boolean);
  702. begin
  703.   WorkBitmap.SmoothStretching := Value;
  704.   UpdateWorkBitmap;
  705.   Invalidate;
  706. end;
  707. procedure TfcCustomImager.Paint;
  708. begin
  709.   inherited;
  710.   if csDestroying in ComponentState then exit;
  711.   if FWorkBitmap.Empty and not PictureEmpty then
  712.   begin
  713.     UpdateWorkBitmap;
  714.     Exit;
  715.   end;
  716.   if (csDesigning in ComponentState) and FWorkBitmap.Empty then with Canvas do
  717.   begin
  718.     Pen.Style := psDash;
  719.     Pen.Color := clBlack;
  720.     Brush.Color := clWhite;
  721.     Rectangle(0, 0, Width, Height);
  722.     Exit;
  723.   end;
  724.   if FWorkBitmap.Empty then Exit;
  725.   try
  726.     with GetDrawRect do
  727.       if PreProcess then
  728.         case DrawStyle of
  729.           dsNormal: Canvas.Draw(Left, Top, FWorkBitmap);
  730.           dsCenter: Canvas.Draw(Left, Top, FWorkBitmap);
  731.           dsTile: FWorkBitmap.TileDraw(Canvas, Rect(Left, Top, Right, Bottom));
  732.           dsStretch: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  733.           dsProportional: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  734.         end
  735.       else Canvas.Draw(Left, Top, FWorkBitmap);
  736.   finally
  737. {    if Transparent then fcTransparentDraw(Canvas, Rect(0, 0, Width, Height), DrawBitmap, DrawBitmap.Canvas.Pixels[0, 0])
  738.     else Canvas.Draw(0, 0, DrawBitmap);}
  739.   end;
  740. end;
  741. (*procedure TfcCustomImager.ParentMessages(var Message: TMessage; var ProcessMessage: Boolean);
  742. var s: TfcCustomImager;
  743. begin
  744.   if csDestroying in ComponentState then exit;
  745.   if not PictureEmpty and ((not EraseBackground) or InSetBounds) and
  746. {     not (csDesigning in ComponentState) and}  { 4/27/99 - Comment out - RSW }
  747.      (Message.Msg = WM_ERASEBKGND) then//and not (DrawStyle in [dsNormal, dsProportional]) {and (Align = alClient) }then { 3/19/99 - Comment out alClient to prevent flicker of form}
  748.   begin
  749.     with TWMEraseBkGnd(Message) do
  750.     begin
  751.       Result := 1;
  752.       ProcessMessage := False;
  753.     end;
  754.   end
  755. end;
  756. *)
  757. procedure TfcCustomImager.Loaded;
  758. begin
  759.   inherited;
  760.   UpdateAutoSize;
  761.   FBitmapOptions.Changed;
  762. end;
  763. procedure TfcCustomImager.Notification(AComponent: TComponent; Operation: TOperation);
  764. begin
  765.   inherited Notification(AComponent, Operation);
  766. end;
  767. procedure TfcCustomImager.CopyToClipboard;
  768. var tempBitmap: TBitmap;
  769. begin
  770.    tempBitmap:= TBitmap.create;
  771.    WorkBitmap.SaveToBitmap(tempBitmap);
  772.    Clipboard.Assign(tempBitmap);
  773.    tempBitmap.Free;
  774. end;
  775. procedure TfcCustomImager.WndProc(var Message: TMessage);
  776. begin
  777.   inherited;
  778. end;
  779. (*var Hook: HHOOK = 0;
  780. function CallWndProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  781. var  p: PCWPStruct;
  782. begin
  783.   result := CallNextHookEx(Hook, code, wParam, lParam);
  784.   if wParam<>0 then
  785.   begin
  786.      p:= PCWPStruct(lParam);
  787.      if (p.message= WM_ERASEBKGND) {and
  788.         (p.hwnd=MonitorHandle) }then result:= 0;
  789.   end
  790. end;
  791. initialization
  792. //  Hook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, 0, GetCurrentThreadID);
  793. finalization
  794. //  UnhookWindowsHookEx(Hook);
  795. *)
  796. end.