fcimagepanel.roy
上传用户: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;
  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.   if (FRegion <> 0) and (Control<>nil) then
  131.   begin
  132.     SetWindowRgn(Control.Handle, 0, False);
  133.     DeleteObject(FRegion);
  134.     FRegion := 0;
  135.   end;
  136. end;
  137. procedure TfcCustomImagePanel.ReadRegions(Reader: TStream);
  138. var
  139.    rgnsize:integer;
  140.    rgndata: pRGNData;
  141. begin
  142.   Reader.Read(RgnSize, 4);
  143.   if RgnSize <> 0 then
  144.   begin
  145.     GetMem(RgnData, RgnSize);
  146.     try
  147.       Reader.Read(RgnData^,rgnSize);
  148.       FRegion := ExtCreateRegion(nil, RgnSize, RgnData^);
  149.       if not (csDesigning in ComponentState) and (FRegion<>0) and
  150.         (Control<>nil) then
  151.         begin
  152.           Control.HandleNeeded;
  153.           if Control.HandleAllocated then
  154.              SetWindowRgn(Control.handle,Fregion,true)
  155.         end
  156.     finally
  157.       FreeMem(RgnData);
  158.     end;
  159.   end else begin
  160.     FRegion := 0;
  161.     ApplyBitmapRegion;
  162.   end
  163. end;
  164. procedure TfcCustomImagePanel.WriteRegions(Writer: TStream);
  165. var
  166.    size:integer;
  167.    rgndata: pRGNData;
  168.    stat: integer;
  169. begin
  170.   ApplyBitmapRegion;
  171.   if (FRegion <> 0) then
  172.   begin
  173.     Size := GetRegionData(FRegion, 0, nil);
  174.     Writer.Write(Size, SizeOf(Size));
  175.     if Size > 0 then
  176.     begin
  177.       Getmem(RgnData,size);
  178.       try
  179.         Stat := GetRegionData(FRegion, Size, RgnData);
  180.         if Stat > 0 then Writer.Write(RgnData^, Size);
  181.       finally
  182.         FreeMem(RgnData);
  183.       end;
  184.     end;
  185.   end else begin
  186.     Size := 0;
  187.     Writer.Write(Size, SizeOf(Size));
  188.   end;
  189. end;
  190. procedure TfcCustomImagePanel.DefineProperties(Filer: TFiler);
  191. begin
  192.   inherited DefineProperties(Filer);
  193.   Filer.DefineBinaryProperty('RegionData', ReadRegions, WriteRegions, True);
  194. end;
  195. procedure TfcCustomImagePanel.SetParent(Value: TWinControl);
  196. begin
  197. { 2/15/00 - Don't think we need this }
  198. {  if (Value <> nil) and not (Value is TCustomForm) then
  199.     Value := GetParentForm(Value);
  200. }
  201.   inherited SetParent(value);
  202. {  if Parent <> nil then
  203.     SetWindowLong(Parent.Handle, GWL_STYLE,
  204.       GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  205. }
  206. end;
  207. procedure TfcCustomImagePanel.ApplyBitmapRegion;
  208. //var tempBitmap: TBitmap;
  209. begin
  210.   if Control<>nil then
  211.   begin
  212.      Control.HandleNeeded;
  213.      if not Control.HandleAllocated then exit;
  214.   end;
  215.   
  216.   SetWindowRgn(Control.Handle, 0, False);
  217.   if FRegion <> 0 then DeleteObject(FRegion);
  218. { This would work for JPG, but JPG would leave non-transparent areas where the intention
  219.   is to be transparent. Thus we do not support JPG }
  220. {  tempBitmap:= TBitmap.create;
  221.   tempBitmap.assign(picture.graphic);
  222.   FRegion := fcCreateRegionFromBitmap(tempbitmap, tempbitmap.canvas.pixels[0,0]);
  223.   tempBitmap.free;
  224. }
  225.   FRegion := fcCreateRegionFromBitmap(Picture.Bitmap, GetTransparentColor);
  226.   if not (csDesigning in ComponentState) then
  227.      SetWindowRgn(Control.Handle, FRegion, True);
  228. end;
  229. function TfcCustomImagePanel.GetPicture: TPicture;
  230. begin
  231. //  result := inherited Picture;
  232.   result:= FImage.Picture;
  233. end;
  234. function TfcCustomImagePanel.GetTransparentColor: TColor;
  235. begin
  236.    result := FTransparentColor;
  237.    if FTransparentColor=clNone then
  238.    begin
  239.       if (Picture.Bitmap<>Nil) then
  240.          result:= Picture.Bitmap.Canvas.Pixels[0,Picture.Bitmap.height-1]
  241.    end
  242.    else result:= FTransparentColor;
  243. end;
  244. procedure TfcCustomImagePanel.SetControl(Value: TWinControl);
  245. begin
  246.    FControl:= Value;
  247.    if FControl<>nil then ApplyBitmapRegion;
  248. end;
  249. procedure TfcCustomImagePanel.SetPicture(Value: TPicture);
  250. begin
  251.   FImage.Picture:= Value;
  252.   Invalidate;
  253. end;
  254. procedure TfcCustomImagePanel.UpdateSize;
  255. begin
  256.   // Added to support autosizing of the form
  257.   if InUpdateSize then exit;
  258.   if FImage=nil then exit;
  259.   if FImage.Picture=nil then exit;
  260.   InUpdateSize:= true;
  261.   if (Picture.Width > 0) and (Picture.height > 0) then
  262.   begin
  263.      if AutoSize then
  264.      begin
  265. //        SetWindowPos(Handle, 0, Left, Top, Picture.Graphic.Width,
  266. //           Picture.Graphic.Height, 0);
  267.         ClientWidth := FImage.Picture.Width;
  268.         ClientHeight := FImage.Picture.Height;
  269. //        ShowMessage(inttostr(FImage.Picture.Width));
  270. //        ShowMessage(inttostr(FImage.Picture.Graphic.Width));
  271.      end;
  272.      FImage.Width:= ClientWidth;
  273.      FImage.Height:= ClientHeight;
  274.   end;
  275.   InUpdateSize:= False;
  276. end;
  277. procedure TfcCustomImagePanel.Notification(AComponent: TComponent; Operation: TOperation);
  278. begin
  279.   inherited;
  280.   if (Operation = opRemove) and (AComponent = FControl) then
  281.     FControl := nil;
  282. end;
  283. procedure Register;
  284. begin
  285.   RegisterComponents('1stClass', [TfcImagePanel]);
  286. end;
  287. type TCheatGraphic = class(TGraphic);
  288. procedure TfcCustomImagePanel.Paint;
  289. begin
  290.    inherited;
  291. end;
  292. procedure TfcCustomImagePanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  293.       X, Y: Integer);
  294. const
  295.    SC_DRAGMOVE = $F012;
  296. begin
  297.    inherited;
  298.    ReleaseCapture;
  299.    Perform(WM_SysCommand, SC_DRAGMOVE, 0);
  300. end;
  301. end.