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

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. // 9/27/2001-Added SetFocus,TabOrder, and OnEnter/OnExit events. (Only fired when focusable).
  10. // 10/11/2001-Added ProportionalCenter Draw Style.
  11. // 1/16/2002 - Not using gclassname in paint event.
  12. // 3/14/2002 - Correct for painting in a grid when csPaintCopy State.
  13. // 4/9/2002 - Made GetDrawRect public.
  14. // 5/30/2001-PYW- Make certain parent's handle has already been allocated when invalidating parent.
  15. }
  16. interface
  17. uses
  18.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  19.   fcCommon, fcBitmap, fcChangeLink, db, dbctrls, stdctrls;
  20. {$i fcIfDef.pas}
  21. type
  22.   TfcImagerDrawStyle = (dsNormal, dsCenter, dsStretch, dsTile, dsProportional, dsProportionalCenter);
  23.   TfcBitmapOptions = class;
  24.   TfcRotate = class(TPersistent)
  25.   private
  26.     FBitmapOptions: TfcBitmapOptions;
  27.     FCenterX: Integer;
  28.     FCenterY: Integer;
  29.     FAngle: Integer;
  30.     procedure SetAngle(Value: Integer);
  31.     procedure SetCenterX(Value: Integer);
  32.     procedure SetCenterY(Value: Integer);
  33.   public
  34.     constructor Create(BitmapOptions: TfcBitmapOptions);
  35.   published
  36.     property CenterX: Integer read FCenterX write SetCenterX;
  37.     property CenterY: Integer read FCenterY write SetCenterY;
  38.     property Angle: Integer read FAngle write SetAngle;
  39.   end;
  40.   TfcAlphaBlend = class(TPersistent)
  41.   private
  42.     FBitmapOptions: TfcBitmapOptions;
  43.     FAmount: Byte;
  44.     FBitmap: TfcBitmap;
  45.     FChanging: Boolean;
  46.     function GetTransparent: Boolean;
  47.     procedure SetAmount(Value: Byte);
  48.     procedure SetBitmap(Value: TfcBitmap);
  49.     procedure SetTransparent(Value: Boolean);
  50.   protected
  51.     procedure BitmapChanged(Sender: TObject); virtual;
  52.   public
  53.     constructor Create(BitmapOptions: TfcBitmapOptions);
  54.     destructor Destroy; override;
  55.   published
  56.     property Amount: Byte read FAmount write SetAmount;
  57.     property Bitmap: TfcBitmap read FBitmap write SetBitmap;
  58.     property Transparent: Boolean read GetTransparent write SetTransparent;
  59.   end;
  60.   TfcWave = class(TPersistent)
  61.   private
  62.     FBitmapOptions: TfcBitmapOptions;
  63.     FXDiv, FYDiv, FRatio: Integer;
  64.     FWrap: Boolean;
  65.     procedure SetXDiv(Value: Integer);
  66.     procedure SetYDiv(Value: Integer);
  67.     procedure SetRatio(Value: Integer);
  68.     procedure SetWrap(Value: Boolean);
  69.   public
  70.     constructor Create(BitmapOptions: TfcBitmapOptions);
  71.   published
  72.     property XDiv: Integer read FXDiv write SetXDiv;
  73.     property YDiv: Integer read FYDiv write SetYDiv;
  74.     property Ratio: Integer read FRatio write SetRatio;
  75.     property Wrap: Boolean read FWrap write SetWrap;
  76.   end;
  77.   TfcBitmapOptions = class(TPersistent)
  78.   private
  79.     FComponent: TComponent;
  80.     FAlphaBlend: TfcAlphaBlend;
  81.     FColor: TColor;
  82.     FContrast: Integer;
  83.     FEmbossed: Boolean;
  84.     FTintColor: TColor;
  85.     FGaussianBlur: Integer;
  86.     FGrayScale: Boolean;
  87.     FHorizontallyFlipped: Boolean;
  88.     FInverted: Boolean;
  89.     FLightness: Integer;
  90.     FRotation: TfcRotate;
  91.     FSaturation: Integer;
  92.     FSharpen: Integer;
  93.     FSponge: Integer;
  94.     FTile: Boolean;
  95.     FVerticallyFlipped: Boolean;
  96.     FWave: TfcWave;
  97.     FOnChange: TNotifyEvent;
  98.     FOrigPicture: TPicture;
  99.     FDestBitmap: TfcBitmap;
  100.     FUpdateLock: Integer;
  101.     // Property Access methods;
  102.     procedure SetColor(Value: TColor);
  103.     procedure SetBooleanProperty(Index: Integer; Value: Boolean);
  104.     procedure SetTintColor(Value: TColor);
  105.     procedure SetIntegralProperty(Index: Integer; Value: Integer);
  106.   public
  107.     constructor Create(AComponent: TComponent);
  108.     destructor Destroy; override;
  109.     procedure BeginUpdate; virtual;
  110.     procedure Changed; virtual;
  111.     procedure EndUpdate;
  112.     property DestBitmap: TfcBitmap read FDestBitmap write FDestBitmap;
  113.     property OrigPicture: TPicture read FOrigPicture write FOrigPicture;
  114.     property Tile: Boolean read FTile write FTile;
  115.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  116.   published
  117.     property AlphaBlend: TfcAlphaBlend read FAlphaBlend write FAlphaBlend;
  118.     property Color: TColor read FColor write SetColor;
  119.     property Contrast: Integer index 4 read FContrast write SetIntegralProperty;
  120.     property Embossed: Boolean index 0 read FEmbossed write SetBooleanProperty;
  121.     property TintColor: TColor read FTintColor write SetTintColor;
  122.     property GaussianBlur: Integer index 3 read FGaussianBlur write SetIntegralProperty;
  123.     property GrayScale: Boolean index 2 read FGrayScale write SetBooleanProperty;
  124.     property HorizontallyFlipped: Boolean index 3 read FHorizontallyFlipped write SetBooleanProperty;
  125.     property Inverted: Boolean index 1 read FInverted write SetBooleanProperty;
  126.     property Lightness: Integer index 0 read FLightness write SetIntegralProperty;
  127.     property Rotation: TfcRotate read FRotation write FRotation;
  128.     property Saturation: Integer index 1 read FSaturation write SetIntegralProperty;
  129.     property Sharpen: Integer index 5 read FSharpen write SetIntegralProperty;
  130.     property Sponge: Integer index 2 read FSponge write SetIntegralProperty;
  131.     property VerticallyFlipped: Boolean index 4 read FVerticallyFlipped write SetBooleanProperty;
  132.     property Wave: TfcWave read FWave write FWave;
  133.   end;
  134.   TfcCustomImager = class(TGraphicControl)
  135.   private
  136.     { Private declarations }
  137.     FAutoSize: Boolean;
  138.     FBitmapOptions: TfcBitmapOptions;
  139.     FDrawStyle: TfcImagerDrawStyle;
  140.     FEraseBackground: Boolean;
  141.     FPreProcess: Boolean;
  142.     FWorkBitmap: TfcBitmap;
  143.     FPicture: TPicture;
  144.     FChangeLinks: TList;
  145.     FRespectPalette: boolean;
  146.     FTransparent: boolean;  // Keep track in component instead of in picture
  147.                             // This helps databound case support transparency
  148.     FWinControl: TWinControl;
  149.     FOnEnter: TNotifyEvent;
  150.     FOnExit: TNotifyEvent;
  151.     FFocusable: boolean;
  152.     FOnKeyPress: TKeyPressEvent;
  153.     FOnKeyDown, FOnKeyUp: TKeyEvent;
  154.     FTabStop: boolean;
  155.     FTabOrder: Integer;
  156.     FFocused: boolean;
  157.     FShowFocusRect: boolean;
  158.     procedure SetTabStop(value: boolean);
  159.     procedure SetTabOrder(value: integer);
  160.     function GetRespectPalette: Boolean;
  161.     function GetSmoothStretching: Boolean;
  162.     function GetTransparent: Boolean;
  163.     function GetTransparentColor: TColor;
  164.     {$ifndef fcDelphi6Up}
  165.     procedure SetAutoSize(Value: Boolean);
  166.     {$endif}
  167.     procedure SetDrawStyle(Value: TfcImagerDrawStyle);
  168.     procedure SetEraseBackground(Value: Boolean);
  169.     procedure SetPreProcess(Value: Boolean);
  170.     procedure SetPicture(Value: TPicture);
  171.     procedure SetRespectPalette(Value: Boolean);
  172.     procedure SetSmoothStretching(Value: Boolean);
  173.     procedure SetShowFocusRect(Value: Boolean);
  174.     procedure SetTransparent(Value: Boolean);
  175.     procedure SetTransparentColor(Value: TColor);
  176.     procedure NotifyChanges;
  177.     procedure SetFocusable(Value: boolean);
  178.   protected
  179.     {$ifdef fcDelphi6Up}
  180.     procedure SetAutoSize(Value: Boolean); override;
  181.     {$endif}
  182.     Function CreateImagerWinControl: TWinControl; virtual;
  183.     procedure SetParent(Value: TWinControl); override;
  184.     procedure BitmapOptionsChange(Sender: TObject); virtual;
  185.     procedure BitmapChange(Sender: TObject); virtual;
  186.     procedure UpdateAutoSize; virtual;
  187.     procedure Loaded; override;
  188.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  189.     procedure Paint; override;
  190.     procedure WndProc(var Message: TMessage); override;
  191.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  192.       X, Y: Integer); override;
  193.     procedure KeyUp(var Key: Word; Shift: TShiftState); virtual;
  194.     procedure KeyDown(var Key: Word; Shift: TShiftState); virtual;
  195.     procedure KeyPress(var Key: Char); virtual;
  196.     procedure DoEnter; virtual;
  197.     procedure DoExit; virtual;
  198.     property EraseBackground: Boolean read FEraseBackground write SetEraseBackground default True;
  199.     property Focused: Boolean read FFocused;
  200.   public
  201.     UpdatingAutoSize: Boolean;
  202.     InSetBounds: boolean;
  203.     Patch: Variant;
  204.     constructor Create(AOwner: TComponent); override;
  205.     destructor Destroy; override;
  206.     function PictureEmpty: Boolean; virtual;
  207.     procedure Invalidate; override;
  208.     procedure RegisterChanges(ChangeLink: TfcChangeLink); virtual;
  209.     procedure Resized; virtual;
  210.     procedure UpdateWorkBitmap; virtual;
  211.     procedure UnRegisterChanges(ChangeLink: TfcChangeLink); virtual;
  212.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  213.     procedure CopyToClipboard; virtual;
  214.     procedure PasteFromClipboard; virtual;
  215.     procedure CutToClipboard; virtual;
  216.     procedure SetFocus; virtual;
  217.     function GetColorAtPoint(X,Y:Integer):TColor;
  218.     function GetDrawRect: TRect;
  219.     property Align;
  220.     property AutoSize: Boolean read FAutoSize write SetAutoSize;
  221.     property BitmapOptions: TfcBitmapOptions read FBitmapOptions write FBitmapOptions;
  222.     property DrawStyle: TfcImagerDrawStyle read FDrawStyle write SetDrawStyle;
  223.     property PreProcess: Boolean read FPreProcess write SetPreProcess;
  224.     property Picture: TPicture read FPicture write SetPicture;
  225.     property RespectPalette: Boolean read GetRespectPalette write SetRespectPalette default True;
  226.     property ShowFocusRect: Boolean read FShowFocusRect write SetShowFocusRect default False;
  227.     property SmoothStretching: Boolean read GetSmoothStretching write SetSmoothStretching;
  228.     property Transparent: Boolean read GetTransparent write SetTransparent;
  229.     property TransparentColor: TColor read GetTransparentColor write SetTransparentColor;
  230.     property WorkBitmap: TfcBitmap read FWorkBitmap;
  231.     property Focusable: boolean read FFocusable write SetFocusable default False;
  232.     property TabOrder: integer read FTabOrder write SetTabOrder;
  233.     property TabStop: boolean read FTabStop write SetTabStop default False;
  234.     property OnKeyPress : TKeyPressEvent read FOnKeyPress write FOnKeyPress;
  235.     property OnKeyDown : TKeyEvent read FOnKeyDown write FOnKeyDown;
  236.     property OnKeyUp : TKeyEvent read FOnKeyUp write FOnKeyUp;
  237.     property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;
  238.     property OnExit: TNotifyEvent read FOnExit write FOnExit;
  239.   end;
  240.   TfcImager = class(TfcCustomImager)
  241.   published
  242.     { Published declarations }
  243.     property Align;
  244.     property AutoSize;
  245.     property BitmapOptions;
  246.     property DrawStyle;
  247.     property Picture;
  248.     property PreProcess;
  249.     property RespectPalette;
  250.     property SmoothStretching;
  251.     property Transparent;
  252.     property TransparentColor;
  253.     property Visible;
  254.     property Focusable;
  255.     property Anchors;
  256.     property Constraints;
  257.     property OnEndDock;
  258.     property OnStartDock;
  259.     property OnClick;
  260.     property OnDblClick;
  261.     property OnDragDrop;
  262.     property OnDragOver;
  263.     property OnEndDrag;
  264.     property OnEnter;
  265.     property OnExit;
  266.     property OnMouseDown;
  267.     property OnMouseMove;
  268.     property OnMouseUp;
  269.     property OnStartDrag;
  270.     property TabOrder;
  271.     property TabStop;
  272.     property OnKeyPress;
  273.     property OnKeyDown;
  274.     property OnKeyUp;
  275.   end;
  276.   TfcDBCustomImager = class(TCustomControl)
  277.   private
  278.     { Private declarations }
  279.     FAutoSize: Boolean;
  280.     FBitmapOptions: TfcBitmapOptions;
  281.     FDrawStyle: TfcImagerDrawStyle;
  282.     FPreProcess: Boolean;
  283.     FWorkBitmap: TfcBitmap;
  284.     FPicture: TPicture;
  285.     FChangeLinks: TList;
  286.     FRespectPalette: boolean;
  287.     FTransparent: boolean;  // Keep track in component instead of in picture
  288.                             // This helps databound case support transparency
  289.     FInResized:boolean;
  290.     function GetRespectPalette: Boolean;
  291.     function GetSmoothStretching: Boolean;
  292.     function GetTransparent: Boolean;
  293.     function GetTransparentColor: TColor;
  294.     {$ifndef fcDelphi6Up}
  295.     procedure SetAutoSize(Value: Boolean);
  296.     {$endif}
  297.     procedure SetDrawStyle(Value: TfcImagerDrawStyle);
  298.     procedure SetPreProcess(Value: Boolean);
  299.     procedure SetPicture(Value: TPicture);
  300.     procedure SetRespectPalette(Value: Boolean);
  301.     procedure SetSmoothStretching(Value: Boolean);
  302.     procedure SetTransparent(Value: Boolean);
  303.     procedure SetTransparentColor(Value: TColor);
  304.     function GetDrawRect: TRect;
  305.     procedure NotifyChanges;
  306.     procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBkgnd;
  307.   protected
  308.     {$ifdef fcDelphi6Up}
  309.     procedure SetAutoSize(Value: Boolean); override;
  310.     {$endif}
  311.     procedure BitmapOptionsChange(Sender: TObject); virtual;
  312.     procedure BitmapChange(Sender: TObject); virtual;
  313.     procedure UpdateAutoSize; virtual;
  314.     procedure Loaded; override;
  315.     procedure Paint; override;
  316.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  317.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  318.     procedure CreateWnd; override;
  319.   public
  320.     UpdatingAutoSize: Boolean;
  321.     InSetBounds: boolean;
  322.     Patch: Variant;
  323.     constructor Create(AOwner: TComponent); override;
  324.     destructor Destroy; override;
  325.     function PictureEmpty: Boolean; virtual;
  326.     function GetColorAtPoint(X,Y:Integer):TColor;
  327.     procedure Invalidate; override;
  328.     procedure RegisterChanges(ChangeLink: TfcChangeLink); virtual;
  329.     procedure Resized; virtual;
  330.     procedure UpdateWorkBitmap; virtual;
  331.     procedure UnRegisterChanges(ChangeLink: TfcChangeLink); virtual;
  332.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  333.     property Align;
  334.     property AutoSize: Boolean read FAutoSize write SetAutoSize;
  335.     property BitmapOptions: TfcBitmapOptions read FBitmapOptions write FBitmapOptions;
  336.     property DrawStyle: TfcImagerDrawStyle read FDrawStyle write SetDrawStyle;
  337.     property PreProcess: Boolean read FPreProcess write SetPreProcess;
  338.     property Picture: TPicture read FPicture write SetPicture;
  339.     property RespectPalette: Boolean read GetRespectPalette write SetRespectPalette default True;
  340.     property SmoothStretching: Boolean read GetSmoothStretching write SetSmoothStretching;
  341.     property Transparent: Boolean read GetTransparent write SetTransparent;
  342.     property TransparentColor: TColor read GetTransparentColor write SetTransparentColor;
  343.     property WorkBitmap: TfcBitmap read FWorkBitmap;
  344.   end;
  345.   TfcImagerPictureType = (fcptBitmap,fcptJpg,fcptMetafile,fcptIcon);
  346.   type TfcDBImager=class;
  347.   TfcCalcPictureTypeEvent =
  348.     procedure (ImageControl:TfcDBImager;var PictureType:TfcImagerPictureType;var GraphicClassName:String) of object;
  349.   TfcDBImager = class(TfcDBCustomImager)
  350.   private
  351.     FDataLink: TFieldDataLink;
  352.     FPictureLoaded: boolean;
  353.     FAutoDisplay: Boolean;
  354.     FBorderStyle: TBorderStyle;
  355.     FPictureType:TfcImagerPictureType;
  356.     FOnCalcPictureType: TfcCalcPictureTypeEvent;
  357.     procedure SetPictureType(Value:TfcImagerPictureType);
  358.     procedure SetBorderStyle(Value: TBorderStyle);
  359.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  360.     procedure DataChange(Sender: TObject);
  361.     function GetDataField: string;
  362.     function GetDataSource: TDataSource;
  363.     function GetField: TField;
  364.     function GetReadOnly: Boolean;
  365.     procedure SetReadOnly(Value: Boolean);
  366.     procedure UpdateData(Sender: TObject);
  367.     procedure SetDataField(const Value: string);
  368.     procedure SetDataSource(Value: TDataSource);
  369.     procedure SetAutoDisplay(Value: Boolean);
  370.     procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
  371.     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
  372.     procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBkgnd;
  373.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  374.   protected
  375.     procedure CreateParams(var Params: TCreateParams); override;
  376.     procedure Notification(AComponent: TComponent;
  377.       Operation: TOperation); override;
  378.     procedure LoadPicture; virtual;
  379.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  380.     procedure KeyPress(var Key: Char); override;
  381.     procedure DoExit; override;
  382.     procedure Paint; override;
  383.     procedure BitmapChange(Sender: TObject); override;
  384.     function GetPalette: HPALETTE; override;
  385.     function PaletteChanged(Foreground: Boolean): Boolean; override;
  386.   public
  387.     constructor Create(AOwner: TComponent); override;
  388.     destructor Destroy; override;
  389.     procedure CopyToClipboard; virtual;
  390.     procedure PasteFromClipboard; virtual;
  391.     procedure CutToClipboard; virtual;
  392.     procedure DoCalcPictureType(var PictureType:TfcImagerPictureType;var GraphicClassName:String); virtual;
  393.     function ExecuteAction(Action: TBasicAction): Boolean; override;
  394.     function UpdateAction(Action: TBasicAction): Boolean; override;
  395.     property Field: TField read GetField;
  396.   published
  397.     property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
  398.     property DataField: string read GetDataField write SetDataField;
  399.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  400.     property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  401.     property Ctl3D;
  402.     property Color default clWindow;
  403.     property ParentCtl3D;
  404.     property ParentColor default False;
  405.     property PictureType: TfcImagerPictureType read FPictureType write SetPictureType default fcptBitmap;
  406.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  407.     property Align;
  408.     property AutoSize;
  409.     property BitmapOptions;
  410.     property DrawStyle;
  411. //    property Picture;
  412.     property PreProcess;
  413.     property RespectPalette;
  414.     property SmoothStretching;
  415.     property Transparent;
  416.     property TransparentColor;
  417.     property Visible;
  418.     property Anchors;
  419.     property Constraints;
  420.     property OnEndDock;
  421.     property OnStartDock;
  422.     property OnClick;
  423.     property OnCalcPictureType: TfcCalcPictureTypeEvent read FOnCalcPictureType write FOnCalcPictureType;
  424.     property OnDblClick;
  425.     property OnDragDrop;
  426.     property OnDragOver;
  427.     property OnEndDrag;
  428.     property OnMouseDown;
  429.     property OnMouseMove;
  430.     property OnMouseUp;
  431.     property OnStartDrag;
  432.     property TabOrder;
  433.     property TabStop;
  434.     property OnKeyPress;
  435.     property OnKeyDown;
  436.     property OnKeyUp;
  437.     property OnEnter;
  438.     property OnExit;
  439.   end;
  440. implementation
  441. uses clipbrd;
  442. constructor TfcRotate.Create(BitmapOptions: TfcBitmapOptions);
  443. begin
  444.   inherited Create;
  445.   FCenterX := -1;
  446.   FCenterY := -1;
  447.   FBitmapOptions := BitmapOptions;
  448. end;
  449. procedure TfcRotate.SetCenterX(Value: Integer);
  450. begin
  451.   if FCenterX <> Value then
  452.   begin
  453.     FCenterX := Value;
  454.     FBitmapOptions.Changed;
  455.   end;
  456. end;
  457. procedure TfcRotate.SetCenterY(Value: Integer);
  458. begin
  459.   if FCenterY <> Value then
  460.   begin
  461.     FCenterY := Value;
  462.     FBitmapOptions.Changed;
  463.   end;
  464. end;
  465. procedure TfcRotate.SetAngle(Value: Integer);
  466. begin
  467.   if FAngle <> Value then
  468.   begin
  469.     FAngle := Value;
  470.     FBitmapOptions.Changed;
  471.   end;
  472. end;
  473. constructor TfcAlphaBlend.Create(BitmapOptions: TfcBitmapOptions);
  474. begin
  475.   inherited Create;
  476.   FBitmapOptions := BitmapOptions;
  477.   FBitmap := TfcBitmap.Create;
  478. //  FBitmap.OnChange := BitmapChanged;
  479. end;
  480. destructor TfcAlphaBlend.Destroy;
  481. begin
  482.   FBitmap.Free;
  483.   inherited;
  484. end;
  485. procedure TfcAlphaBlend.BitmapChanged(Sender: TObject);
  486. begin
  487.   if FChanging then Exit;
  488.   FChanging := True;
  489.   FBitmapOptions.Changed;
  490.   FChanging := False;
  491. end;
  492. function TfcAlphaBlend.GetTransparent: Boolean;
  493. begin
  494.   result := Bitmap.Transparent;
  495. end;
  496. procedure TfcAlphaBlend.SetTransparent(Value: Boolean);
  497. begin
  498.   Bitmap.Transparent := Value;
  499. end;
  500. procedure TfcAlphaBlend.SetAmount(Value: Byte);
  501. begin
  502.   if FAmount <> Value then
  503.   begin
  504.     FAmount := Value;
  505.     FBitmapOptions.Changed;
  506.   end;
  507. end;
  508. procedure TfcAlphaBlend.SetBitmap(Value: TfcBitmap);
  509. begin
  510.   FBitmap.Assign(Value);
  511. end;
  512. constructor TfcWave.Create(BitmapOptions: TfcBitmapOptions);
  513. begin
  514.   inherited Create;
  515.   FBitmapOptions := BitmapOptions;
  516. end;
  517. procedure TfcWave.SetXDiv(Value: Integer);
  518. begin
  519.   if FXDiv <> Value then
  520.   begin
  521.     FXDiv := Value;
  522.     FBitmapOptions.Changed;
  523.   end;
  524. end;
  525. procedure TfcWave.SetYDiv(Value: Integer);
  526. begin
  527.   if FYDiv <> Value then
  528.   begin
  529.     FYDiv := Value;
  530.     FBitmapOptions.Changed;
  531.   end;
  532. end;
  533. procedure TfcWave.SetRatio(Value: Integer);
  534. begin
  535.   if FRatio <> Value then
  536.   begin
  537.     FRatio := Value;
  538.     FBitmapOptions.Changed;
  539.   end;
  540. end;
  541. procedure TfcWave.SetWrap(Value: Boolean);
  542. begin
  543.   if FWrap <> Value then
  544.   begin
  545.     FWrap := Value;
  546.     FBitmapOptions.Changed;
  547.   end;
  548. end;
  549. constructor TfcBitmapOptions.Create(AComponent: TComponent);
  550. begin
  551.   inherited Create;
  552.   FComponent := AComponent;
  553.   FAlphaBlend := TfcAlphaBlend.Create(self);
  554.   FRotation := TfcRotate.Create(self);
  555.   FColor := clNone;
  556.   FTintColor := clNone;
  557.   FSaturation := -1;
  558.   FWave := TfcWave.Create(self);
  559. end;
  560. destructor TfcBitmapOptions.Destroy;
  561. begin
  562.   FAlphaBlend.Free;                    
  563.   FRotation.Free;
  564.   FWave.Free;
  565.   inherited;
  566. end;
  567. procedure TfcBitmapOptions.Changed;
  568. var TmpBitmap: TfcBitmap;
  569. begin
  570.   if (csLoading in FComponent.ComponentState) or DestBitmap.Empty or ((OrigPicture.Graphic = nil) or OrigPicture.Graphic.Empty) or (FUpdateLock > 0) then Exit;
  571.   if (DestBitmap.Width = OrigPicture.Width) and (DestBitmap.Height = OrigPicture.Height) then
  572.     DestBitmap.Assign(OrigPicture.Graphic)
  573.   else begin
  574.     if Tile then fcTileDraw(OrigPicture.Graphic, DestBitmap.Canvas, Rect(0, 0, DestBitmap.Width, DestBitmap.Height))
  575.     else begin
  576.       TmpBitmap := TfcBitmap.Create;
  577.       TmpBitmap.Assign(OrigPicture.Graphic);
  578.       if FComponent is TfcCustomImager then
  579.          TmpBitmap.SmoothStretching := TfcCustomImager(FComponent).SmoothStretching
  580.       else if FComponent is TfcDBCustomImager then
  581.          TmpBitmap.SmoothStretching := TfcDBCustomImager(FComponent).SmoothStretching;
  582.       try
  583.         DestBitmap.Canvas.StretchDraw(Rect(0, 0, DestBitmap.Width, DestBitmap.Height), TmpBitmap);
  584.       finally
  585.         TmpBitmap.Free;
  586.       end;
  587.     end;
  588.   end;
  589.   if FGrayScale then DestBitmap.GrayScale;
  590.   if FLightness <> 0 then DestBitmap.Brightness(FLightness);
  591.   if (FAlphaBlend.Amount <> 0) and not FAlphaBlend.Bitmap.Empty then
  592.     DestBitmap.AlphaBlend(FAlphaBlend.Bitmap, FAlphaBlend.Amount, True);
  593.   if FColor <> clNone then with fcGetColor(ColorToRGB(FColor)) do
  594.     DestBitmap.Colorize(r, g, b);
  595.   if FTintColor <> clNone then with fcGetColor(ColorToRGB(FTintColor)) do
  596.     DestBitmap.ColorTint(r div 2, g div 2, b div 2);
  597.   if FSponge <> 0 then DestBitmap.Sponge(FSponge);
  598.   if FSaturation <> -1 then DestBitmap.Saturation(FSaturation);
  599.   if FGaussianBlur <> 0 then DestBitmap.GaussianBlur(FGaussianBlur);
  600.   if FEmbossed then DestBitmap.Emboss;
  601.   if FInverted then DestBitmap.Invert;
  602.   if FContrast <> 0 then DestBitmap.Contrast(FContrast);
  603.   if FSharpen <> 0 then DestBitmap.Sharpen(FSharpen);
  604.   if FHorizontallyFlipped then DestBitmap.Flip(True);
  605.   if FVerticallyFlipped then DestBitmap.Flip(False);
  606.   with FWave do if (Ratio <> 0) and (XDiv <> 0) and (YDiv <> 0) then
  607.     DestBitmap.Wave(XDiv, YDiv, Ratio, Wrap);
  608.   if FRotation.Angle <> 0 then with Rotation do
  609.     DestBitmap.Rotate(Point(CenterX, CenterY), Angle);
  610.   if Assigned(FOnChange) then FOnChange(self);
  611. end;
  612. procedure TfcBitmapOptions.BeginUpdate;
  613. begin
  614.   inc(FUpdateLock);
  615. end;
  616. procedure TfcBitmapOptions.EndUpdate;
  617. begin
  618.   if FUpdateLock > 0 then dec(FUpdateLock);
  619.   Changed;
  620. end;
  621. procedure TfcBitmapOptions.SetColor(Value: TColor);
  622. begin
  623.   if FColor <> Value then
  624.   begin
  625.     FColor := Value;
  626.     Changed;
  627.   end;
  628. end;
  629. procedure TfcBitmapOptions.SetTintColor(Value: TColor);
  630. begin
  631.   if FTintColor <> Value then
  632.   begin
  633.     FTintColor := Value;
  634.     Changed;
  635.   end;
  636. end;
  637. procedure TfcBitmapOptions.SetIntegralProperty(Index: Integer; Value: Integer);
  638.   procedure DoCheck(StorageVar: PInteger);
  639.   begin
  640.     if StorageVar^ <> Value then
  641.     begin
  642.       StorageVar^ := Value;
  643.       Changed;
  644.     end;
  645.   end;
  646. begin
  647.   case Index of
  648.     0: DoCheck(@FLightness);
  649.     1: DoCheck(@FSaturation);
  650.     2: DoCheck(@FSponge);
  651.     3: DoCheck(@FGaussianBlur);
  652.     4: DoCheck(@FContrast);
  653.     5: DoCheck(@FSharpen);
  654.   end;
  655. end;
  656. type PBoolean = ^Boolean;
  657. type TfcIcon = class(TIcon)
  658. protected
  659.     procedure Draw(ACanvas: TCanvas; const Rect: TRect); override;
  660. end;
  661. type TCheatCanvas=class(TCanvas);
  662. procedure TfcIcon.Draw(ACanvas: TCanvas; const Rect: TRect);
  663. begin
  664.   with Rect.TopLeft do
  665.   begin
  666.     TCheatCanvas(ACanvas).RequiredState([csHandleValid]);
  667.     DrawIconEx(ACanvas.Handle, X, Y, Handle, Rect.Right-Rect.Left, Rect.Bottom-Rect.Top, 0, 0, DI_NORMAL);
  668.   end;
  669. end;
  670. procedure TfcBitmapOptions.SetBooleanProperty(Index: Integer; Value: Boolean);
  671.   procedure DoCheck(StorageVar: PBoolean);
  672.   begin
  673.     if StorageVar^ <> Value then
  674.     begin
  675.       StorageVar^ := Value;
  676.       Changed;
  677.     end;
  678.   end;
  679. begin
  680.   case Index of
  681.     0: DoCheck(@FEmbossed);
  682.     1: DoCheck(@FInverted);
  683.     2: DoCheck(@FGrayScale);
  684.     3: DoCheck(@FHorizontallyFlipped);
  685.     4: DoCheck(@FVerticallyFlipped);
  686.   end;
  687. end;
  688. constructor TfcCustomImager.Create(AOwner: TComponent);
  689. begin
  690.   inherited Create(AOwner);
  691.   FEraseBackground:= True;
  692.   FPicture := TPicture.Create;
  693.   FPicture.OnChange := BitmapChange;
  694.   FWorkBitmap := TfcBitmap.Create;
  695.   FRespectPalette:= True;
  696.   FWorkBitmap.RespectPalette := True;
  697.   FWorkBitmap.UseHalftonePalette:= True;
  698.   FBitmapOptions := TfcBitmapOptions.Create(self);
  699.   FBitmapOptions.OnChange := BitmapOptionsChange;
  700.   FBitmapOptions.DestBitmap := FWorkBitmap;
  701.   FBitmapOptions.OrigPicture := FPicture;
  702.   ControlStyle := ControlStyle + [csOpaque];
  703.   FPreProcess := True;
  704.   FShowFocusRect:=False;
  705.   FFocusable := False;
  706.   FTabStop := False;
  707.   FChangeLinks := TList.Create;
  708.   Width := 100;
  709.   Height := 100;
  710. end;
  711. destructor TfcCustomImager.Destroy;
  712. begin
  713.   FPicture.Free;
  714.   FPicture:= nil;
  715.   FBitmapOptions.Free;
  716.   FWorkBitmap.Free;
  717.   FChangeLinks.Free;
  718.   inherited Destroy;
  719. end;
  720. function TfcCustomImager.GetDrawRect: TRect;
  721. begin
  722.   case DrawStyle of
  723.     dsNormal: result := Rect(0, 0, Picture.Width, Picture.Height);
  724.     dsCenter: with Point(Width div 2 - FWorkBitmap.Width div 2,
  725.         Height div 2 - FWorkBitmap.Height div 2) do
  726.       result := Rect(x, y, Width - x, Height - y);
  727.     dsTile, dsStretch: result := Rect(0, 0, Width, Height);
  728.     dsProportional: result := fcProportionalRect(Rect(0, 0, Width, Height),
  729.                               FWorkBitmap.Width, FWorkBitmap.Height);
  730.     dsProportionalCenter: result := fcProportionalCenterRect(Rect(0, 0, Width, Height),
  731.                                     FWorkBitmap.Width, FWorkBitmap.Height);
  732.   end
  733. end;
  734. procedure TfcCustomImager.SetDrawStyle(Value: TfcImagerDrawStyle);
  735. begin
  736.   if FDrawStyle <> Value then
  737.   begin
  738.     FDrawStyle := Value;
  739.     BitmapOptions.Tile := FDrawStyle = dsTile;
  740.     Resized;
  741.     Invalidate;
  742.   end;
  743. end;
  744. procedure TfcCustomImager.SetEraseBackground(Value: Boolean);
  745. var r: TRect;
  746. begin
  747.   if FEraseBackground <> Value then
  748.   begin
  749.     FEraseBackground := Value;
  750.     if Parent <> nil then begin
  751.        r:= BoundsRect;
  752.        InvalidateRect(Parent.Handle, @r, True);
  753.     end
  754.   end;
  755. end;
  756. procedure TfcCustomImager.SetParent(Value: TWinControl);
  757. begin
  758.   inherited;
  759. end;
  760. procedure TfcCustomImager.BitmapOptionsChange(Sender: TObject);
  761. var r: TRect;
  762. begin
  763.   if Parent <> nil then
  764.   begin
  765.     r := BoundsRect;
  766.     InvalidateRect(Parent.Handle, @r, Transparent);
  767.   end;
  768.   NotifyChanges;
  769. end;
  770. procedure TfcCustomImager.NotifyChanges;
  771. var i: Integer;
  772. begin
  773.   for i := 0 to FChangeLinks.Count - 1 do with TfcChangeLink(FChangeLinks[i]) do
  774.   begin
  775.     Sender := WorkBitmap;
  776.     Change;
  777.   end;
  778. end;
  779. function TfcCustomImager.GetColorAtPoint(X,Y:Integer):TColor;
  780. begin
  781.   result := clNone;
  782.   if (Canvas <> nil) then result := Canvas.Pixels[X, Y];
  783. end;
  784. procedure TfcCustomImager.BitmapChange(Sender: TObject);
  785. var r: TRect;
  786. begin
  787.   Resized;
  788.   r := BoundsRect;
  789.   if Parent<>nil then { 8/2/99 }
  790.      InvalidateRect(Parent.Handle, @r, True);
  791.   NotifyChanges;
  792. end;
  793. procedure TfcCustomImager.Resized;
  794. begin
  795.   if csLoading in ComponentState then Exit;
  796.   if not PreProcess and not (DrawStyle in [dsNormal, dsCenter]) then
  797.     FWorkBitmap.SetSize(Width, Height)
  798.   else begin
  799.      if BitmapOptions.Rotation.Angle <> 0 then { 10/5/99 }
  800.         FWorkBitmap.SetSize(fcMax(Picture.Width, Picture.Height), fcMax(Picture.Height, Picture.Width))
  801.      else
  802.         FWorkBitmap.SetSize(Picture.Width, Picture.Height)
  803.   end;
  804.   UpdateWorkBitmap;
  805.   UpdateAutoSize;
  806. end;
  807. procedure TfcCustomImager.UpdateAutoSize;
  808. begin
  809.   if FAutoSize and not PictureEmpty and not (csLoading in ComponentState) and (Align = alNone) then
  810.   begin
  811.     UpdatingAutosize := True;
  812.     if (Width <> Picture.Width) or (Height <> Picture.Height) then
  813.       SetBounds(Left, Top, Picture.Width, Picture.Height);
  814.     UpdatingAutosize := False;
  815.   end;
  816. end;
  817. procedure TfcCustomImager.UpdateWorkBitmap;
  818. begin
  819.   if not PictureEmpty and not (csLoading in ComponentState) then
  820.   begin
  821.     if FWorkBitmap.Empty then Resized;
  822.     BitmapOptions.Changed;
  823.   end;
  824. end;
  825. procedure TfcCustomImager.SetPicture(Value: TPicture);
  826. begin
  827.   FPicture.Assign(Value);
  828. end;
  829. procedure TfcCustomImager.SetPreProcess(Value: Boolean);
  830. begin
  831.   if FPreProcess <> Value then
  832.   begin
  833.     FPreProcess := Value;
  834.     Resized;
  835.   end;
  836. end;
  837. procedure TfcCustomImager.SetTransparent(Value: Boolean);
  838. begin
  839.   FTransparent:=Value;
  840.   if not PictureEmpty then Picture.Graphic.Transparent := Value;
  841.   Invalidate;
  842. end;
  843. procedure TfcCustomImager.SetTransparentColor(Value: TColor);
  844. begin
  845.   WorkBitmap.TransparentColor := Value;
  846.   UpdateWorkBitmap;
  847.   Invalidate;
  848.   ColorToString(clNone);
  849. end;
  850. function TfcCustomImager.GetRespectPalette;
  851. begin
  852.   result:= FRespectPalette;
  853. end;
  854. function TfcCustomImager.GetSmoothStretching: Boolean;
  855. begin
  856.   result := WorkBitmap.SmoothStretching;
  857. end;
  858. function TfcCustomImager.GetTransparent: Boolean;
  859. begin
  860.   result:= FTransparent;
  861. //  result := False;                   
  862. //  if not PictureEmpty then result := Picture.Graphic.Transparent;
  863. end;
  864. function TfcCustomImager.GetTransparentColor: TColor;
  865. begin
  866.   result := WorkBitmap.TransparentColor;
  867. end;
  868. procedure TfcCustomImager.SetAutoSize(Value: Boolean);
  869. begin
  870.   if FAutoSize <> Value then
  871.   begin
  872.     FAutoSize := Value;
  873.     UpdateAutoSize;
  874.   end;
  875. end;
  876. {
  877. procedure TfcCustomImager.SetBitmap(Value: TfcBitmap);
  878. begin
  879.   FBitmap.Assign(Value);
  880. end;
  881. }
  882. function TfcCustomImager.PictureEmpty: Boolean;
  883. begin
  884.   result := (FPicture=Nil) or (FPicture.Graphic = nil) or (FPicture.Graphic.Empty);
  885. end;
  886. procedure TfcCustomImager.Invalidate;
  887. var r: TRect;
  888. begin
  889.   if InSetBounds then exit;
  890.   r := BoundsRect;
  891.   if Parent <> nil then InvalidateRect(Parent.Handle, @r, True);
  892. end;
  893. procedure TfcCustomImager.RegisterChanges(ChangeLink: TfcChangeLink);
  894. begin
  895.   FChangeLinks.Add(ChangeLink);
  896. end;
  897. procedure TfcCustomImager.UnRegisterChanges(ChangeLink: TfcChangeLink);
  898. begin
  899.   FChangeLinks.Remove(ChangeLink);
  900. end;
  901. procedure TfcCustomImager.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  902. var SizeChanged: Boolean;
  903.     OldControlStyle: TControlStyle;
  904. begin
  905.   SizeChanged := (AWidth <> Width) or (AHeight <> Height);
  906.   if SizeChanged and not UpdatingAutosize then begin
  907.      InSetBounds:= True; { RSW - Don't erase background when resizing }
  908.      { 5/7/99 - Setting parent to opaque so it doesn't clear background.
  909.        This allows imager to not flicker when resizing imager }
  910.      if Parent<>nil then
  911.      begin
  912.         OldControlStyle:= Parent.ControlStyle;
  913.         Parent.ControlStyle:= Parent.ControlStyle + [csOpaque];
  914.      end;
  915.      inherited;
  916.      if Parent<>nil then Parent.ControlStyle:= OldControlStyle;
  917.      if Visible then Update;
  918.      Resized;
  919.      InSetBounds:= False;
  920.   end
  921.   else inherited;
  922. end;
  923. procedure TfcCustomImager.SetRespectPalette(Value: Boolean);
  924. begin
  925.   FRespectPalette:= Value;
  926.   WorkBitmap.RespectPalette := Value;
  927.   if value then
  928.      if (BitmapOptions.Color<>clNone) or (BitmapOptions.TintColor<>clNone) then
  929.         WorkBitmap.RespectPalette:= False;
  930.   Invalidate;
  931. end;
  932. procedure TfcCustomImager.SetFocus;
  933. begin
  934.    inherited;
  935.    if FWinControl <> nil then
  936.      FWinControl.SetFocus;
  937. end;
  938. procedure TfcCustomImager.SetShowFocusRect(Value: Boolean);
  939. begin
  940.   if Value <> FShowFocusRect then
  941.      FShowFocusRect := Value;
  942. end;
  943. procedure TfcCustomImager.SetSmoothStretching(Value: Boolean);
  944. begin
  945.   WorkBitmap.SmoothStretching := Value;
  946.   UpdateWorkBitmap;
  947.   Invalidate;
  948. end;
  949. procedure TfcCustomImager.Paint;
  950. var r:TRect;
  951. begin
  952.   inherited;
  953.   if csDestroying in ComponentState then exit;
  954.   if FWorkBitmap.Empty and not PictureEmpty then
  955.   begin
  956.     UpdateWorkBitmap;
  957.     Exit;
  958.   end;
  959.   if (csDesigning in ComponentState) and FWorkBitmap.Empty then with Canvas do
  960.   begin
  961.     Pen.Style := psDash;
  962.     Pen.Color := clBlack;
  963.     Brush.Color := clWhite;
  964.     Rectangle(0, 0, Width, Height);
  965.     Exit;
  966.   end;
  967.   if FWorkBitmap.Empty then Exit;
  968.   try
  969.     with GetDrawRect do
  970.       if PreProcess then
  971.         case DrawStyle of
  972.           dsNormal: Canvas.Draw(Left, Top, FWorkBitmap);
  973.           dsCenter: Canvas.Draw(Left, Top, FWorkBitmap);
  974.           dsTile: FWorkBitmap.TileDraw(Canvas, Rect(Left, Top, Right, Bottom));
  975.           dsStretch: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  976.           dsProportional,dsproportionalCenter: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  977.         end
  978.       else Canvas.Draw(Left, Top, FWorkBitmap);
  979.   finally
  980. {    if Transparent then fcTransparentDraw(Canvas, Rect(0, 0, Width, Height), DrawBitmap, DrawBitmap.Canvas.Pixels[0, 0])
  981.     else Canvas.Draw(0, 0, DrawBitmap);}
  982.   end;
  983.   if Focused and ShowFocusRect then begin
  984.     r:= ClientRect;
  985.     Canvas.DrawFocusRect(r);
  986.   end;
  987. end;
  988. (*procedure TfcCustomImager.ParentMessages(var Message: TMessage; var ProcessMessage: Boolean);
  989. var s: TfcCustomImager;
  990. begin
  991.   if csDestroying in ComponentState then exit;
  992.   if not PictureEmpty and ((not EraseBackground) or InSetBounds) and
  993. {     not (csDesigning in ComponentState) and}  { 4/27/99 - Comment out - RSW }
  994.      (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}
  995.   begin
  996.     with TWMEraseBkGnd(Message) do
  997.     begin
  998.       Result := 1;
  999.       ProcessMessage := False;
  1000.     end;
  1001.   end
  1002. end;
  1003. *)
  1004. procedure TfcCustomImager.Loaded;
  1005. begin
  1006.   inherited;
  1007.   UpdateAutoSize;
  1008.   FBitmapOptions.Changed;
  1009. end;
  1010. procedure TfcCustomImager.Notification(AComponent: TComponent; Operation: TOperation);
  1011. begin
  1012.   inherited Notification(AComponent, Operation);
  1013. end;
  1014. procedure TfcCustomImager.CutToClipboard;
  1015. begin
  1016.   if Picture.Graphic <> nil then
  1017.   begin
  1018.     CopyToClipboard;
  1019.     Picture.Graphic := nil;
  1020.   end;
  1021. end;
  1022. procedure TfcCustomImager.CopyToClipboard;
  1023. var tempBitmap: TBitmap;
  1024. begin
  1025.    tempBitmap:= TBitmap.create;
  1026.    WorkBitmap.SaveToBitmap(tempBitmap);
  1027.    Clipboard.Assign(tempBitmap);
  1028.    tempBitmap.Free;
  1029. end;
  1030. procedure TfcCustomImager.WndProc(var Message: TMessage);
  1031. begin
  1032.   inherited;
  1033. end;
  1034. type
  1035.  TfcImagerWinControl = class(TWinControl)
  1036.  private
  1037.     Imager: TfcCustomImager;
  1038.  protected
  1039.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  1040.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  1041.     procedure KeyPress(var Key: Char); override;
  1042.  public
  1043.     constructor Create(AOwner: TComponent); override;
  1044.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  1045.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  1046.  end;
  1047. constructor TfcImagerWinControl.Create(AOwner: TComponent);
  1048. begin
  1049.    inherited;
  1050.    ControlStyle := ControlStyle + [csReplicatable];
  1051.    Imager:= AOwner as TfcCustomImager;
  1052. end;
  1053. procedure TfcImagerWinControl.CMEnter(var Message: TCMEnter);
  1054. begin
  1055.   Imager.DoEnter;
  1056. end;
  1057. procedure TfcImagerWinControl.CMExit(var Message: TCMExit);
  1058. begin
  1059.   Imager.DoExit;
  1060. end;
  1061. procedure TfcImagerWinControl.KeyDown(var Key: Word; Shift: TShiftState);
  1062. begin
  1063.    inherited KeyDown(Key, Shift);
  1064.    Imager.KeyDown(Key, Shift);
  1065. end;
  1066. procedure TfcImagerWinControl.KeyUp(var Key: Word; Shift: TShiftState);
  1067. begin
  1068.    inherited KeyUp(Key, Shift);
  1069.    Imager.KeyUp(Key, Shift);
  1070. end;
  1071. procedure TfcImagerWinControl.KeyPress(var Key: Char);
  1072. begin
  1073.    inherited KeyPress(Key);
  1074.    Imager.KeyPress(Key);
  1075. end;
  1076. constructor TfcDBImager.Create(AOwner: TComponent);
  1077. begin
  1078.    inherited;
  1079.    ControlStyle := ControlStyle + [csReplicatable];
  1080.    FPictureType := fcptBitmap;
  1081.    FBorderStyle := bsSingle;
  1082.    FAutoDisplay:=True;
  1083.    FDataLink := TFieldDataLink.Create;
  1084.    FDataLink.Control := Self;
  1085.    FDataLink.OnDataChange := DataChange;
  1086.    FDataLink.OnUpdateData := UpdateData;
  1087. end;
  1088. destructor TfcDBImager.Destroy;
  1089. begin
  1090.    FDataLink.Free;
  1091.    FDataLink:=nil;
  1092.    inherited Destroy;
  1093. end;
  1094. procedure TfcDBImager.Notification(AComponent: TComponent;
  1095.   Operation: TOperation);
  1096. begin
  1097.   inherited Notification(AComponent, Operation);
  1098.   if (Operation = opRemove) and (FDataLink <> nil) and
  1099.     (AComponent = DataSource) then DataSource := nil;
  1100. end;
  1101. procedure TfcDBImager.LoadPicture;
  1102. var j:TGraphic;
  1103.   ms:Tmemorystream;
  1104.   w:TMetaFile;
  1105.   ic:TfcIcon;
  1106.   pt:TfcImagerPictureType;
  1107.   gclassname:string;
  1108. begin
  1109.    if FDataLink.Field = nil then begin
  1110.       Picture.Assign(nil);
  1111. //      WorkBitmap.FreeMemoryImage;
  1112.       WorkBitmap.Clear;
  1113.       exit;
  1114.    end;
  1115.   if not FPictureLoaded and (not Assigned(FDataLink.Field) or
  1116.     FDataLink.Field.IsBlob) then
  1117.   begin
  1118.     pt:=PictureType;
  1119.     gclassname:='';
  1120.     DoCalcPictureType(pt,gclassname);
  1121.     case pt of
  1122.       fcptBitmap: begin
  1123.          try
  1124.            Picture.Assign(FDataLink.Field);
  1125.          except
  1126.          end;
  1127.         end;
  1128.       fcptJpg:
  1129.         begin
  1130. //            RegisterClass(TJpegImage);
  1131. //            j:=tjpegimage.create;
  1132.             if gclassname = '' then gclassname := 'TJPEGImage';
  1133.             if (GetClass(gclassname) = nil) then exit;
  1134.             j:= TGraphic(TGraphicClass(GetClass(gclassname)).create);
  1135.             ms:=tmemorystream.create;
  1136.             try
  1137.               tblobfield(FDataLink.Field).savetostream(ms);
  1138.               ms.seek(sofrombeginning,0);
  1139.               with j do begin
  1140. {                pixelformat := jf24bit;
  1141.                 scale := jsfullsize;
  1142.                 grayscale := False;
  1143.                 performance := jpbestquality;
  1144.                 progressivedisplay := True;
  1145.                 progressiveencoding := True;}
  1146.                 LoadFromStream(ms);
  1147.               end;
  1148.               Picture.assign(j);
  1149.             finally
  1150.                j.free;
  1151.                ms.free;
  1152.             end;
  1153.           end;
  1154.       fcptIcon:
  1155.         begin
  1156.           ic:=tfcIcon.create;
  1157.           ms:=tmemorystream.create;
  1158.           try
  1159.             tblobfield(FDataLink.Field).savetostream(ms);
  1160.             ms.seek(sofrombeginning,0);
  1161.             with ic do begin
  1162.               loadfromstream(ms);
  1163.             end;
  1164.             Picture.Assign(ic);
  1165.           finally
  1166.              ic.free;
  1167.              ms.free;
  1168.           end;
  1169.         end;
  1170.       fcptMetafile:
  1171.         begin
  1172.           w:=TMetaFile.create;
  1173.           ms:=tmemorystream.create;
  1174.           try
  1175.             tblobfield(FDataLink.Field).savetostream(ms);
  1176.             Picture.assign(w);
  1177.             ms.seek(sofrombeginning,0);
  1178.             with w do begin
  1179.               Picture.Metafile.loadfromstream(ms);
  1180.             end;
  1181.           finally
  1182.              w.free;
  1183.              ms.free;
  1184.           end;
  1185.         end;
  1186.       end;
  1187.      if Picture.Graphic<>nil then
  1188.         Picture.Graphic.Transparent:=Transparent;
  1189.     Invalidate;
  1190.   end;
  1191. end;
  1192. procedure TfcDBImager.DataChange(Sender: TObject);
  1193. begin
  1194.   Picture.Graphic := nil;
  1195.   FWorkBitmap.Clear;
  1196.   FPictureLoaded := False;
  1197.   if FAutoDisplay then LoadPicture;
  1198. end;
  1199. procedure TfcDBImager.UpdateData(Sender: TObject);
  1200. begin
  1201.   if Picture.Graphic is TBitmap then
  1202.      FDataLink.Field.Assign(Picture.Graphic) else
  1203.      FDataLink.Field.Clear;
  1204. end;
  1205. function TfcDBImager.GetDataSource: TDataSource;
  1206. begin
  1207.   Result := FDataLink.DataSource;
  1208. end;
  1209. procedure TfcDBImager.SetDataSource(Value: TDataSource);
  1210. begin
  1211.   if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  1212.     FDataLink.DataSource := Value;
  1213.   if Value <> nil then Value.FreeNotification(Self);
  1214. end;
  1215. function TfcDBImager.GetDataField: string;
  1216. begin
  1217.   Result := FDataLink.FieldName;
  1218. end;
  1219. procedure TfcDBImager.SetDataField(const Value: string);
  1220. begin
  1221.   FDataLink.FieldName := Value;
  1222. end;
  1223. function TfcDBImager.GetReadOnly: Boolean;
  1224. begin
  1225.   Result := FDataLink.ReadOnly;
  1226. end;
  1227. procedure TfcDBImager.SetReadOnly(Value: Boolean);
  1228. begin
  1229.   FDataLink.ReadOnly := Value;
  1230. end;
  1231. function TfcDBImager.GetField: TField;
  1232. begin
  1233.   Result := FDataLink.Field;
  1234. end;
  1235. procedure TfcDBImager.CMGetDataLink(var Message: TMessage);
  1236. begin
  1237.   Message.Result := Integer(FDataLink);
  1238. end;
  1239. procedure TfcDBImager.CutToClipboard;
  1240. begin
  1241.   if Picture.Graphic <> nil then
  1242.     if FDataLink.Edit then
  1243.     begin
  1244.       CopyToClipboard;
  1245.       Picture.Graphic := nil;
  1246.     end;
  1247. end;
  1248. procedure TfcDBImager.CopyToClipboard;
  1249. begin
  1250.   if Picture.Graphic <> nil then Clipboard.Assign(Picture);
  1251. end;
  1252. procedure TfcCustomImager.PasteFromClipboard;
  1253. begin
  1254.   if Clipboard.HasFormat(CF_BITMAP) then
  1255.   begin
  1256.     Picture.Bitmap.Assign(Clipboard);
  1257.     Picture.Graphic.Transparent:=Transparent;
  1258.   end
  1259. end;
  1260. procedure TfcDBImager.PasteFromClipboard;
  1261. begin
  1262.   if Clipboard.HasFormat(CF_BITMAP) and FDataLink.Edit then
  1263.   begin
  1264.     Picture.Bitmap.Assign(Clipboard);
  1265.     Picture.Graphic.Transparent:=Transparent;
  1266.   end
  1267. end;
  1268. procedure TfcCustomImager.DoEnter;
  1269. begin
  1270.   try
  1271.     if Assigned(FOnEnter) then FOnEnter(Self);
  1272.     FFocused := True;
  1273.     Invalidate; { Draw the focus marker }
  1274.   except
  1275.   end;
  1276. end;
  1277. procedure TfcCustomImager.DoExit;
  1278. begin
  1279.   try
  1280.    if Assigned(FOnExit) then FOnExit(Self);
  1281.    FFocused := False;
  1282.    Invalidate; { Erase the focus marker }
  1283.   except
  1284.   end;
  1285. end;
  1286. procedure TfcDBImager.DoExit;
  1287. begin
  1288.     try
  1289.       FDataLink.UpdateRecord;
  1290.     except
  1291.       SetFocus;
  1292.       raise;
  1293.     end;
  1294.     Invalidate; { Erase the focus marker }
  1295.     inherited;
  1296. end;
  1297. procedure TfcCustomImager.KeyUp(var Key: Word; Shift: TShiftState);
  1298. begin
  1299.   if Assigned(FOnKeyUp) then FOnKeyUp(Self, Key, Shift);
  1300. end;
  1301. procedure TfcCustomImager.KeyDown(var Key: Word; Shift: TShiftState);
  1302. begin
  1303.   if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
  1304.   case Key of
  1305.     VK_INSERT:
  1306.       if ssShift in Shift then PasteFromClipBoard else
  1307.         if ssCtrl in Shift then CopyToClipBoard;
  1308.     VK_DELETE:
  1309.       if ssShift in Shift then CutToClipBoard;
  1310.   end;
  1311. end;
  1312. procedure TfcCustomImager.KeyPress(var Key: Char);
  1313. begin
  1314.   if Assigned(FOnKeyPress) then FOnKeyPress(self, Key);
  1315.   case Key of
  1316.     ^X: CutToClipBoard;
  1317.     ^C: CopyToClipBoard;
  1318.     ^V: PasteFromClipBoard;
  1319.   end;
  1320. end;
  1321. procedure TfcDBImager.KeyPress(var Key: Char);
  1322. begin
  1323.   inherited KeyPress(Key);
  1324.   case Key of
  1325.     ^X: CutToClipBoard;
  1326.     ^C: CopyToClipBoard;
  1327.     ^V: PasteFromClipBoard;
  1328.     #13: LoadPicture;
  1329.     #27: FDataLink.Reset;
  1330.   end;
  1331. end;
  1332. procedure TfcCustomImager.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1333.       X, Y: Integer);
  1334. begin
  1335.    inherited;
  1336.    if FWinControl<>nil then FWinControl.SetFocus;
  1337. end;
  1338. Function TfcCustomImager.CreateImagerWinControl: TWinControl;
  1339. var WinControl: TWinControl;
  1340. begin
  1341.    WinControl:= TfcImagerWinControl.create(self);
  1342.    with WinControl do begin
  1343.       visible:=true;
  1344.       Left:=0;
  1345.       Top:=0;
  1346.       Height:=0;
  1347.       Width:=0;
  1348.       Parent:=self.Parent;
  1349.       TabStop:=self.TabStop;
  1350.    end;
  1351.    result:= WinControl;
  1352. end;
  1353. procedure TfcCustomImager.SetFocusable(Value: boolean);
  1354. begin
  1355.    if Value<>FFocusable then begin
  1356.       FFocusable:=Value;
  1357.       if (Value or Focusable) then begin
  1358.           if (FWinControl=nil) then
  1359.              FWinControl:= CreateImagerWinControl;
  1360.           FWinControl.TabStop:=TabStop;
  1361.       end
  1362.       else begin
  1363.          if FWinControl <> nil then begin
  1364.            FWinControl.Free;
  1365.            FWinControl:=nil;
  1366.          end;
  1367.       end
  1368.    end
  1369. end;
  1370. procedure TfcCustomImager.SetTabStop(Value: boolean);
  1371. begin
  1372.    if Value<>FTabStop then begin
  1373.       FTabStop:=Value;
  1374.       if (Value or Focusable)then begin
  1375.           if (FWinControl=nil) then
  1376.              FWinControl:= CreateImagerWinControl;
  1377.           FWinControl.TabStop:=Value;
  1378.       end
  1379.       else begin
  1380.          if FWinControl <> nil then begin
  1381.             FWinControl.Free;
  1382.             FWinControl:=nil;
  1383.          end;
  1384.       end
  1385.    end
  1386. end;
  1387. procedure TfcCustomImager.SetTabOrder(Value: integer);
  1388. begin
  1389.    if Value<>FTabOrder then begin
  1390.       FTabOrder:=Value;
  1391.       if (Focusable) then begin
  1392.           if (FWinControl=nil) then
  1393.              FWinControl:= CreateImagerWinControl;
  1394.           FWinControl.TabOrder:=Value;
  1395.       end
  1396.       else begin
  1397.          if FWinControl <> nil then begin
  1398.            FWinControl.Free;
  1399.            FWinControl:=nil;
  1400.          end;
  1401.       end
  1402.    end
  1403. end;
  1404. procedure TfcDBImager.Paint;
  1405. var Form: TCustomForm;
  1406. //    tempImager: TfcImager;
  1407.     DrawPict: TPicture;
  1408.     CenterRect: TRect;
  1409.     r: TRect;
  1410.     j:TGraphic;
  1411.     w:TMetaFile;
  1412.     ms:TMemoryStream;
  1413.     pt:TfcImagerPictureType;
  1414.     ic:TfcIcon;
  1415.     {i,}x,y,pad:integer;
  1416.     gclassname:string;
  1417. //    pal: HPalette;
  1418. begin
  1419.    if csDestroying in ComponentState then exit;
  1420.    // Suggestion to add a new property to disablebitmapoptions.  THen
  1421.    // images will always look the same even in the non-csPaintcopy State.
  1422. {   if FDisableBitmapOptions and (not Transparent) and
  1423.        not ((DrawStyle=dsTile) or (DrawStyle=DsStretch)) then
  1424.    begin
  1425.       Canvas.Brush.Color:=Color;
  1426.       Canvas.FillRect(ClientRect);
  1427.    end;}
  1428.    if ((csPaintCopy in ControlState) {or FDisableBitmapOptions}) and
  1429.       Assigned(FDataLink.Field) and FDataLink.Field.IsBlob then
  1430.    begin
  1431. //      Canvas.Brush.Color:=TEdit(parent).color;
  1432. //      Canvas.FillRect(ClientRect);
  1433.       DrawPict := TPicture.Create;
  1434.       pt:=PictureType;
  1435.       gclassname := '';
  1436.       DoCalcPictureType(pt,gclassname);
  1437.       case pt of
  1438.         fcptBitmap: begin
  1439.            try
  1440.              DrawPict.Assign(FDataLink.Field);
  1441.            except
  1442.            end;
  1443.           end;
  1444.         fcptJpg:
  1445.           begin
  1446.             if gclassname = '' then gclassname := 'TJPEGImage';
  1447.             if (GetClass(gclassname) = nil) then exit;
  1448. //          j:= TGraphic(TGraphicClass(GetClass('TJPEGImage')).create);
  1449.             // 1/16/2002 - Should use gclassname!!
  1450.             j:= TGraphicClass(GetClass(gclassname)).create;
  1451.             ms:=tmemorystream.create;
  1452.             try
  1453.               tblobfield(FDataLink.Field).savetostream(ms);
  1454.               ms.seek(sofrombeginning,0);
  1455.               with j do begin
  1456. {                pixelformat := jf24bit;
  1457.                 scale := jsfullsize;
  1458.                 grayscale := False;
  1459.                 performance := jpbestquality;
  1460.                 progressivedisplay := True;
  1461.                 progressiveencoding := True;}
  1462.                 LoadFromStream(ms);
  1463.               end;
  1464.               DrawPict.assign(j);
  1465.             finally
  1466.                j.free;
  1467.                ms.free;
  1468.             end;
  1469.           end;
  1470.         fcptIcon:
  1471.           begin
  1472.             ic:=tfcIcon.create;
  1473.             ms:=tmemorystream.create;
  1474.             try
  1475.               tblobfield(FDataLink.Field).savetostream(ms);
  1476.               ms.seek(sofrombeginning,0);
  1477.               ic.LoadFromStream(ms);
  1478.               DrawPict.assign(ic);
  1479.             finally
  1480.                ic.free;
  1481.                ms.free;
  1482.             end;
  1483.           end;
  1484.         fcptMetafile:
  1485.           begin
  1486.             w:=TMetaFile.create;
  1487.             ms:=tmemorystream.create;
  1488.             try
  1489.               tblobfield(FDataLink.Field).savetostream(ms);
  1490.               ms.seek(sofrombeginning,0);
  1491.               w.LoadFromStream(ms);
  1492.               DrawPict.assign(w);
  1493.             finally
  1494.                w.free;
  1495.                ms.free;
  1496.             end;
  1497.           end;
  1498.         end;
  1499. {      case pt of
  1500.       fcptBitmap: DrawPict.Graphic.Assign(FDataLink.Field);
  1501. //      if DrawPict.Graphic is TBitmap then
  1502. //         DrawPict.Bitmap.IgnorePalette := True;
  1503.       fcptjpg:
  1504.         begin
  1505.           j:=tjpegimage.create;
  1506.           ms:=tmemorystream.create;
  1507.           try
  1508.             tblobfield(FDataLink.Field).savetostream(ms);
  1509.             Picture.assign(j);
  1510.             ms.seek(sofrombeginning,0);
  1511.             with j do begin
  1512.               pixelformat := jf24bit;
  1513.               scale := jsfullsize;
  1514.               grayscale := False;
  1515.               performance := jpbestquality;
  1516.               progressivedisplay := True;
  1517.               progressiveencoding := True;
  1518.               Picture.Graphic.loadfromstream(ms);
  1519.             end;
  1520.           finally
  1521.              j.free;
  1522.              ms.free;
  1523.           end;
  1524.         end;
  1525.       fcptMetaFile:
  1526.         begin
  1527.           w:= TMetaFile.Create;
  1528.           b:=TBitmap.Create;
  1529.           ms:=TMemoryStream.Create;
  1530.           try
  1531.             TBlobField(FDataLink.Field).SaveToStream(ms);
  1532.             ms.Seek(soFromBeginning,0);
  1533.             with w do begin
  1534.               LoadFromStream(ms);
  1535.             end;
  1536.             b.Width := Width;
  1537.             b.Height:= Height;
  1538.             b.PixelFormat := pf24bit;
  1539.             B.Canvas.Draw(0,0,w);
  1540.             DrawPict.Assign(b);
  1541.           finally
  1542.             w.Free;
  1543.             ms.free;
  1544.             b.free;
  1545.           end;
  1546.         end;
  1547.       end;}
  1548. {
  1549. bs:=tblobstream.create(table1picture,bmread);
  1550. jpgphoto:=tjpeg...cre
  1551. try..
  1552.   jpgphoto.loadfromstream(blobstream);
  1553.   picture.assign(jpgphoto);
  1554. finally
  1555.   freee
  1556. var jpg:TJpegImage;
  1557. stream:TStream;
  1558. jpg:=TJpegImage.Create;
  1559. Stream:=TMemoryStream.Create;
  1560. Table1ImgField.SavetoStream(Stream);
  1561. Stream.Position:=0;
  1562. jpg.LoadFromStream(Stream);
  1563. Image1.pICTURE.gRFAPHIC:=JPG;
  1564. tbLOBfIELD* field=(TBlobField*)Table->FieldByName('overlay");
  1565. tblobstream*stream=newTBlobstream...
  1566. Tjpegimage* image = new TJpegImage
  1567. picture.assign(image);
  1568. picture.graphic.loadfromstream(stream);
  1569. delete(image);
  1570. metafile
  1571. stream=new(tblobstream(field,bmread);
  1572. image1->picture->Metafile->Loadfromstream(stream);
  1573. icon
  1574. stream=new(tblobstream(field,bmread);
  1575. image1->picture->icon->Loadfromstream(stream);
  1576. jpg.assign(tblobfield(table1.fieldbyname('picture')));
  1577. jpg.dibneeded;
  1578. picture.bitmap.assign(jpg);
  1579. jpg.free;
  1580. field.savetostream(memstream);
  1581. memstream.seek(0,0);
  1582. jpg.loadfromstream(memstream);
  1583. picture.assign(jpg)
  1584. jpg.free;
  1585. memstream.free;
  1586. }
  1587.       if DrawPict.Width=0 then exit;
  1588.       if Transparent then
  1589.          Canvas.CopyMode:= cmSrcAnd
  1590.       else
  1591.          Canvas.CopyMode:= cmSrcCopy;
  1592.       r:= ClientRect;
  1593.       r.right:= Width;
  1594.       r.bottom:= Height;
  1595.       CenterRect:= r;
  1596.       CenterRect.Left:= (Width-DrawPict.Width) div 2;
  1597.       CenterRect.Top:=  (Height-DrawPict.Height) div 2;
  1598.       if (DrawPict.Graphic <> nil) and (DrawPict.Graphic.Palette <> 0) then
  1599.       begin
  1600.         PaletteChanged(True); // Realizes palette before painting
  1601.       end;
  1602.       if (not Transparent) and not ((DrawStyle=dsTile) or (DrawStyle=DsStretch)) then
  1603.       begin
  1604.         Canvas.Brush.Color:=Color;
  1605.         Canvas.FillRect(ClientRect);
  1606.       end;
  1607.       if (DrawPict.Graphic = nil) or DrawPict.Graphic.empty then exit;
  1608.       case DrawStyle of
  1609.           dsNormal: Canvas.Draw(0, 0, DrawPict.Graphic);
  1610.           dsCenter: Canvas.Draw(CenterRect.Left, CenterRect.Top-1, DrawPict.Graphic);
  1611.           dsTile, dsStretch: Canvas.StretchDraw(r, DrawPict.Graphic);
  1612.           dsProportional: begin
  1613.                   //3/14/2002 - Correct for painting in a grid when csPaintCopy State.
  1614.                   x:= Trunc(DrawPict.Graphic.Width*(Height / DrawPict.Graphic.Height));
  1615.                   y:= Trunc(DrawPict.Graphic.Height*(Width / DrawPict.Graphic.width));
  1616.                   if DrawPict.Graphic.Width > DrawPict.Graphic.Height then begin
  1617.                      if Height <= y then
  1618.                         canvas.stretchdraw(rect(0,0,x,Height),DrawPict.Graphic)
  1619.                      else
  1620.                         canvas.stretchdraw(rect(0,0,Width,y),DrawPict.Graphic)
  1621.                   end
  1622.                   else begin
  1623.                      if Width <= x then
  1624.                        canvas.stretchdraw(rect(0,0,Width,y),DrawPict.Graphic)
  1625.                      else canvas.stretchdraw(rect(0,0,x,Height),DrawPict.Graphic);
  1626.                   end;
  1627.                 end;
  1628.           dsProportionalCenter:
  1629.                 begin//!!!!!
  1630.                   if (Height>=Width) then
  1631.                   begin
  1632.                      x:= Trunc(DrawPict.Graphic.Width*(Height / DrawPict.Graphic.Height));
  1633.                      y:= Trunc(DrawPict.Graphic.Height*(Width / DrawPict.Graphic.width));
  1634.                      if Height <= y then
  1635.                      //DrawPict.Graphic.Height > DrawPict.Graphic.Width then
  1636.                      begin
  1637. //                       i:= Trunc(DrawPict.Graphic.Width*(Height / DrawPict.Graphic.Height));
  1638.                        pad := Trunc((Width-x) / 2);
  1639.                        canvas.stretchdraw(rect(r.Left+pad,r.Top,r.Left+x+pad,r.Top+Height),DrawPict.Graphic);
  1640.                      end
  1641.                      else begin
  1642.                        y:= Trunc(DrawPict.Graphic.Height*(Width / DrawPict.Graphic.width));
  1643.                        pad := Trunc((Height-y) / 2)-1;
  1644.                      //  if pt=fcptJpg then dec(pad);
  1645.                        canvas.stretchdraw(rect(r.Left,r.Top+pad,r.Left+Width,r.Top+y+pad),DrawPict.Graphic)
  1646.                      end;
  1647.                   end
  1648.                   else begin
  1649.                      x:= Trunc(DrawPict.Graphic.Width*(Height / DrawPict.Graphic.Height));
  1650.                      y:= Trunc(DrawPict.Graphic.Height*(Width / DrawPict.Graphic.width));
  1651.                      if (Width <= x) then
  1652.                      begin
  1653.                        pad := Trunc((Height-y) / 2);
  1654.                      //  if pt=fcptJpg then dec(pad);
  1655.                        canvas.stretchdraw(rect(r.Left,r.Top+pad,r.Left+Width,r.Top+y+pad),DrawPict.Graphic)
  1656.                      end
  1657.                      else begin
  1658.                        pad := Trunc((Width-x) / 2)-1;
  1659.   //                     if DrawPict.Graphic.Width > DrawPict.Graphic.Height then dec(pad);
  1660.                        canvas.stretchdraw(rect(r.Left+pad,r.Top,r.Left+x+pad,r.Top+Height),DrawPict.Graphic);
  1661.                      end;
  1662.                   end;
  1663.                 end;
  1664. //          dsProportional,dsproportionalcenter: Canvas.StretchDraw(r, DrawPict.Graphic);
  1665.       end;
  1666.       DrawPict.Free;
  1667.       Canvas.CopyMode:= cmSrcCopy;
  1668.       exit;
  1669. //      Canvas.CopyRect(ClientRect,
  1670. //              inherited Canvas, tempRect);
  1671.       //    Canvas.Brush.Style := bsClear;
  1672. {      tempImager := TfcImager.create(self);
  1673.       tempImager.height:= height;
  1674.       tempImager.width:=width;
  1675.       tempImager.picture.assign(FDataLink.Field);
  1676.       if Transparent then
  1677.          if not tempImager.PictureEmpty then
  1678.             tempImager.Picture.Graphic.Transparent := True;
  1679.          tempImager.transparent:=True;
  1680.       SetBkMode(Canvas.Handle, windows.TRANSPARENT);
  1681.       tempImager.Perform(WM_PAINT, Canvas.Handle, 0);
  1682.       SetBkMode(Canvas.Handle, OPAQUE);
  1683.       tempImager.Free;
  1684.       exit;
  1685. }
  1686. //      if Picture.Graphic is TBitmap then
  1687. //         DrawPict.Bitmap.IgnorePalette := QuickDraw;
  1688.    end;
  1689.    if not Transparent and not ((DrawStyle=dsTile) or (DrawStyle=DsStretch)) then
  1690.    begin
  1691.       Canvas.Brush.Color:=Color;
  1692.       Canvas.FillRect(ClientRect);
  1693.    end;
  1694.    inherited;
  1695.    Form := GetParentForm(Self);
  1696.    if (Form <> nil) and
  1697.     (Form.ActiveControl = self) and
  1698.      not (csDesigning in ComponentState) and
  1699.      not (csPaintCopy in ControlState) then begin
  1700.      if not fcisinwwGrid(self) then
  1701.      begin
  1702.        Canvas.Brush.Color := clWindowFrame;
  1703.        r:= ClientRect;
  1704.        Canvas.FrameRect(r);
  1705.      end
  1706.      else begin
  1707.      end;
  1708.    end;
  1709. end;
  1710. procedure TfcDBImager.DoCalcPictureType(var PictureType:TfcImagerPictureType;var GraphicClassName:String);
  1711. begin
  1712.    inherited;
  1713.    if Assigned(FOnCalcPictureType) then
  1714.       FOnCalcPictureType(Self, PictureType,GraphicClassName);
  1715. end;
  1716. procedure TfcDBImager.SetAutoDisplay(Value: Boolean);
  1717. begin
  1718.   if FAutoDisplay <> Value then
  1719.   begin
  1720.     FAutoDisplay := Value;
  1721.     if Value then LoadPicture;
  1722.   end;
  1723. end;
  1724.                          
  1725. procedure TfcDBImager.BitmapChange(Sender: TObject);
  1726. begin
  1727.   inherited;
  1728.   if FPictureLoaded then FDataLink.Modified;
  1729.   FPictureLoaded := True;
  1730. end;
  1731. procedure TfcDBCustomImager.CMEnter(var Message: TCMEnter);
  1732. begin
  1733.   inherited;
  1734.   invalidate; { Draw the focus marker }
  1735. end;
  1736. procedure TfcDBImager.CMExit(var Message: TCMExit);
  1737. begin
  1738.   try
  1739.     FDataLink.UpdateRecord;
  1740.   except
  1741.     SetFocus;
  1742.     raise;
  1743.   end;
  1744.   inherited;
  1745. end;
  1746. procedure TfcDBCustomImager.CMExit(var Message: TCMExit);
  1747. begin
  1748.   inherited;
  1749.   invalidate; { Draw the focus marker }
  1750. end;
  1751. function TfcDBCustomImager.GetRespectPalette;
  1752. begin
  1753.   result:= FRespectPalette;
  1754. end;
  1755. function TfcDBCustomImager.GetSmoothStretching: Boolean;
  1756. begin
  1757.   result := WorkBitmap.SmoothStretching;
  1758. end;
  1759. function TfcDBCustomImager.GetTransparent: Boolean;
  1760. begin
  1761.   result:= FTransparent;
  1762. //  result := False;
  1763. //  if not PictureEmpty then result := Picture.Graphic.Transparent;
  1764. end;
  1765. function TfcDBCustomImager.GetTransparentColor: TColor;
  1766. begin
  1767.   result := WorkBitmap.TransparentColor;
  1768. end;
  1769. procedure TfcDBCustomImager.SetAutoSize(Value: Boolean);
  1770. begin
  1771.   if FAutoSize <> Value then
  1772.   begin
  1773.     FAutoSize := Value;
  1774.     UpdateAutoSize;
  1775.   end;
  1776. end;
  1777. procedure TfcDBCustomImager.SetDrawStyle(Value: TfcImagerDrawStyle);
  1778. begin
  1779.   if FDrawStyle <> Value then
  1780.   begin
  1781.     FDrawStyle := Value;
  1782.     BitmapOptions.Tile := FDrawStyle = dsTile;
  1783.     Resized;
  1784.     Invalidate;
  1785.   end;
  1786. end;
  1787. procedure TfcDBCustomImager.SetPicture(Value: TPicture);
  1788. begin
  1789.   FPicture.Assign(Value);
  1790. end;
  1791. procedure TfcDBCustomImager.SetPreProcess(Value: Boolean);
  1792. begin
  1793.   if FPreProcess <> Value then
  1794.   begin
  1795.     FPreProcess := Value;
  1796.     Resized;
  1797.   end;
  1798. end;
  1799. procedure TfcDBCustomImager.SetRespectPalette(Value: Boolean);
  1800. begin
  1801.   FRespectPalette:= Value;
  1802.   WorkBitmap.RespectPalette := Value;
  1803.   if value then
  1804.      if (BitmapOptions.Color<>clNone) or (BitmapOptions.TintColor<>clNone) then
  1805.         WorkBitmap.RespectPalette:= False;
  1806.   Invalidate;
  1807. end;
  1808. procedure TfcDBCustomImager.SetSmoothStretching(Value: Boolean);
  1809. begin
  1810.   WorkBitmap.SmoothStretching := Value;
  1811.   UpdateWorkBitmap;
  1812.   Invalidate;
  1813. end;
  1814. procedure TfcDBCustomImager.SetTransparent(Value: Boolean);
  1815. begin
  1816.   FTransparent:=Value;
  1817.   if not PictureEmpty then Picture.Graphic.Transparent := Value;
  1818.   if Value then
  1819.   begin
  1820.      SetWindowLong(Parent.Handle, GWL_STYLE,
  1821.        GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  1822.   end;
  1823.   Invalidate;
  1824. end;
  1825. procedure TfcDBCustomImager.SetTransparentColor(Value: TColor);
  1826. begin
  1827.   WorkBitmap.TransparentColor := Value;
  1828.   UpdateWorkBitmap;
  1829.   Invalidate;
  1830.   ColorToString(clNone);
  1831. end;
  1832. function TfcDBCustomImager.GetDrawRect: TRect;
  1833. begin
  1834.   case DrawStyle of
  1835.     dsNormal: result := Rect(0, 0, Picture.Width, Picture.Height);
  1836.     dsCenter: with Point(Width div 2 - FWorkBitmap.Width div 2,
  1837.         Height div 2 - FWorkBitmap.Height div 2) do
  1838.       result := Rect(x, y, Width - x, Height - y);
  1839.     dsTile, dsStretch: result := Rect(0, 0, Width, Height);
  1840.     dsProportional: result := fcProportionalRect(Rect(0, 0, Width, Height), FWorkBitmap.Width, FWorkBitmap.Height);
  1841.     dsProportionalCenter: result := fcProportionalCenterRect(Rect(0, 0, Width, Height),
  1842.                                     FWorkBitmap.Width, FWorkBitmap.Height);
  1843.   end
  1844. end;
  1845. procedure TfcDBCustomImager.NotifyChanges;
  1846. var i: Integer;
  1847. begin
  1848.   for i := 0 to FChangeLinks.Count - 1 do with TfcChangeLink(FChangeLinks[i]) do
  1849.   begin
  1850.     Sender := WorkBitmap;
  1851.     Change;
  1852.   end;
  1853. end;
  1854. procedure TfcDBCustomImager.BitmapOptionsChange(Sender: TObject);
  1855. var r: TRect;
  1856. begin
  1857.   if Parent <> nil then
  1858.   begin
  1859.     r := BoundsRect;
  1860.     InvalidateRect(Parent.Handle, @r, Transparent);
  1861.   end;
  1862.   NotifyChanges;
  1863. end;
  1864. procedure TfcDBCustomImager.BitmapChange(Sender: TObject);
  1865. var r: TRect;
  1866. begin
  1867.   Resized;
  1868.   r := BoundsRect;
  1869.   //5/30/2001-PYW- Make certain parent's handle has already been allocated.
  1870.   if (Parent<>nil) and Parent.HandleAllocated then { 8/2/99 }
  1871.      InvalidateRect(Parent.Handle, @r, True);
  1872.   NotifyChanges;
  1873. end;
  1874. procedure TfcDBCustomImager.UpdateAutoSize;
  1875. begin
  1876.   if FAutoSize and not PictureEmpty and not (csLoading in ComponentState) and (Align = alNone) then
  1877.   begin
  1878.     UpdatingAutosize := True;
  1879.     if (Width <> Picture.Width) or (Height <> Picture.Height) then
  1880.       SetBounds(Left, Top, Picture.Width, Picture.Height);
  1881.     UpdatingAutosize := False;
  1882.   end;
  1883. end;
  1884. procedure TfcDBCustomImager.Loaded;
  1885. begin
  1886.   inherited;
  1887.   UpdateAutoSize;
  1888.   FBitmapOptions.Changed;
  1889. end;
  1890. procedure TfcDBCustomImager.Paint;
  1891. begin
  1892.   inherited;
  1893.   if csDestroying in ComponentState then exit;
  1894.   if FWorkBitmap.Empty and not PictureEmpty then
  1895.   begin
  1896.     UpdateWorkBitmap;
  1897.     Exit;
  1898.   end;
  1899.   if (csDesigning in ComponentState) and FWorkBitmap.Empty then with Canvas do
  1900.   begin
  1901.     Pen.Style := psDash;
  1902.     Pen.Color := clBlack;
  1903.     Brush.Color := clWhite;
  1904.     Rectangle(0, 0, Width, Height);
  1905.     Exit;
  1906.   end;
  1907.   if FWorkBitmap.Empty then Exit;
  1908.   try
  1909.     with GetDrawRect do
  1910.       if PreProcess then
  1911.         case DrawStyle of
  1912.           dsNormal: Canvas.Draw(Left, Top, FWorkBitmap);
  1913.           dsCenter: Canvas.Draw(Left, Top, FWorkBitmap);
  1914.           dsTile: FWorkBitmap.TileDraw(Canvas, Rect(Left, Top, Right, Bottom));
  1915.           dsStretch: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  1916.           dsProportional,dsProportionalCenter: Canvas.StretchDraw(Rect(Left, Top, Right, Bottom), FWorkBitmap);
  1917.         end
  1918.       else Canvas.Draw(Left, Top, FWorkBitmap);
  1919.   finally
  1920. {    if Transparent then fcTransparentDraw(Canvas, Rect(0, 0, Width, Height), DrawBitmap, DrawBitmap.Canvas.Pixels[0, 0])
  1921.     else Canvas.Draw(0, 0, DrawBitmap);}
  1922.   end;
  1923. end;
  1924. constructor TfcDBCustomImager.Create(AOwner: TComponent);
  1925. begin
  1926.   inherited Create(AOwner);
  1927.   ParentColor := False;
  1928.   Color:= clWindow;
  1929.   FPicture := TPicture.Create;
  1930.   FPicture.OnChange := BitmapChange;
  1931.   FWorkBitmap := TfcBitmap.Create;
  1932.   FRespectPalette:= True;
  1933.   FWorkBitmap.RespectPalette := True;
  1934.   FWorkBitmap.UseHalftonePalette:= True;
  1935.   FBitmapOptions := TfcBitmapOptions.Create(self);
  1936.   FBitmapOptions.OnChange := BitmapOptionsChange;
  1937.   FBitmapOptions.DestBitmap := FWorkBitmap;
  1938.   FBitmapOptions.OrigPicture := FPicture;
  1939.   ControlStyle := ControlStyle + [csOpaque];
  1940.   FPreProcess := True;
  1941.   FChangeLinks := TList.Create;
  1942.   Width := 100;
  1943.   Height := 100;
  1944. end;
  1945. destructor TfcDBCustomImager.Destroy;
  1946. begin
  1947.   FPicture.Free;
  1948.   FPicture:= nil;
  1949.   FBitmapOptions.Free;
  1950.   FWorkBitmap.Free;
  1951.   FChangeLinks.Free;
  1952.   inherited Destroy;
  1953. end;
  1954. function TfcDBCustomImager.PictureEmpty: Boolean;
  1955. begin
  1956.   result := (FPicture=Nil) or (FPicture.Graphic = nil) or (FPicture.Graphic.Empty);
  1957. end;
  1958. procedure TfcDBCustomImager.Invalidate;
  1959. var r: TRect;
  1960. begin
  1961.   if InSetBounds then exit;
  1962.   r := BoundsRect;
  1963.   if not HandleAllocated then exit;
  1964.   InvalidateRect(Handle, nil, False);
  1965.   if Transparent then
  1966.     if Parent <> nil then InvalidateRect(Parent.Handle, @r, True);
  1967. end;
  1968. function TfcDBCustomImager.GetColorAtPoint(X,Y:Integer):TColor;
  1969. begin
  1970.   result := clNone;
  1971.   if (Canvas <> nil) then
  1972.      result := Canvas.Pixels[X, Y];
  1973. end;
  1974. procedure TfcDBCustomImager.RegisterChanges(ChangeLink: TfcChangeLink);
  1975. begin
  1976.   FChangeLinks.Add(ChangeLink);
  1977. end;
  1978. procedure TfcDBCustomImager.UnRegisterChanges(ChangeLink: TfcChangeLink);
  1979. begin
  1980.   FChangeLinks.Remove(ChangeLink);
  1981. end;
  1982. procedure TfcDBCustomImager.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  1983. var SizeChanged: Boolean;
  1984.     OldControlStyle: TControlStyle;
  1985. begin
  1986.   SizeChanged := (AWidth <> Width) or (AHeight <> Height);
  1987.   if SizeChanged and not UpdatingAutosize then begin
  1988.      InSetBounds:= True; { RSW - Don't erase background when resizing }
  1989.      { 5/7/99 - Setting parent to opaque so it doesn't clear background.
  1990.        This allows imager to not flicker when resizing imager }
  1991.      if Parent<>nil then
  1992.      begin
  1993.         OldControlStyle:= Parent.ControlStyle;
  1994.         Parent.ControlStyle:= Parent.ControlStyle + [csOpaque];
  1995.      end;
  1996.      inherited;
  1997.      if Parent<>nil then Parent.ControlStyle:= OldControlStyle;
  1998.      if Visible then Update;
  1999.      Resized;
  2000.      InSetBounds:= False;
  2001.   end
  2002.   else inherited;
  2003. end;
  2004. {procedure TfcDBCustomImager.SetRespectPalette(Value: Boolean);
  2005. begin
  2006.   FRespectPalette:= Value;
  2007.   WorkBitmap.RespectPalette := Value;
  2008.   if value then
  2009.      if (BitmapOptions.Color<>clNone) or (BitmapOptions.TintColor<>clNone) then
  2010.         WorkBitmap.RespectPalette:= False;
  2011.   Invalidate;
  2012. end;
  2013. }
  2014. procedure TfcDBImager.WMLButtonDblClk(var Message: TWMLButtonDblClk);
  2015. begin
  2016.   LoadPicture;
  2017.   inherited;
  2018. end;
  2019. procedure TfcDBImager.KeyDown(var Key: Word; Shift: TShiftState);
  2020. begin
  2021.   inherited KeyDown(key,Shift);
  2022.   case Key of
  2023.     VK_INSERT:
  2024.       if ssShift in Shift then PasteFromClipBoard else
  2025.         if ssCtrl in Shift then CopyToClipBoard;
  2026.     VK_DELETE:
  2027.       if ssShift in Shift then CutToClipBoard;
  2028.   end;
  2029. end;
  2030. procedure TfcDBCustomImager.UpdateWorkBitmap;
  2031. begin
  2032.   if not PictureEmpty and not (csLoading in ComponentState) then
  2033.   begin
  2034.     if FWorkBitmap.Empty then Resized;
  2035.     BitmapOptions.Changed;
  2036.   end;
  2037. end;
  2038. procedure TfcDBCustomImager.Resized;
  2039. begin
  2040.   if csLoading in ComponentState then Exit;
  2041.   if (Picture.Graphic = nil) or (picture.graphic.empty) then exit;
  2042.   if not PreProcess and not (DrawStyle in [dsNormal, dsCenter]) then
  2043.     FWorkBitmap.SetSize(Width, Height)
  2044.   else begin
  2045.      if BitmapOptions.Rotation.Angle <> 0 then { 10/5/99 }
  2046.         FWorkBitmap.SetSize(fcMax(Picture.Width, Picture.Height), fcMax(Picture.Height, Picture.Width))
  2047.      else
  2048.         FWorkBitmap.SetSize(Picture.Width, Picture.Height)
  2049.   end;
  2050.   if not FInResized then begin
  2051.     FInResized := True;
  2052.     UpdateWorkBitmap;
  2053.     FInResized := False;
  2054.   end
  2055.   else BitmapOptions.Changed;
  2056.   UpdateAutoSize;
  2057. end;
  2058. procedure TfcDBCustomImager.CreateWnd;
  2059. begin
  2060.    inherited CreateWnd;
  2061.    if Transparent then
  2062.    begin
  2063.       SetWindowLong(Parent.Handle, GWL_STYLE,
  2064.        GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  2065.    end;
  2066. end;
  2067. procedure TfcDBCustomImager.WMEraseBkgnd(var Message: TWmEraseBkgnd);
  2068. begin
  2069.   if Transparent or fcIsClass(parent.classtype, 'TCustomGrid') then
  2070.     Message.result:= 1
  2071.   else inherited;
  2072. end;
  2073. procedure TfcDBImager.WMLButtonDown(var Message: TWMLButtonDown);
  2074. begin
  2075.   if TabStop and CanFocus then SetFocus;
  2076.   inherited;
  2077. end;
  2078. procedure TfcDBImager.SetBorderStyle(Value: TBorderStyle);
  2079. begin
  2080.   if FBorderStyle <> Value then
  2081.   begin
  2082.     FBorderStyle := Value;
  2083.     RecreateWnd;
  2084.   end;
  2085. end;
  2086. procedure TfcDBImager.CreateParams(var Params: TCreateParams);
  2087. begin
  2088.   inherited CreateParams(Params);
  2089.   with Params do
  2090.   begin
  2091.     if FBorderStyle = bsSingle then
  2092.       if NewStyleControls and Ctl3D then
  2093.         ExStyle := ExStyle or WS_EX_CLIENTEDGE
  2094.       else
  2095.         Style := Style or WS_BORDER;
  2096.     WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
  2097.   end;
  2098. end;
  2099. function TfcDBImager.GetPalette: HPALETTE;
  2100. begin
  2101.   Result := 0;
  2102.   if Picture.Graphic is TBitmap then
  2103.     Result := TBitmap(FPicture.Graphic).Palette;
  2104. end;
  2105. function TfcDBImager.PaletteChanged(Foreground: Boolean): Boolean;
  2106. var
  2107.   OldPalette, Palette: HPALETTE;
  2108.   WindowHandle: HWnd;
  2109.   DC: HDC;
  2110. begin
  2111.   Result := False;
  2112.   if (not Visible) and not fcIsClass(parent.classtype, 'TCustomGrid') then exit;
  2113.   Palette := GetPalette;
  2114.   if Palette <> 0 then
  2115.   begin
  2116.     DC := GetDeviceContext(WindowHandle);
  2117.     OldPalette := SelectPalette(DC, Palette, not Foreground);
  2118.     if RealizePalette(DC) <> 0 then Invalidate;
  2119.     SelectPalette(DC, OldPalette, True);
  2120.     ReleaseDC(WindowHandle, DC);
  2121.     Result := True;
  2122.   end;
  2123. end;
  2124. procedure TfcDBImager.SetPictureType(Value: TfcImagerPictureType);
  2125. begin
  2126.   if Value <> FPictureType then begin
  2127.      FPictureType := Value;
  2128.      FPicture.Graphic.Free;
  2129.      Resized;
  2130.   end;
  2131. end;
  2132. function TfcDBImager.ExecuteAction(Action: TBasicAction): Boolean;
  2133. begin
  2134.   Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2135.     FDataLink.ExecuteAction(Action);
  2136. end;
  2137. function TfcDBImager.UpdateAction(Action: TBasicAction): Boolean;
  2138. begin
  2139.   Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  2140.     FDataLink.UpdateAction(Action);
  2141. end;
  2142.   procedure TfcDBimager.WMEraseBkgnd(var Message: TWmEraseBkgnd);
  2143.   begin
  2144.      message.result:=1;
  2145.   end;
  2146. end.