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

Delphi控件源码

开发平台:

Delphi

  1. unit fcImager;
  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, db, dbctrls, stdctrls;
  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(TCustomControl)
  129.   private
  130.     { Private declarations }
  131.     FAutoSize: Boolean;
  132.     FBitmapOptions: TfcBitmapOptions;
  133.     FDrawStyle: TfcImagerDrawStyle;
  134.     FEraseBackground: Boolean;
  135.     FPreProcess: Boolean;
  136.     FWorkBitmap: TfcBitmap;
  137.     FPicture: TPicture;
  138.     FChangeLinks: TList;
  139.     FRespectPalette: boolean;
  140.     FTransparent: boolean;  // Keep track in component instead of in picture
  141.                             // This helps databound case support transparency
  142.     FWinControl: TWinControl;
  143. //    FFocusable: boolean;
  144.     FOnKeyPress: TKeyPressEvent;
  145.     FOnKeyDown, FOnKeyUp: TKeyEvent;
  146. //    FTabStop: boolean;
  147. //    procedure SetTabStop(value: boolean);
  148.     function GetRespectPalette: Boolean;
  149.     function GetSmoothStretching: Boolean;
  150.     function GetTransparent: Boolean;
  151.     function GetTransparentColor: TColor;
  152.     procedure SetAutoSize(Value: Boolean);
  153.     procedure SetDrawStyle(Value: TfcImagerDrawStyle);
  154.     procedure SetEraseBackground(Value: Boolean);
  155.     procedure SetPreProcess(Value: Boolean);
  156.     procedure SetPicture(Value: TPicture);
  157.     procedure SetRespectPalette(Value: Boolean);
  158.     procedure SetSmoothStretching(Value: Boolean);
  159.     procedure SetTransparent(Value: Boolean);
  160.     procedure SetTransparentColor(Value: TColor);
  161.     function GetDrawRect: TRect;
  162.     procedure NotifyChanges;
  163. //    procedure SetFocusable(Value: boolean);
  164.     procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBkgnd;
  165.   protected
  166. //    Function CreateImagerWinControl: TWinControl; virtual;
  167.     procedure SetParent(Value: TWinControl); override;
  168.     procedure BitmapOptionsChange(Sender: TObject); virtual;
  169.     procedure BitmapChange(Sender: TObject); virtual;
  170.     procedure UpdateAutoSize; virtual;
  171.     procedure Loaded; override;
  172.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  173.     procedure Paint; override;
  174.     procedure WndProc(var Message: TMessage); override;
  175.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  176.       X, Y: Integer); override;
  177.     procedure KeyUp(var Key: Word; Shift: TShiftState); virtual;
  178.     procedure KeyDown(var Key: Word; Shift: TShiftState); virtual;
  179.     procedure KeyPress(var Key: Char); virtual;
  180.     procedure DoEnter; virtual;
  181.     procedure DoExit; virtual;
  182.     property EraseBackground: Boolean read FEraseBackground write SetEraseBackground default True;
  183.   public
  184.     UpdatingAutoSize: Boolean;
  185.     InSetBounds: boolean;
  186.     Patch: Variant;
  187.     constructor Create(AOwner: TComponent); override;
  188.     destructor Destroy; override;
  189.     function PictureEmpty: Boolean; virtual;
  190.     procedure Invalidate; override;
  191.     procedure RegisterChanges(ChangeLink: TfcChangeLink); virtual;
  192.     procedure Resized; virtual;
  193.     procedure UpdateWorkBitmap; virtual;
  194.     procedure UnRegisterChanges(ChangeLink: TfcChangeLink); virtual;
  195.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  196.     procedure CopyToClipboard; virtual;
  197.     procedure PasteFromClipboard; virtual;
  198.     procedure CutToClipboard; virtual;
  199.     property Align;
  200.     property AutoSize: Boolean read FAutoSize write SetAutoSize;
  201.     property BitmapOptions: TfcBitmapOptions read FBitmapOptions write FBitmapOptions;
  202.     property DrawStyle: TfcImagerDrawStyle read FDrawStyle write SetDrawStyle;
  203.     property PreProcess: Boolean read FPreProcess write SetPreProcess;
  204.     property Picture: TPicture read FPicture write SetPicture;
  205.     property RespectPalette: Boolean read GetRespectPalette write SetRespectPalette default True;
  206.     property SmoothStretching: Boolean read GetSmoothStretching write SetSmoothStretching;
  207.     property Transparent: Boolean read GetTransparent write SetTransparent;
  208.     property TransparentColor: TColor read GetTransparentColor write SetTransparentColor;
  209.     property WorkBitmap: TfcBitmap read FWorkBitmap;
  210. //    property Focusable: boolean read FFocusable write SetFocusable;
  211. //    property TabStop: boolean read FTabStop write SetTabStop;
  212.     property OnKeyPress : TKeyPressEvent read FOnKeyPress write FOnKeyPress;
  213.     property OnKeyDown : TKeyEvent read FOnKeyDown write FOnKeyDown;
  214.     property OnKeyUp : TKeyEvent read FOnKeyUp write FOnKeyUp;
  215.   end;
  216.   TfcImager = class(TfcCustomImager)
  217.   published
  218.     { Published declarations }
  219.     property Align;
  220.     property AutoSize;
  221.     property BitmapOptions;
  222.     property DrawStyle;
  223.     property Picture;
  224.     property PreProcess;
  225.     property RespectPalette;
  226.     property SmoothStretching;
  227.     property Transparent;
  228.     property TransparentColor;
  229.     property Visible;
  230. //    property Focusable;
  231.     property Anchors;
  232.     property Constraints;
  233.     property OnEndDock;
  234.     property OnStartDock;
  235.     property OnClick;
  236.     property OnDblClick;
  237.     property OnDragDrop;
  238.     property OnDragOver;
  239.     property OnEndDrag;
  240.     property OnMouseDown;
  241.     property OnMouseMove;
  242.     property OnMouseUp;
  243.     property OnStartDrag;
  244.     property TabStop;
  245.     property OnKeyPress;
  246.     property OnKeyDown;
  247.     property OnKeyUp;
  248.   end;
  249.   TfcDBImager = class(TfcCustomImager)
  250.   private
  251.     FDataLink: TFieldDataLink;
  252.     FPictureLoaded: boolean;
  253.     FAutoDisplay: Boolean;
  254.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  255.     procedure DataChange(Sender: TObject);
  256.     function GetDataField: string;
  257.     function GetDataSource: TDataSource;
  258.     function GetField: TField;
  259.     function GetReadOnly: Boolean;
  260.     procedure SetReadOnly(Value: Boolean);
  261.     procedure UpdateData(Sender: TObject);
  262.     procedure SetDataField(const Value: string);
  263.     procedure SetDataSource(Value: TDataSource);
  264.     procedure SetAutoDisplay(Value: Boolean);
  265.   protected
  266.     procedure Notification(AComponent: TComponent;
  267.       Operation: TOperation); override;
  268.     procedure LoadPicture; virtual;
  269.     procedure KeyPress(var Key: Char); override;
  270.     procedure DoExit; override;
  271.     procedure Paint; override;
  272.     procedure BitmapChange(Sender: TObject); override;
  273.   public
  274.     constructor Create(AOwner: TComponent); override;
  275.     destructor Destroy; override;
  276.     procedure CopyToClipboard; override;
  277.     procedure PasteFromClipboard; override;
  278.     procedure CutToClipboard; override;
  279.   published
  280.     property DataField: string read GetDataField write SetDataField;
  281.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  282.     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  283.   published
  284.     { Published declarations }
  285.     property Align;
  286.     property AutoSize;
  287.     property BitmapOptions;
  288.     property DrawStyle;
  289.     property Picture;
  290.     property PreProcess;
  291.     property RespectPalette;
  292.     property SmoothStretching;
  293.     property TabStop;
  294.     property Transparent;
  295.     property TransparentColor;
  296.     property Visible;
  297.     property Enabled;
  298. //    property Focusable;
  299.     property Anchors;
  300.     property Constraints;
  301.     property OnEndDock;
  302.     property OnStartDock;
  303.     property OnClick;
  304.     property OnDblClick;
  305.     property OnDragDrop;
  306.     property OnDragOver;
  307.     property OnEndDrag;
  308.     property OnMouseDown;
  309.     property OnMouseMove;
  310.     property OnMouseUp;
  311.     property OnStartDrag;
  312.     property OnKeyPress;
  313.     property OnKeyDown;
  314.     property OnKeyUp;
  315.   end;
  316. implementation
  317. uses clipbrd;
  318. constructor TfcRotate.Create(BitmapOptions: TfcBitmapOptions);
  319. begin
  320.   inherited Create;
  321.   FCenterX := -1;
  322.   FCenterY := -1;
  323.   FBitmapOptions := BitmapOptions;
  324. end;
  325. procedure TfcRotate.SetCenterX(Value: Integer);
  326. begin
  327.   if FCenterX <> Value then
  328.   begin
  329.     FCenterX := Value;
  330.     FBitmapOptions.Changed;
  331.   end;
  332. end;
  333. procedure TfcRotate.SetCenterY(Value: Integer);
  334. begin
  335.   if FCenterY <> Value then
  336.   begin
  337.     FCenterY := Value;
  338.     FBitmapOptions.Changed;
  339.   end;
  340. end;
  341. procedure TfcRotate.SetAngle(Value: Integer);
  342. begin
  343.   if FAngle <> Value then
  344.   begin
  345.     FAngle := Value;
  346.     FBitmapOptions.Changed;
  347.   end;
  348. end;
  349. constructor TfcAlphaBlend.Create(BitmapOptions: TfcBitmapOptions);
  350. begin
  351.   inherited Create;
  352.   FBitmapOptions := BitmapOptions;
  353.   FBitmap := TfcBitmap.Create;
  354. //  FBitmap.OnChange := BitmapChanged;
  355. end;
  356. destructor TfcAlphaBlend.Destroy;
  357. begin
  358.   FBitmap.Free;
  359.   inherited;
  360. end;
  361. procedure TfcAlphaBlend.BitmapChanged(Sender: TObject);
  362. begin
  363.   if FChanging then Exit;
  364.   FChanging := True;
  365.   FBitmapOptions.Changed;
  366.   FChanging := False;
  367. end;
  368. function TfcAlphaBlend.GetTransparent: Boolean;
  369. begin
  370.   result := Bitmap.Transparent;
  371. end;
  372. procedure TfcAlphaBlend.SetTransparent(Value: Boolean);
  373. begin
  374.   Bitmap.Transparent := Value;
  375. end;
  376. procedure TfcAlphaBlend.SetAmount(Value: Byte);
  377. begin
  378.   if FAmount <> Value then
  379.   begin
  380.     FAmount := Value;
  381.     FBitmapOptions.Changed;
  382.   end;
  383. end;
  384. procedure TfcAlphaBlend.SetBitmap(Value: TfcBitmap);
  385. begin
  386.   FBitmap.Assign(Value);
  387. end;
  388. constructor TfcWave.Create(BitmapOptions: TfcBitmapOptions);
  389. begin
  390.   inherited Create;
  391.   FBitmapOptions := BitmapOptions;
  392. end;
  393. procedure TfcWave.SetXDiv(Value: Integer);
  394. begin
  395.   if FXDiv <> Value then
  396.   begin
  397.     FXDiv := Value;
  398.     FBitmapOptions.Changed;
  399.   end;
  400. end;
  401. procedure TfcWave.SetYDiv(Value: Integer);
  402. begin
  403.   if FYDiv <> Value then
  404.   begin
  405.     FYDiv := Value;
  406.     FBitmapOptions.Changed;
  407.   end;
  408. end;
  409. procedure TfcWave.SetRatio(Value: Integer);
  410. begin
  411.   if FRatio <> Value then
  412.   begin
  413.     FRatio := Value;
  414.     FBitmapOptions.Changed;
  415.   end;
  416. end;
  417. procedure TfcWave.SetWrap(Value: Boolean);
  418. begin
  419.   if FWrap <> Value then
  420.   begin
  421.     FWrap := Value;
  422.     FBitmapOptions.Changed;
  423.   end;
  424. end;
  425. constructor TfcBitmapOptions.Create(AComponent: TComponent);
  426. begin
  427.   inherited Create;
  428.   FComponent := AComponent;
  429.   FAlphaBlend := TfcAlphaBlend.Create(self);
  430.   FRotation := TfcRotate.Create(self);
  431.   FColor := clNone;
  432.   FTintColor := clNone;
  433.   FSaturation := -1;
  434.   FWave := TfcWave.Create(self);
  435. end;
  436. destructor TfcBitmapOptions.Destroy;
  437. begin
  438.   FAlphaBlend.Free;
  439.   FRotation.Free;
  440.   FWave.Free;
  441.   inherited;
  442. end;
  443. procedure TfcBitmapOptions.Changed;
  444. var TmpBitmap: TfcBitmap;
  445. begin
  446.   if (csLoading in FComponent.ComponentState) or DestBitmap.Empty or ((OrigPicture.Graphic = nil) or OrigPicture.Graphic.Empty) or (FUpdateLock > 0) then Exit;
  447.   if (DestBitmap.Width = OrigPicture.Width) and (DestBitmap.Height = OrigPicture.Height) then
  448.     DestBitmap.Assign(OrigPicture.Graphic)
  449.   else begin
  450.     if Tile then fcTileDraw(OrigPicture.Graphic, DestBitmap.Canvas, Rect(0, 0, DestBitmap.Width, DestBitmap.Height))
  451.     else begin
  452.       TmpBitmap := TfcBitmap.Create;
  453.       TmpBitmap.Assign(OrigPicture.Graphic);
  454.       TmpBitmap.SmoothStretching := TfcCustomImager(FComponent).SmoothStretching;
  455.       try
  456.         DestBitmap.Canvas.StretchDraw(Rect(0, 0, DestBitmap.Width, DestBitmap.Height), TmpBitmap);
  457.       finally
  458.         TmpBitmap.Free;
  459.       end;
  460.     end;
  461.   end;
  462.   if FGrayScale then DestBitmap.GrayScale;
  463.   if FLightness <> 0 then DestBitmap.Brightness(FLightness);
  464.   if (FAlphaBlend.Amount <> 0) and not FAlphaBlend.Bitmap.Empty then
  465.     DestBitmap.AlphaBlend(FAlphaBlend.Bitmap, FAlphaBlend.Amount, True);
  466.   if FColor <> clNone then with fcGetColor(ColorToRGB(FColor)) do
  467.     DestBitmap.Colorize(r, g, b);
  468.   if FTintColor <> clNone then with fcGetColor(ColorToRGB(FTintColor)) do
  469.     DestBitmap.ColorTint(r div 2, g div 2, b div 2);
  470.   if FSponge <> 0 then DestBitmap.Sponge(FSponge);
  471.   if FSaturation <> -1 then DestBitmap.Saturation(FSaturation);
  472.   if FGaussianBlur <> 0 then DestBitmap.GaussianBlur(FGaussianBlur);
  473.   if FEmbossed then DestBitmap.Emboss;
  474.   if FInverted then DestBitmap.Invert;
  475.   if FContrast <> 0 then DestBitmap.Contrast(FContrast);
  476.   if FSharpen <> 0 then DestBitmap.Sharpen(FSharpen);
  477.   if FHorizontallyFlipped then DestBitmap.Flip(True);
  478.   if FVerticallyFlipped then DestBitmap.Flip(False);
  479.   with FWave do if (Ratio <> 0) and (XDiv <> 0) and (YDiv <> 0) then
  480.     DestBitmap.Wave(XDiv, YDiv, Ratio, Wrap);
  481.   if FRotation.Angle <> 0 then with Rotation do
  482.     DestBitmap.Rotate(Point(CenterX, CenterY), Angle);
  483.   if Assigned(FOnChange) then FOnChange(self);
  484. end;
  485. procedure TfcBitmapOptions.BeginUpdate;
  486. begin
  487.   inc(FUpdateLock);
  488. end;
  489. procedure TfcBitmapOptions.EndUpdate;
  490. begin
  491.   if FUpdateLock > 0 then dec(FUpdateLock);
  492.   Changed;
  493. end;
  494. procedure TfcBitmapOptions.SetColor(Value: TColor);
  495. begin
  496.   if FColor <> Value then
  497.   begin
  498.     FColor := Value;
  499.     Changed;
  500.   end;
  501. end;
  502. procedure TfcBitmapOptions.SetTintColor(Value: TColor);
  503. begin
  504.   if FTintColor <> Value then
  505.   begin
  506.     FTintColor := Value;
  507.     Changed;
  508.   end;
  509. end;
  510. procedure TfcBitmapOptions.SetIntegralProperty(Index: Integer; Value: Integer);
  511.   procedure DoCheck(StorageVar: PInteger);
  512.   begin
  513.     if StorageVar^ <> Value then
  514.     begin
  515.       StorageVar^ := Value;
  516.       Changed;
  517.     end;
  518.   end;
  519. begin
  520.   case Index of
  521.     0: DoCheck(@FLightness);
  522.     1: DoCheck(@FSaturation);
  523.     2: DoCheck(@FSponge);
  524.     3: DoCheck(@FGaussianBlur);
  525.     4: DoCheck(@FContrast);
  526.     5: DoCheck(@FSharpen);
  527.   end;
  528. end;
  529. type PBoolean = ^Boolean;
  530. procedure TfcBitmapOptions.SetBooleanProperty(Index: Integer; Value: Boolean);
  531.   procedure DoCheck(StorageVar: PBoolean);
  532.   begin
  533.     if StorageVar^ <> Value then
  534.     begin
  535.       StorageVar^ := Value;
  536.       Changed;
  537.     end;
  538.   end;
  539. begin
  540.   case Index of
  541.     0: DoCheck(@FEmbossed);
  542.     1: DoCheck(@FInverted);
  543.     2: DoCheck(@FGrayScale);
  544.     3: DoCheck(@FHorizontallyFlipped);
  545.     4: DoCheck(@FVerticallyFlipped);
  546.   end;
  547. end;
  548. constructor TfcCustomImager.Create(AOwner: TComponent);
  549. begin
  550.   inherited Create(AOwner);
  551. //  FBitmap := TfcBitmap.Create;
  552. //  FBitmap.OnChange := BitmapChange;
  553.   FEraseBackground:= True;
  554.   FPicture := TPicture.Create;
  555.   FPicture.OnChange := BitmapChange;
  556.   FWorkBitmap := TfcBitmap.Create;
  557.   FRespectPalette:= True;
  558.   FWorkBitmap.RespectPalette := True;
  559.   FWorkBitmap.UseHalftonePalette:= True;
  560.   FBitmapOptions := TfcBitmapOptions.Create(self);
  561.   FBitmapOptions.OnChange := BitmapOptionsChange;
  562.   FBitmapOptions.DestBitmap := FWorkBitmap;
  563.   FBitmapOptions.OrigPicture := FPicture;
  564.   ControlStyle := ControlStyle + [csOpaque];
  565.   FPreProcess := True;
  566.   FChangeLinks := TList.Create;
  567.   Width := 100;
  568.   Height := 100;
  569. end;
  570. destructor TfcCustomImager.Destroy;
  571. begin
  572.   FPicture.Free;
  573.   FPicture:= nil;
  574.   FBitmapOptions.Free;
  575.   FWorkBitmap.Free;
  576.   FChangeLinks.Free;
  577.   inherited Destroy;
  578. end;
  579. function TfcCustomImager.GetDrawRect: TRect;
  580. begin
  581.   case DrawStyle of
  582.     dsNormal: result := Rect(0, 0, Picture.Width, Picture.Height);
  583.     dsCenter: with Point(Width div 2 - FWorkBitmap.Width div 2,
  584.         Height div 2 - FWorkBitmap.Height div 2) do
  585.       result := Rect(x, y, Width - x, Height - y);
  586.     dsTile, dsStretch: result := Rect(0, 0, Width, Height);
  587.     dsProportional: result := fcProportionalRect(Rect(0, 0, Width, Height), FWorkBitmap.Width, FWorkBitmap.Height);
  588.   end
  589. end;
  590. procedure TfcCustomImager.SetDrawStyle(Value: TfcImagerDrawStyle);
  591. begin
  592.   if FDrawStyle <> Value then
  593.   begin
  594.     FDrawStyle := Value;
  595.     BitmapOptions.Tile := FDrawStyle = dsTile;
  596.     Resized;
  597.     Invalidate;
  598.   end;
  599. end;
  600. procedure TfcCustomImager.SetEraseBackground(Value: Boolean);
  601. var r: TRect;
  602. begin
  603.   if FEraseBackground <> Value then
  604.   begin
  605.     FEraseBackground := Value;
  606.     if Parent <> nil then begin
  607.        r:= BoundsRect;
  608.        InvalidateRect(Handle, nil, True);
  609. //       InvalidateRect(Parent.Handle, @r, True);
  610.     end
  611.   end;
  612. end;
  613. procedure TfcCustomImager.SetParent(Value: TWinControl);
  614. begin
  615.   inherited;
  616. end;
  617. procedure TfcCustomImager.BitmapOptionsChange(Sender: TObject);
  618. var r: TRect;
  619. begin
  620.   if Parent <> nil then
  621.   begin
  622.     r := BoundsRect;
  623.     InvalidateRect(Handle, nil, True);
  624. //    InvalidateRect(Parent.Handle, @r, Transparent);
  625.   end;
  626.   NotifyChanges;
  627. end;
  628. procedure TfcCustomImager.NotifyChanges;
  629. var i: Integer;
  630. begin
  631.   for i := 0 to FChangeLinks.Count - 1 do with TfcChangeLink(FChangeLinks[i]) do
  632.   begin
  633.     Sender := WorkBitmap;
  634.     Change;
  635.   end;
  636. end;
  637. procedure TfcCustomImager.BitmapChange(Sender: TObject);
  638. var r: TRect;
  639. begin
  640.   Resized;
  641.   r := BoundsRect;
  642.   if Parent<>nil then { 8/2/99 }
  643.      InvalidateRect(Handle, nil, True);
  644. //     InvalidateRect(Parent.Handle, @r, True);
  645.   NotifyChanges;
  646. end;
  647. procedure TfcCustomImager.Resized;
  648. begin
  649. //  if (not InSetBounds) and EraseBackground and not Transparent and not PictureEmpty and not WorkBitmap.Empty and (Parent <> nil) then
  650. //    SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0);
  651.   if csLoading in ComponentState then Exit;
  652.   if not PreProcess and not (DrawStyle in [dsNormal, dsCenter]) then
  653.     FWorkBitmap.SetSize(Width, Height)
  654.   else begin
  655.      if BitmapOptions.Rotation.Angle <> 0 then { 10/5/99 }
  656.         FWorkBitmap.SetSize(fcMax(Picture.Width, Picture.Height), fcMax(Picture.Height, Picture.Width))
  657.      else
  658.         FWorkBitmap.SetSize(Picture.Width, Picture.Height)
  659.   end;
  660.   UpdateWorkBitmap;
  661.   UpdateAutoSize;
  662. end;
  663. procedure TfcCustomImager.UpdateAutoSize;
  664. begin
  665.   if FAutoSize and not PictureEmpty and not (csLoading in ComponentState) and (Align = alNone) then
  666.   begin
  667.     UpdatingAutosize := True;
  668. {    if DrawStyle = dsProportional then
  669.     begin
  670.       with fcProportionalRect(Rect(0, 0, Width, Height), Bitmap.Width, Bitmap.Height) do
  671.         if (Width <> Right - Left) or (Height <> Bottom - Top) then
  672.           SetBounds(self.Left, self.Top, self.Left + (Right - Left), self.Top + (Bottom - Top))
  673.     end else }if (Width <> Picture.Width) or (Height <> Picture.Height) then
  674.       SetBounds(Left, Top, Picture.Width, Picture.Height);
  675.     UpdatingAutosize := False;
  676.   end;
  677. end;
  678. procedure TfcCustomImager.UpdateWorkBitmap;
  679. begin
  680.   if not PictureEmpty and not (csLoading in ComponentState) then
  681.   begin
  682.     if FWorkBitmap.Empty then Resized;
  683.     BitmapOptions.Changed;
  684.   end;
  685. end;
  686. procedure TfcCustomImager.SetPicture(Value: TPicture);
  687. begin
  688.   FPicture.Assign(Value);
  689. end;
  690. procedure TfcCustomImager.SetPreProcess(Value: Boolean);
  691. begin
  692.   if FPreProcess <> Value then
  693.   begin
  694.     FPreProcess := Value;
  695.     Resized;
  696.   end;
  697. end;
  698. procedure TfcCustomImager.SetTransparent(Value: Boolean);
  699. begin
  700.   FTransparent:=Value;
  701.   if not PictureEmpty then Picture.Graphic.Transparent := Value;
  702.   Invalidate;
  703. end;
  704. procedure TfcCustomImager.SetTransparentColor(Value: TColor);
  705. begin
  706.   WorkBitmap.TransparentColor := Value;
  707.   UpdateWorkBitmap;
  708.   Invalidate;
  709.   ColorToString(clNone);
  710. end;
  711. function TfcCustomImager.GetRespectPalette;
  712. begin
  713. //  result := WorkBitmap.RespectPalette;
  714.   result:= FRespectPalette;
  715. end;
  716. function TfcCustomImager.GetSmoothStretching: Boolean;
  717. begin
  718.   result := WorkBitmap.SmoothStretching;
  719. end;
  720. function TfcCustomImager.GetTransparent: Boolean;
  721. begin
  722.   result:= FTransparent;
  723. //  result := False;
  724. //  if not PictureEmpty then result := Picture.Graphic.Transparent;
  725. end;
  726. function TfcCustomImager.GetTransparentColor: TColor;
  727. begin
  728.   result := WorkBitmap.TransparentColor;
  729. end;
  730. procedure TfcCustomImager.SetAutoSize(Value: Boolean);
  731. begin
  732.   if FAutoSize <> Value then
  733.   begin
  734.     FAutoSize := Value;
  735.     UpdateAutoSize;
  736.   end;
  737. end;
  738. {
  739. procedure TfcCustomImager.SetBitmap(Value: TfcBitmap);
  740. begin
  741.   FBitmap.Assign(Value);
  742. end;
  743. }
  744. function TfcCustomImager.PictureEmpty: Boolean;
  745. begin
  746.   result := (FPicture=Nil) or (FPicture.Graphic = nil) or (FPicture.Graphic.Empty);
  747. end;
  748. procedure TfcCustomImager.Invalidate;
  749. var r: TRect;
  750. begin
  751.   if InSetBounds then exit;
  752.   r := BoundsRect;
  753. //  if Parent <> nil then InvalidateRect(Parent.Handle, @r, True);
  754.   InvalidateRect(Handle, nil, True);
  755. end;
  756. procedure TfcCustomImager.RegisterChanges(ChangeLink: TfcChangeLink);
  757. begin
  758.   FChangeLinks.Add(ChangeLink);
  759. end;
  760. procedure TfcCustomImager.UnRegisterChanges(ChangeLink: TfcChangeLink);
  761. begin
  762.   FChangeLinks.Remove(ChangeLink);
  763. end;
  764. procedure TfcCustomImager.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  765. var SizeChanged: Boolean;
  766.     OldControlStyle: TControlStyle;
  767. begin
  768.   SizeChanged := (AWidth <> Width) or (AHeight <> Height);
  769.   if SizeChanged and not UpdatingAutosize then begin
  770.      InSetBounds:= True; { RSW - Don't erase background when resizing }
  771.      { 5/7/99 - Setting parent to opaque so it doesn't clear background.
  772.        This allows imager to not flicker when resizing imager }
  773.      if Parent<>nil then
  774.      begin
  775.         OldControlStyle:= Parent.ControlStyle;
  776.         Parent.ControlStyle:= Parent.ControlStyle + [csOpaque];
  777.      end;
  778.      inherited;
  779.      if Parent<>nil then Parent.ControlStyle:= OldControlStyle;
  780.      if Visible then Update;
  781.      Resized;
  782.      InSetBounds:= False;
  783.   end
  784.   else inherited;
  785. end;
  786. procedure TfcCustomImager.SetRespectPalette(Value: Boolean);
  787. begin
  788.   FRespectPalette:= Value;
  789.   WorkBitmap.RespectPalette := Value;
  790.   if value then
  791.      if (BitmapOptions.Color<>clNone) or (BitmapOptions.TintColor<>clNone) then
  792.         WorkBitmap.RespectPalette:= False;
  793.   Invalidate;
  794. end;
  795. procedure TfcCustomImager.SetSmoothStretching(Value: Boolean);
  796. begin
  797.   WorkBitmap.SmoothStretching := Value;
  798.   UpdateWorkBitmap;
  799.   Invalidate;
  800. end;
  801. procedure TfcCustomImager.Paint;
  802. begin
  803.   inherited;
  804.   if csDestroying in ComponentState then exit;
  805.   if FWorkBitmap.Empty and not PictureEmpty then
  806.   begin
  807.     UpdateWorkBitmap;
  808. //    Exit;
  809.   end;
  810.   if (csDesigning in ComponentState) and FWorkBitmap.Empty then with Canvas do
  811.   begin
  812.     Pen.Style := psDash;
  813.     Pen.Color := clBlack;
  814.     Brush.Color := clWhite;
  815.     Rectangle(0, 0, Width, Height);
  816.     Exit;
  817.   end;
  818.   if FWorkBitmap.Empty then Exit;
  819.   try
  820.     with GetDrawRect do
  821.       if PreProcess then
  822.         case DrawStyle of
  823.           dsNormal: Canvas.Draw(Left, Top, FWorkBitmap);
  824.           dsCenter: Canvas.Draw(Left, Top, FWorkBitmap);
  825.           dsTile: FWorkBitmap.TileDraw(Canvas, Rect(Left, Top, Right, Bottom));
  826.           dsStretch: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  827.           dsProportional: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  828.         end
  829.       else Canvas.Draw(Left, Top, FWorkBitmap);
  830.   finally
  831. {    if Transparent then fcTransparentDraw(Canvas, Rect(0, 0, Width, Height), DrawBitmap, DrawBitmap.Canvas.Pixels[0, 0])
  832.     else Canvas.Draw(0, 0, DrawBitmap);}
  833.   end;
  834. end;
  835. (*procedure TfcCustomImager.ParentMessages(var Message: TMessage; var ProcessMessage: Boolean);
  836. var s: TfcCustomImager;
  837. begin
  838.   if csDestroying in ComponentState then exit;
  839.   if not PictureEmpty and ((not EraseBackground) or InSetBounds) and
  840. {     not (csDesigning in ComponentState) and}  { 4/27/99 - Comment out - RSW }
  841.      (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}
  842.   begin
  843.     with TWMEraseBkGnd(Message) do
  844.     begin
  845.       Result := 1;
  846.       ProcessMessage := False;
  847.     end;
  848.   end
  849. end;
  850. *)
  851. procedure TfcCustomImager.Loaded;
  852. begin
  853.   inherited;
  854.   UpdateAutoSize;
  855.   FBitmapOptions.Changed;
  856. end;
  857. procedure TfcCustomImager.Notification(AComponent: TComponent; Operation: TOperation);
  858. begin
  859.   inherited Notification(AComponent, Operation);
  860. end;
  861. procedure TfcCustomImager.CutToClipboard;
  862. begin
  863.   if Picture.Graphic <> nil then
  864.   begin
  865.     CopyToClipboard;
  866.     Picture.Graphic := nil;
  867.   end;
  868. end;
  869. procedure TfcCustomImager.CopyToClipboard;
  870. var tempBitmap: TBitmap;
  871. begin
  872.    tempBitmap:= TBitmap.create;
  873.    WorkBitmap.SaveToBitmap(tempBitmap);
  874.    Clipboard.Assign(tempBitmap);
  875.    tempBitmap.Free;
  876. end;
  877. procedure TfcCustomImager.WndProc(var Message: TMessage);
  878. begin
  879.   inherited;
  880. end;
  881. type
  882.  TfcImagerWinControl = class(TWinControl)
  883.  private
  884.     Imager: TfcCustomImager;
  885.  protected
  886.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  887.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  888.     procedure KeyPress(var Key: Char); override;
  889.  public
  890.     constructor Create(AOwner: TComponent); override;
  891.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  892.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  893.  end;
  894. constructor TfcImagerWinControl.Create(AOwner: TComponent);
  895. begin
  896.    inherited;
  897.    ControlStyle := ControlStyle + [csReplicatable];
  898.    Imager:= AOwner as TfcCustomImager;
  899. end;
  900. procedure TfcImagerWinControl.CMEnter(var Message: TCMEnter);
  901. begin
  902.   Imager.DoEnter;
  903. end;
  904. procedure TfcImagerWinControl.CMExit(var Message: TCMExit);
  905. begin
  906.   Imager.DoExit;
  907. end;
  908. procedure TfcImagerWinControl.KeyDown(var Key: Word; Shift: TShiftState);
  909. begin
  910.    inherited KeyDown(Key, Shift);
  911.    Imager.KeyDown(Key, Shift);
  912. end;
  913. procedure TfcImagerWinControl.KeyUp(var Key: Word; Shift: TShiftState);
  914. begin
  915.    inherited KeyUp(Key, Shift);
  916.    Imager.KeyUp(Key, Shift);
  917. end;
  918. procedure TfcImagerWinControl.KeyPress(var Key: Char);
  919. begin
  920.    inherited KeyPress(Key);
  921.    Imager.KeyPress(Key);
  922. end;
  923. constructor TfcDBImager.Create(AOwner: TComponent);
  924. begin
  925.    inherited;
  926.    ControlStyle := ControlStyle + [csReplicatable];
  927.    FAutoDisplay:=True;
  928.    FDataLink := TFieldDataLink.Create;
  929.    FDataLink.Control := Self;
  930.    FDataLink.OnDataChange := DataChange;
  931.    FDataLink.OnUpdateData := UpdateData;
  932. end;
  933. destructor TfcDBImager.Destroy;
  934. begin
  935.    FDataLink.Free;
  936.    FDataLink:=nil;
  937.    inherited Destroy;
  938. end;
  939. procedure TfcDBImager.Notification(AComponent: TComponent;
  940.   Operation: TOperation);
  941. begin
  942.   inherited Notification(AComponent, Operation);
  943.   if (Operation = opRemove) and (FDataLink <> nil) and
  944.     (AComponent = DataSource) then DataSource := nil;
  945. end;
  946. procedure TfcDBImager.LoadPicture;
  947. begin
  948.   if not FPictureLoaded and (not Assigned(FDataLink.Field) or
  949.     FDataLink.Field.IsBlob) then
  950.   begin
  951.     Picture.Assign(FDataLink.Field);
  952.     Picture.Graphic.Transparent:=Transparent;
  953.     invalidate;
  954.   end;
  955. end;
  956. procedure TfcDBImager.DataChange(Sender: TObject);
  957. begin
  958.   Picture.Graphic := nil;
  959.   FPictureLoaded := False;
  960.   if FAutoDisplay then LoadPicture;
  961. end;
  962. procedure TfcDBImager.UpdateData(Sender: TObject);
  963. begin
  964.   if Picture.Graphic is TBitmap then
  965.      FDataLink.Field.Assign(Picture.Graphic) else
  966.      FDataLink.Field.Clear;
  967. end;
  968. function TfcDBImager.GetDataSource: TDataSource;
  969. begin
  970.   Result := FDataLink.DataSource;
  971. end;
  972. procedure TfcDBImager.SetDataSource(Value: TDataSource);
  973. begin
  974.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  975.     FDataLink.DataSource := Value;
  976.   if Value <> nil then Value.FreeNotification(Self);
  977. end;
  978. function TfcDBImager.GetDataField: string;
  979. begin
  980.   Result := FDataLink.FieldName;
  981. end;
  982. procedure TfcDBImager.SetDataField(const Value: string);
  983. begin
  984.   FDataLink.FieldName := Value;
  985. end;
  986. function TfcDBImager.GetReadOnly: Boolean;
  987. begin
  988.   Result := FDataLink.ReadOnly;
  989. end;
  990. procedure TfcDBImager.SetReadOnly(Value: Boolean);
  991. begin
  992.   FDataLink.ReadOnly := Value;
  993. end;
  994. function TfcDBImager.GetField: TField;
  995. begin
  996.   Result := FDataLink.Field;
  997. end;
  998. procedure TfcDBImager.CMGetDataLink(var Message: TMessage);
  999. begin
  1000.   Message.Result := Integer(FDataLink);
  1001. end;
  1002. procedure TfcDBImager.CutToClipboard;
  1003. begin
  1004.   if Picture.Graphic <> nil then
  1005.     if FDataLink.Edit then
  1006.     begin
  1007.       CopyToClipboard;
  1008.       Picture.Graphic := nil;
  1009.     end;
  1010. end;
  1011. procedure TfcDBImager.CopyToClipboard;
  1012. begin
  1013.   if Picture.Graphic <> nil then Clipboard.Assign(Picture);
  1014. end;
  1015. procedure TfcCustomImager.PasteFromClipboard;
  1016. begin
  1017.   if Clipboard.HasFormat(CF_BITMAP) then
  1018.   begin
  1019.     Picture.Bitmap.Assign(Clipboard);
  1020.     Picture.Graphic.Transparent:=Transparent;
  1021.   end
  1022. end;
  1023. procedure TfcDBImager.PasteFromClipboard;
  1024. begin
  1025.   if Clipboard.HasFormat(CF_BITMAP) and FDataLink.Edit then
  1026.   begin
  1027.     Picture.Bitmap.Assign(Clipboard);
  1028.     Picture.Graphic.Transparent:=Transparent;
  1029.   end
  1030. end;
  1031. procedure TfcCustomImager.DoEnter;
  1032. begin
  1033.   Invalidate; { Draw the focus marker }
  1034. end;
  1035. procedure TfcCustomImager.DoExit;
  1036. begin
  1037.    Invalidate; { Erase the focus marker }
  1038. end;
  1039. procedure TfcDBImager.DoExit;
  1040. begin
  1041.     try
  1042.       FDataLink.UpdateRecord;
  1043.     except
  1044.       FWinControl.SetFocus;
  1045.       raise;
  1046.     end;
  1047.     Invalidate; { Erase the focus marker }
  1048.     inherited;
  1049. end;
  1050. procedure TfcCustomImager.KeyUp(var Key: Word; Shift: TShiftState);
  1051. begin
  1052.   if Assigned(FOnKeyUp) then FOnKeyUp(Self, Key, Shift);
  1053. end;
  1054. procedure TfcCustomImager.KeyDown(var Key: Word; Shift: TShiftState);
  1055. begin
  1056.   if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
  1057.   case Key of
  1058.     VK_INSERT:
  1059.       if ssShift in Shift then PasteFromClipBoard else
  1060.         if ssCtrl in Shift then CopyToClipBoard;
  1061.     VK_DELETE:
  1062.       if ssShift in Shift then CutToClipBoard;
  1063.   end;
  1064. end;
  1065. procedure TfcCustomImager.KeyPress(var Key: Char);
  1066. begin
  1067.   if Assigned(FOnKeyPress) then FOnKeyPress(self, Key);
  1068.   case Key of
  1069.     ^X: CutToClipBoard;
  1070.     ^C: CopyToClipBoard;
  1071.     ^V: PasteFromClipBoard;
  1072.   end;
  1073. end;
  1074. procedure TfcDBImager.KeyPress(var Key: Char);
  1075. begin
  1076.   inherited KeyPress(Key);
  1077.   case Key of
  1078.     #13: LoadPicture;
  1079.     #27: FDataLink.Reset;
  1080.   end;
  1081. end;
  1082. procedure TfcCustomImager.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1083.       X, Y: Integer);
  1084. begin
  1085.    inherited;
  1086.    if FWinControl<>nil then FWinControl.SetFocus;
  1087. end;
  1088. {
  1089. Function TfcCustomImager.CreateImagerWinControl: TWinControl;
  1090. var WinControl: TWinControl;
  1091. begin
  1092.    WinControl:= TfcImagerWinControl.create(self);
  1093.    with WinControl do begin
  1094.       visible:=true;
  1095.       Left:=0;
  1096.       Top:=0;
  1097.       Height:=0;
  1098.       Width:=0;
  1099.       Parent:=self.Parent;
  1100.       TabStop:=self.TabStop;
  1101.    end;
  1102.    result:= WinControl;
  1103. end;
  1104. }
  1105. (*
  1106. procedure TfcCustomImager.SetFocusable(Value: boolean);
  1107. begin
  1108.    if Value<>FFocusable then begin
  1109.       FFocusable:=Value;
  1110.       if (Value or Focusable) then begin
  1111. {          if (FWinControl=nil) then
  1112.              FWinControl:= CreateImagerWinControl;
  1113.           FWinControl.TabStop:=TabStop;}
  1114.       end
  1115.       else begin
  1116.          FWinControl.Free;
  1117.          FWinControl:=nil;
  1118.       end
  1119.    end
  1120. end;
  1121. *)
  1122. (*
  1123. procedure TfcCustomImager.SetTabStop(Value: boolean);
  1124. begin
  1125.    if Value<>FTabStop then begin
  1126.       FTabStop:=Value;
  1127.       if (Value or Focusable)then begin
  1128. {          if (FWinControl=nil) then
  1129.              FWinControl:= CreateImagerWinControl;
  1130.           FWinControl.TabStop:=Value;}
  1131.       end
  1132.       else begin
  1133.          FWinControl.Free;
  1134.          FWinControl:=nil;
  1135.       end
  1136.    end
  1137. end;
  1138. *)
  1139. procedure TfcDBImager.Paint;
  1140. var Form: TCustomForm;
  1141.     tempImager: TfcImager;
  1142. begin
  1143.    if csDestroying in ComponentState then exit;
  1144.    if (csPaintCopy in ControlState) and
  1145.       Assigned(FDataLink.Field) and FDataLink.Field.IsBlob then
  1146.    begin
  1147.       if Transparent then
  1148.       begin
  1149.         // This would not work in inspector bitmap bakckground case
  1150.         Canvas.Brush.Color:=TEdit(parent).color;
  1151.         Canvas.FillRect(ClientRect);
  1152.       end;
  1153.       tempImager := TfcImager.create(self);
  1154.       tempImager.height:= height;
  1155.       tempImager.width:=width;
  1156.       tempImager.picture.assign(FDataLink.Field);
  1157.       tempImager.transparent:=Transparent;
  1158.       SetBkMode(Canvas.Handle, windows.TRANSPARENT);
  1159.       tempImager.Perform(WM_PAINT, Canvas.Handle, 0);
  1160.       SetBkMode(Canvas.Handle, OPAQUE);
  1161.       tempImager.Free;
  1162.       exit;
  1163. //      if Picture.Graphic is TBitmap then
  1164. //         DrawPict.Bitmap.IgnorePalette := QuickDraw;
  1165.    end
  1166.    else begin
  1167.       if Transparent then
  1168.       begin
  1169.         Canvas.Brush.Color:=TEdit(parent).color;
  1170.         Canvas.FillRect(ClientRect);
  1171.       end;
  1172.    end;
  1173.    inherited;
  1174.    Form := GetParentForm(Self);
  1175.    if (Form <> nil) and (FWinControl<>nil) and
  1176.     (Form.ActiveControl = FWinControl) and
  1177.      not (csDesigning in ComponentState) and
  1178.      not (csPaintCopy in ControlState) then
  1179.    begin
  1180.      Canvas.Brush.Color := clWindowFrame;
  1181.      Canvas.FrameRect(ClientRect);
  1182.    end;
  1183. end;
  1184. procedure TfcDBImager.SetAutoDisplay(Value: Boolean);
  1185. begin
  1186.   if FAutoDisplay <> Value then
  1187.   begin
  1188.     FAutoDisplay := Value;
  1189.     if Value then LoadPicture;
  1190.   end;
  1191. end;
  1192. procedure TfcDBImager.BitmapChange(Sender: TObject);
  1193. begin
  1194.   inherited;
  1195.   if FPictureLoaded then FDataLink.Modified;
  1196.   FPictureLoaded := True;
  1197. end;
  1198. procedure TfcCustomImager.WMEraseBkgnd(var Message: TWmEraseBkgnd);
  1199. begin
  1200.   if True then begin
  1201.      Message.result:= 1;
  1202.      exit;
  1203.   end
  1204.   else inherited;
  1205. end;
  1206. end.