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

Delphi控件源码

开发平台:

Delphi

  1. unit fcImage;
  2. {
  3. //
  4. // Components : TfcCustomImage
  5. //
  6. // Copyright (c) 1999 by Woll2Woll Software
  7. // 2/1/2000 - Use fcBitmap if 256 colorsf
  8. // 2/19/01 - Don't reference canvas if no picture assigned as
  9. //           referencing it causes bitmap to be created
  10. }
  11. interface
  12. {$i fcIfDef.pas}
  13. uses
  14.   Consts, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  15.  {$ifdef fcdelphi6Up}
  16.  variants,
  17.  {$endif}
  18.  fcbitmap;
  19.  
  20. type
  21.   TfcCustomImage = class(TGraphicControl)
  22.   private
  23.     FPicture: TPicture;
  24.     FAutoSize: Boolean;
  25.     FIncrementalDisplay: Boolean;
  26.     FTransparent: Boolean;
  27.     FDrawing: Boolean;
  28.     function GetCanvas: TCanvas;
  29.     procedure PictureChanged(Sender: TObject);
  30.     {$ifndef fcDelphi6Up}
  31.     procedure SetAutoSize(Value: Boolean);
  32.     {$endif}
  33.     procedure SetPicture(Value: TPicture);
  34.     procedure SetTransparent(Value: Boolean);
  35.   protected
  36.     {$ifdef fcDelphi6Up}
  37.     procedure SetAutoSize(Value: Boolean); override;
  38.     {$endif}
  39.     function DestRect: TRect;
  40.     function DoPaletteChange: Boolean;
  41.     function GetPalette: HPALETTE; override;
  42.     procedure Paint; override;
  43. //    procedure DoChanged; virtual;
  44.   public
  45.     BasePatch: Variant;
  46.     constructor Create(AOwner: TComponent); override;
  47.     destructor Destroy; override;
  48.     property Canvas: TCanvas read GetCanvas;
  49.     property AutoSize: Boolean read FAutoSize write SetAutoSize default False;
  50.     property IncrementalDisplay: Boolean read FIncrementalDisplay write FIncrementalDisplay default False;
  51.     property Picture: TPicture read FPicture write SetPicture;
  52.     property Transparent: Boolean read FTransparent write SetTransparent default False;
  53.   end;
  54. implementation
  55. constructor TfcCustomImage.Create(AOwner: TComponent);
  56. begin
  57.   inherited Create(AOwner);
  58.   ControlStyle := ControlStyle + [csReplicatable];
  59.   FPicture := TPicture.Create;
  60.   FPicture.OnChange := PictureChanged;
  61.   Height := 105;
  62.   Width := 105;
  63.   BasePatch:= VarArrayCreate([0, 0], varVariant);
  64.   BasePatch[0]:= False;
  65. end;
  66. destructor TfcCustomImage.Destroy;
  67. begin
  68.   FPicture.Free;
  69.   inherited Destroy;
  70. end;
  71. function TfcCustomImage.GetPalette: HPALETTE;
  72. begin
  73.   Result := 0;
  74.   if FPicture.Graphic <> nil then
  75.     Result := FPicture.Graphic.Palette;
  76. end;
  77. function TfcCustomImage.DestRect: TRect;
  78. begin
  79.     Result := Rect(0, 0, Picture.Width, Picture.Height);
  80. end;
  81. procedure TfcCustomImage.Paint;
  82. var
  83.   Save: Boolean;
  84.   workbitmap: TfcBitmap;
  85. begin
  86.   if Picture.Width=0 then exit; // 2/19/01 - Don't reference canvas if no picture assigned as
  87.                                 // referencing it causes bitmap to be created
  88.   if csDesigning in ComponentState then
  89.     with inherited Canvas do
  90.     begin
  91.       Pen.Style := psDash;
  92.       Brush.Style := bsClear;
  93.       Rectangle(0, 0, Width, Height);
  94.     end;
  95.   Save := FDrawing;
  96.   FDrawing := True;
  97.   try
  98.     { 2/1/2000 - Use fcBitmap if 256 colors }
  99.     if (BasePatch[0]=False) and
  100.        (GetDeviceCaps(Canvas.Handle, BITSPIXEL) <= 8) then
  101.     begin
  102.       workBitmap:= TfcBitmap.create;
  103.       workBitmap.RespectPalette:= True; // 10/4/00 - RespectPallete more accurate with colors than UseHalftonePalette
  104. //      workBitmap.UseHalftonePalette:= true;
  105.       workbitmap.assign(picture.graphic);
  106.       (inherited Canvas).Draw(DestRect.Left, DestRect.Top, WorkBitmap);
  107.       workbitmap.free;
  108.     end
  109.     else
  110.       with inherited Canvas do
  111.         StretchDraw(DestRect, Picture.Graphic);
  112.   finally
  113.     FDrawing := Save;
  114.   end;
  115. end;
  116. function TfcCustomImage.DoPaletteChange: Boolean;
  117. var
  118.   ParentForm: TCustomForm;
  119.   Tmp: TGraphic;
  120. begin
  121.   Result := False;
  122.   Tmp := Picture.Graphic;
  123.   if Visible and (not (csLoading in ComponentState)) and (Tmp <> nil) and
  124.     (Tmp.PaletteModified) then
  125.   begin
  126.     if (Tmp.Palette = 0) then
  127.       Tmp.PaletteModified := False
  128.     else
  129.     begin
  130.       ParentForm := GetParentForm(Self);
  131.       if Assigned(ParentForm) and ParentForm.Active and Parentform.HandleAllocated then
  132.       begin
  133.         if FDrawing then
  134.           ParentForm.Perform(wm_QueryNewPalette, 0, 0)
  135.         else
  136.           PostMessage(ParentForm.Handle, wm_QueryNewPalette, 0, 0);
  137.         Result := True;
  138.         Tmp.PaletteModified := False;
  139.       end;
  140.     end;
  141.   end;
  142. end;
  143. function TfcCustomImage.GetCanvas: TCanvas;
  144. var
  145.   Bitmap: TBitmap;
  146. begin
  147.   if Picture.Graphic = nil then
  148.   begin
  149.     Bitmap := TBitmap.Create;
  150.     try
  151.       Bitmap.Width := Width;
  152.       Bitmap.Height := Height;
  153.       Picture.Graphic := Bitmap;
  154.     finally
  155.       Bitmap.Free;
  156.     end;
  157.   end;
  158.   if Picture.Graphic is TBitmap then
  159.     Result := TBitmap(Picture.Graphic).Canvas
  160.   else
  161.     raise EInvalidOperation.Create(SImageCanvasNeedsBitmap);
  162. end;
  163. procedure TfcCustomImage.SetAutoSize(Value: Boolean);
  164. begin
  165.   FAutoSize := Value;
  166.   PictureChanged(Self);
  167. end;
  168. procedure TfcCustomImage.SetPicture(Value: TPicture);
  169. begin
  170.   FPicture.Assign(Value);
  171. end;
  172. procedure TfcCustomImage.SetTransparent(Value: Boolean);
  173. begin
  174.   if Value <> FTransparent then
  175.   begin
  176.     FTransparent := Value;
  177.     PictureChanged(Self);
  178.   end;
  179. end;
  180. procedure TfcCustomImage.PictureChanged(Sender: TObject);
  181. var
  182.   G: TGraphic;
  183. begin
  184.   if AutoSize and (Picture.Width > 0) and (Picture.Height > 0) then
  185.     SetBounds(Left, Top, Picture.Width, Picture.Height);
  186.   G := Picture.Graphic;
  187.   if G <> nil then
  188.   begin
  189.     if not ((G is TMetaFile) or (G is TIcon)) then
  190.       G.Transparent := FTransparent;
  191.     if (not G.Transparent) and ((G.Width >= Width)
  192.       and (G.Height >= Height)) then
  193.       ControlStyle := ControlStyle + [csOpaque]
  194.     else
  195.       ControlStyle := ControlStyle - [csOpaque];
  196.     if DoPaletteChange and FDrawing then Update;
  197.   end
  198.   else ControlStyle := ControlStyle - [csOpaque];
  199.   if not FDrawing then Invalidate;
  200. //  DoChanged;
  201. end;
  202. {procedure TfcCustomImage.DoChanged;
  203. begin
  204. end;
  205. }
  206. end.