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

Delphi控件源码

开发平台:

Delphi

  1. unit fcimagepanel;
  2. {
  3. //
  4. // Components : TfcImagePanel
  5. //
  6. // Copyright (c) 2000 by Woll2Woll Software
  7. //
  8. }
  9. interface
  10. uses
  11.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  12.   StdCtrls, ExtCtrls, Buttons, fcCommon, fcimage;
  13. type
  14. //  TfcCustomImagePanel = class(TfcCustomImage)
  15.   TfcCustomImagePanel = class(TCustomPanel)
  16.   private
  17.     FTransparentColor: TColor;
  18.     FRegion: HRgn;
  19.     FControl: TWinControl;
  20.     FImage: TfcCustomImage;
  21. //    FInheritedPictureChanged: TNotifyEvent;
  22.     InUpdateSize: boolean;
  23.     procedure ReadRegions(Reader: TStream);
  24.     procedure WriteRegions(Writer: TStream);
  25.     function GetPicture: TPicture;
  26.     procedure SetPicture(Value: TPicture);
  27.     procedure SetControl(Value: TWinControl);
  28.   protected
  29.     procedure DestroyWnd; override;
  30.     function GetTransparentColor: TColor;
  31.     procedure DefineProperties(Filer: TFiler);override;
  32.     procedure SetParent(Value:TWinControl); override;
  33.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  34.     procedure Paint; override;
  35.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  36.       X, Y: Integer); override;
  37.     procedure UpdateSize;
  38.   public
  39.     Patch: Variant;
  40.     constructor Create(Aowner:TComponent); override;
  41.     destructor Destroy; override;
  42.     procedure ApplyBitmapRegion; virtual;
  43.     property RegionData: HRgn read FRegion stored True;
  44.     property Picture: TPicture read GetPicture write SetPicture;
  45.     property TransparentColor: TColor read FTransparentColor write FTransparentColor default clNone;
  46.     property Control : TWinControl read FControl write SetControl;
  47.   end;
  48.   TfcImagePanel = class(TfcCustomImagePanel)
  49.   published
  50. //    property Control;
  51.     property Align;
  52.     property AutoSize;
  53.     property Picture;
  54.     property PopupMenu;
  55.     property ShowHint;
  56.     property Visible;
  57.     property OnClick;
  58.     property OnDblClick;
  59.     property OnMouseDown;
  60.     property OnMouseMove;
  61.     property OnMouseUp;
  62.     property TransparentColor;
  63.   end;
  64.   procedure Register;
  65. implementation
  66. //{$r fcFrmBtn.RES}
  67. type
  68.   TfcImageForPanel = class(TfcCustomImage)
  69.     protected
  70.        procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  71.          X, Y: Integer); override;
  72.        procedure MouseuP(Button: TMouseButton; Shift: TShiftState;
  73.          X, Y: Integer); override;
  74.        procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  75.        procedure DblClick; override;
  76.        procedure Click; override;
  77.     public
  78.        constructor Create(AOwner: TComponent); override;
  79.   end;
  80. constructor TfcImageForPanel.Create(AOwner: TComponent);
  81. begin
  82.    inherited Create(AOwner);
  83. //   ControlStyle:= ControlStyle - [csClickEvents];
  84. end;
  85. procedure TfcImageForPanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  86.       X, Y: Integer);
  87. begin
  88.    (parent as TfcCustomImagePanel).MouseDown(Button, Shift, X, Y);
  89.    inherited;
  90. end;
  91. procedure TfcImageForPanel.MouseUp(Button: TMouseButton; Shift: TShiftState;
  92.       X, Y: Integer);
  93. begin
  94.    (parent as TfcCustomImagePanel).MouseUp(Button, Shift, X, Y);
  95.    inherited;
  96. end;
  97. procedure TfcImageForPanel.MouseMove(Shift: TShiftState; X, Y: Integer);
  98. begin
  99.    (parent as TfcCustomImagePanel).MouseMove(Shift, X, Y);
  100.    inherited;
  101. end;
  102. procedure TfcImageForPanel.DblClick;
  103. begin
  104.    (parent as TfcCustomImagePanel).DblClick;
  105.    inherited;
  106. end;
  107. procedure TfcImageForPanel.Click;
  108. begin
  109.    (parent as TfcCustomImagePanel).Click;
  110.    inherited;
  111. end;
  112. constructor TfcCustomImagePanel.Create(Aowner:TComponent);
  113. begin
  114.   inherited;
  115.   FRegion := 0;
  116.   FTransparentColor := clNone;
  117.   FImage:= TfcImageForPanel.create(self);
  118.   FImage.AutoSize:= True;
  119.   FImage.parent:= self;
  120.   FControl:= self;
  121. end;
  122. destructor TfcCustomImagePanel.Destroy;
  123. begin
  124.   if FRegion <> 0 then DeleteObject(FRegion);
  125.   FImage.Free;
  126.   inherited Destroy;
  127. end;
  128. procedure TfcCustomImagePanel.DestroyWnd;
  129. begin
  130.   inherited;
  131.   if (FRegion <> 0) and (Control<>nil) then
  132.   begin
  133.     SetWindowRgn(Control.Handle, 0, False);
  134.     DeleteObject(FRegion);
  135.     FRegion := 0;
  136.   end;
  137. end;
  138. procedure TfcCustomImagePanel.ReadRegions(Reader: TStream);
  139. var
  140.    rgnsize:integer;
  141.    rgndata: pRGNData;
  142. begin
  143.   Reader.Read(RgnSize, 4);
  144.   if RgnSize <> 0 then
  145.   begin
  146.     GetMem(RgnData, RgnSize);
  147.     try
  148.       Reader.Read(RgnData^,rgnSize);
  149.       FRegion := ExtCreateRegion(nil, RgnSize, RgnData^);
  150.       if not (csDesigning in ComponentState) and (FRegion<>0) and
  151.         (Control<>nil) then
  152.         begin
  153.           Control.HandleNeeded;
  154.           if Control.HandleAllocated then
  155.              SetWindowRgn(Control.handle,Fregion,true)
  156.         end
  157.     finally
  158.       FreeMem(RgnData);
  159.     end;
  160.   end else begin
  161.     FRegion := 0;
  162.     ApplyBitmapRegion;
  163.   end
  164. end;
  165. procedure TfcCustomImagePanel.WriteRegions(Writer: TStream);
  166. var
  167.    size:integer;
  168.    rgndata: pRGNData;
  169.    stat: integer;
  170. begin
  171.   ApplyBitmapRegion;
  172.   if (FRegion <> 0) then
  173.   begin
  174.     Size := GetRegionData(FRegion, 0, nil);
  175.     Writer.Write(Size, SizeOf(Size));
  176.     if Size > 0 then
  177.     begin
  178.       Getmem(RgnData,size);
  179.       try
  180.         Stat := GetRegionData(FRegion, Size, RgnData);
  181.         if Stat > 0 then Writer.Write(RgnData^, Size);
  182.       finally
  183.         FreeMem(RgnData);
  184.       end;
  185.     end;
  186.   end else begin
  187.     Size := 0;
  188.     Writer.Write(Size, SizeOf(Size));
  189.   end;
  190. end;
  191. procedure TfcCustomImagePanel.DefineProperties(Filer: TFiler);
  192. begin
  193.   inherited DefineProperties(Filer);
  194.   Filer.DefineBinaryProperty('RegionData', ReadRegions, WriteRegions, True);
  195. end;
  196. procedure TfcCustomImagePanel.SetParent(Value: TWinControl);
  197. begin
  198. { 2/15/00 - Don't think we need this }
  199. {  if (Value <> nil) and not (Value is TCustomForm) then
  200.     Value := GetParentForm(Value);
  201. }
  202.   inherited SetParent(value);
  203. {  if Parent <> nil then
  204.     SetWindowLong(Parent.Handle, GWL_STYLE,
  205.       GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  206. }
  207. end;
  208. procedure TfcCustomImagePanel.ApplyBitmapRegion;
  209. //var tempBitmap: TBitmap;
  210. begin
  211.   if Control<>nil then
  212.   begin
  213.      Control.HandleNeeded;
  214.      if not Control.HandleAllocated then exit;
  215.   end;
  216.   
  217.   SetWindowRgn(Control.Handle, 0, False);
  218.   if FRegion <> 0 then DeleteObject(FRegion);
  219. { This would work for JPG, but JPG would leave non-transparent areas where the intention
  220.   is to be transparent. Thus we do not support JPG }
  221. {  tempBitmap:= TBitmap.create;
  222.   tempBitmap.assign(picture.graphic);
  223.   FRegion := fcCreateRegionFromBitmap(tempbitmap, tempbitmap.canvas.pixels[0,0]);
  224.   tempBitmap.free;
  225. }
  226.   FRegion := fcCreateRegionFromBitmap(Picture.Bitmap, GetTransparentColor);
  227.   if not (csDesigning in ComponentState) then
  228.      SetWindowRgn(Control.Handle, FRegion, True);
  229. end;
  230. function TfcCustomImagePanel.GetPicture: TPicture;
  231. begin
  232. //  result := inherited Picture;
  233.   result:= FImage.Picture;
  234. end;
  235. function TfcCustomImagePanel.GetTransparentColor: TColor;
  236. begin
  237.    result := FTransparentColor;
  238.    if FTransparentColor=clNone then
  239.    begin
  240.       if (Picture.Bitmap<>Nil) then
  241.          result:= Picture.Bitmap.Canvas.Pixels[0,Picture.Bitmap.height-1]
  242.    end
  243.    else result:= FTransparentColor;
  244. end;
  245. procedure TfcCustomImagePanel.SetControl(Value: TWinControl);
  246. begin
  247.    FControl:= Value;
  248.    if FControl<>nil then ApplyBitmapRegion;
  249. end;
  250. procedure TfcCustomImagePanel.SetPicture(Value: TPicture);
  251. begin
  252.   FImage.Picture:= Value;
  253.   Invalidate;
  254. end;
  255. procedure TfcCustomImagePanel.UpdateSize;
  256. begin
  257.   // Added to support autosizing of the form
  258.   if InUpdateSize then exit;
  259.   if FImage=nil then exit;
  260.   if FImage.Picture=nil then exit;
  261.   InUpdateSize:= true;
  262.   if (Picture.Width > 0) and (Picture.height > 0) then
  263.   begin
  264.      if AutoSize then
  265.      begin
  266. //        SetWindowPos(Handle, 0, Left, Top, Picture.Graphic.Width,
  267. //           Picture.Graphic.Height, 0);
  268.         ClientWidth := FImage.Picture.Width;
  269.         ClientHeight := FImage.Picture.Height;
  270. //        ShowMessage(inttostr(FImage.Picture.Width));
  271. //        ShowMessage(inttostr(FImage.Picture.Graphic.Width));
  272.      end;
  273.      FImage.Width:= ClientWidth;
  274.      FImage.Height:= ClientHeight;
  275.   end;
  276.   InUpdateSize:= False;
  277. end;
  278. procedure TfcCustomImagePanel.Notification(AComponent: TComponent; Operation: TOperation);
  279. begin
  280.   inherited;
  281.   if (Operation = opRemove) and (AComponent = FControl) then
  282.     FControl := nil;
  283. end;
  284. procedure Register;
  285. begin
  286.   RegisterComponents('1stClass', [TfcImagePanel]);
  287. end;
  288. type TCheatGraphic = class(TGraphic);
  289. procedure TfcCustomImagePanel.Paint;
  290. begin
  291.    inherited;
  292. end;
  293. procedure TfcCustomImagePanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  294.       X, Y: Integer);
  295. const
  296.    SC_DRAGMOVE = $F012;
  297. begin
  298.    inherited;
  299.    ReleaseCapture;
  300.    Perform(WM_SysCommand, SC_DRAGMOVE, 0);
  301. end;
  302. end.