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

Delphi控件源码

开发平台:

Delphi

  1. unit fcimagepanel2;
  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 SetImage(Value: TPicture);
  27.     procedure SetPicture(Value: TBitMap);
  28.     procedure SetControl(Value: TWinControl);
  29.   protected
  30.     procedure DestroyWnd;
  31.     function GetTransparentColor: TColor;
  32.     procedure DefineProperties(Filer: TFiler);override;
  33.     procedure SetParent(Value:TWinControl); override;
  34.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  35.     procedure Paint; override;
  36.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  37.       X, Y: Integer); override;
  38.     procedure WmNcHitTest(var Msg: TWmNcHitTest); message wm_NcHitTest;
  39.     procedure UpdateSize;
  40.   public
  41.     Patch: Variant;
  42.     constructor Create(Aowner:TComponent); override;
  43.     destructor Destroy; override;
  44.     procedure ApplyBitmapRegion; virtual;
  45.     property RegionData: HRgn read FRegion stored True;
  46.     property Picture: TPicture read GetPicture write SetImage;
  47.     property TransparentColor: TColor read FTransparentColor write FTransparentColor default clNone;
  48.     property Control : TWinControl read FControl write SetControl;
  49.   end;
  50.   TfcImagePanel = class(TfcCustomImagePanel)
  51.   published
  52. //    property Control;
  53.     property Align;
  54.     property AutoSize;
  55.     property Picture;
  56.     property PopupMenu;
  57.     property ShowHint;
  58.     property Visible;
  59.     property OnClick;
  60.     property OnDblClick;
  61.     property OnMouseDown;
  62.     property OnMouseMove;
  63.     property OnMouseUp;
  64.     property TransparentColor;
  65.   end;
  66.   procedure Register;
  67. implementation
  68. //{$r fcFrmBtn.RES}
  69. const
  70.    sc_DragMove: LongInt = $F012;//for use in API call to perform draging control
  71. type
  72.   TfcImageForPanel = class(TfcCustomImage)
  73.     protected
  74.        procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  75.          X, Y: Integer); override;
  76.        procedure MouseuP(Button: TMouseButton; Shift: TShiftState;
  77.          X, Y: Integer); override;
  78.        procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  79.        procedure DblClick; override;
  80.        procedure Click; override;
  81.     public
  82.        constructor Create(AOwner: TComponent); override;
  83.   end;
  84. constructor TfcImageForPanel.Create(AOwner: TComponent);
  85. begin
  86.    inherited Create(AOwner);
  87. //   ControlStyle:= ControlStyle - [csClickEvents];
  88. end;
  89. procedure TfcImageForPanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  90.       X, Y: Integer);
  91. begin
  92.    (parent as TfcCustomImagePanel).MouseDown(Button, Shift, X, Y);
  93.    inherited;
  94. end;
  95. procedure TfcImageForPanel.MouseUp(Button: TMouseButton; Shift: TShiftState;
  96.       X, Y: Integer);
  97. begin
  98.    (parent as TfcCustomImagePanel).MouseUp(Button, Shift, X, Y);
  99.    inherited;
  100. end;
  101. procedure TfcImageForPanel.MouseMove(Shift: TShiftState; X, Y: Integer);
  102. begin
  103.    (parent as TfcCustomImagePanel).MouseMove(Shift, X, Y);
  104.    inherited;
  105. end;
  106. procedure TfcImageForPanel.DblClick;
  107. begin
  108.    (parent as TfcCustomImagePanel).DblClick;
  109.    inherited;
  110. end;
  111. procedure TfcImageForPanel.Click;
  112. begin
  113.    (parent as TfcCustomImagePanel).Click;
  114.    inherited;
  115. end;
  116. constructor TfcCustomImagePanel.Create(Aowner:TComponent);
  117. begin
  118.   inherited Create(AOwner);
  119.   FRegion := 0;
  120.   FTransparentColor := clNone;
  121.   FImage:= TfcImageForPanel.create(self);
  122.   FImage.AutoSize:= True;
  123.   FImage.parent:= self;
  124.   FControl:= self;
  125. //  BevelOuter:= bvNone;
  126. //  FPicture:= TBitMap.Create;
  127. end;
  128. destructor TfcCustomImagePanel.Destroy;
  129. begin
  130.   if FRegion <> 0 then DeleteObject(FRegion);
  131.   FImage.Free;
  132. //  FPicture.Free;
  133.   inherited Destroy;
  134. end;
  135. procedure TfcCustomImagePanel.DestroyWnd;
  136. begin
  137.   if (FRegion <> 0) and (Control<>nil) then
  138.   begin
  139.     SetWindowRgn(Control.Handle, 0, False);
  140.     DeleteObject(FRegion);
  141.     FRegion := 0;
  142.   end;
  143. end;
  144. procedure TfcCustomImagePanel.ReadRegions(Reader: TStream);
  145. var
  146.    rgnsize:integer;
  147.    rgndata: pRGNData;
  148. begin
  149.   Reader.Read(RgnSize, 4);
  150.   if RgnSize <> 0 then
  151.   begin
  152.     GetMem(RgnData, RgnSize);
  153.     try
  154.       Reader.Read(RgnData^,rgnSize);
  155.       FRegion := ExtCreateRegion(nil, RgnSize, RgnData^);
  156.       if not (csDesigning in ComponentState) and (FRegion<>0) and
  157.         (Control<>nil) then
  158.         begin
  159.           Control.HandleNeeded;
  160.           if Control.HandleAllocated then
  161.              SetWindowRgn(Control.handle,Fregion,true)
  162.         end
  163.     finally
  164.       FreeMem(RgnData);
  165.     end;
  166.   end else begin
  167.     FRegion := 0;
  168.     ApplyBitmapRegion;
  169.   end
  170. end;
  171. procedure TfcCustomImagePanel.WriteRegions(Writer: TStream);
  172. var
  173.    size:integer;
  174.    rgndata: pRGNData;
  175.    stat: integer;
  176. begin
  177.   ApplyBitmapRegion;
  178.   if (FRegion <> 0) then
  179.   begin
  180.     Size := GetRegionData(FRegion, 0, nil);
  181.     Writer.Write(Size, SizeOf(Size));
  182.     if Size > 0 then
  183.     begin
  184.       Getmem(RgnData,size);
  185.       try
  186.         Stat := GetRegionData(FRegion, Size, RgnData);
  187.         if Stat > 0 then Writer.Write(RgnData^, Size);
  188.       finally
  189.         FreeMem(RgnData);
  190.       end;
  191.     end;
  192.   end else begin
  193.     Size := 0;
  194.     Writer.Write(Size, SizeOf(Size));
  195.   end;
  196. end;
  197. procedure TfcCustomImagePanel.DefineProperties(Filer: TFiler);
  198. begin
  199.   inherited DefineProperties(Filer);
  200.   Filer.DefineBinaryProperty('RegionData', ReadRegions, WriteRegions, True);
  201. end;
  202. procedure TfcCustomImagePanel.SetParent(Value: TWinControl);
  203. begin
  204. { 2/15/00 - Don't think we need this }
  205. {  if (Value <> nil) and not (Value is TCustomForm) then
  206.     Value := GetParentForm(Value);
  207. }
  208.   inherited SetParent(value);
  209. {  if Parent <> nil then
  210.     SetWindowLong(Parent.Handle, GWL_STYLE,
  211.       GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  212. }
  213. end;
  214. procedure TfcCustomImagePanel.ApplyBitmapRegion;
  215. //var tempBitmap: TBitmap;
  216. begin
  217.   if Control<>nil then
  218.   begin
  219.      Control.HandleNeeded;
  220.      if not Control.HandleAllocated then exit;
  221.   end;
  222.   
  223.   SetWindowRgn(Control.Handle, 0, False);
  224.   if FRegion <> 0 then DeleteObject(FRegion);
  225. { This would work for JPG, but JPG would leave non-transparent areas where the intention
  226.   is to be transparent. Thus we do not support JPG }
  227. {  tempBitmap:= TBitmap.create;
  228.   tempBitmap.assign(picture.graphic);
  229.   FRegion := fcCreateRegionFromBitmap(tempbitmap, tempbitmap.canvas.pixels[0,0]);
  230.   tempBitmap.free;
  231. }
  232.   FRegion := fcCreateRegionFromBitmap(Picture.Bitmap, GetTransparentColor);
  233.   if not (csDesigning in ComponentState) then
  234.      SetWindowRgn(Control.Handle, FRegion, True);
  235. end;
  236. function TfcCustomImagePanel.GetPicture: TPicture;
  237. begin
  238. //  result := inherited Picture;
  239.   result:= FImage.Picture;
  240. end;
  241. function TfcCustomImagePanel.GetTransparentColor: TColor;
  242. begin
  243.    result := FTransparentColor;
  244.    if FTransparentColor=clNone then
  245.    begin
  246.       if (Picture.Bitmap<>Nil) then
  247.          result:= Picture.Bitmap.Canvas.Pixels[0,Picture.Bitmap.height-1]
  248.    end
  249.    else result:= FTransparentColor;
  250. end;
  251. procedure TfcCustomImagePanel.SetControl(Value: TWinControl);
  252. begin
  253.    FControl:= Value;
  254.    if FControl<>nil then ApplyBitmapRegion;
  255. end;
  256. procedure TfcCustomImagePanel.SetImage(Value: TPicture);
  257. begin
  258.   FImage.Picture:= Value;
  259.   Invalidate;
  260. end;
  261. procedure TfcCustomImagePanel.UpdateSize;
  262. begin
  263.   // Added to support autosizing of the form
  264.   if InUpdateSize then exit;
  265.   if FImage=nil then exit;
  266.   if FImage.Picture=nil then exit;
  267.   InUpdateSize:= true;
  268.   if (Picture.Width > 0) and (Picture.height > 0) then
  269.   begin
  270.      if AutoSize then
  271.      begin
  272. //        SetWindowPos(Handle, 0, Left, Top, Picture.Graphic.Width,
  273. //           Picture.Graphic.Height, 0);
  274.         ClientWidth := FImage.Picture.Width;
  275.         ClientHeight := FImage.Picture.Height;
  276. //        ShowMessage(inttostr(FImage.Picture.Width));
  277. //        ShowMessage(inttostr(FImage.Picture.Graphic.Width));
  278.      end;
  279.      FImage.Width:= ClientWidth;
  280.      FImage.Height:= ClientHeight;
  281.   end;
  282.   InUpdateSize:= False;
  283. end;
  284. procedure TfcCustomImagePanel.Notification(AComponent: TComponent; Operation: TOperation);
  285. begin
  286.   inherited;
  287.   if (Operation = opRemove) and (AComponent = FControl) then
  288.     FControl := nil;
  289. end;
  290. procedure Register;
  291. begin
  292.   RegisterComponents('1stClass', [TfcImagePanel]);
  293. end;
  294. type TCheatGraphic = class(TGraphic);
  295. {procedure TfcCustomImagePanel.Paint;
  296. begin
  297.    inherited;
  298. end;}
  299. // here we draw the image to the panel's canvas
  300. // note that in this version we don't
  301. // call inherited paint
  302. procedure TfcCustomImagePanel.Paint;
  303. var
  304. DestRect: TRect;
  305. OldPal: HPalette;
  306. begin
  307. OldPal:= SelectPalette(Canvas.Handle,FImage.Picture.Bitmap.Palette,False);
  308. try
  309.   RealizePalette(Canvas.Handle);
  310.   if (csDesigning in ComponentState) then begin // design time paint
  311.     if FImage.Picture.Bitmap.Empty then begin// design time visibility
  312.       with Canvas do begin
  313.         Pen.Style:= psSolid;
  314.         Pen.Color:= clGray;
  315.         Pen.Mode:= pmXor;
  316.         Brush.Style:= bsClear;
  317.         Rectangle(0,0,Width,Height);
  318.       end;// with Canvas
  319.     end else begin
  320.     DestRect:= Rect(0,0,Width,Height);
  321.     Canvas.StretchDraw(DestRect,FImage.Picture.bitmap);
  322.     end;// if picture empty
  323.   end else begin // runtime paint
  324.     if not FImage.Picture.Bitmap.Empty then begin
  325.        DestRect:= Rect(0,0,Width,Height);
  326.       Canvas.StretchDraw(DestRect,FImage.Picture.bitmap);
  327.     end;// if not empty runtime
  328.   end// if designing
  329. Finally
  330.   if OldPal <> 0 then
  331.   SelectPalette(Canvas.Handle,OldPal,False);
  332. end;//try
  333. end;
  334. procedure TfcCustomImagePanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  335.       X, Y: Integer);
  336. {const
  337.    SC_DRAGMOVE = $F012;}
  338. begin
  339. {   inherited;
  340.    ReleaseCapture;
  341.    Perform(WM_SysCommand, SC_DRAGMOVE, 0);}
  342.   BringToFront;
  343.   if Button = mbLeft then begin
  344.     screen.cursor:=crDrag;
  345.     ReleaseCapture;
  346.     Perform(wm_SysCommand,sc_DragMove,0);
  347.   end;
  348.   screen.cursor:=crDefault;
  349.   inherited MouseDown(Button,Shift,X,Y);
  350. end;
  351. // this will detect when cursor is over the edge of the image
  352. // change the cursor to indicate sizing is available and allow you to //size the image by holding down the left mouse button
  353. procedure TfcCustomImagePanel.WmNcHitTest(var Msg: TWmNcHitTest);
  354. var
  355. Pt:Tpoint;
  356. begin
  357. Pt:= Point(Msg.Xpos,Msg.Ypos);
  358. PT:= ScreenToClient(Pt);
  359. if (Pt.x<4) and (Pt.y < 4) then
  360.   Msg.Result:= htTopLeft
  361. else if (Pt.x> Width -4) and (Pt.y < 4) then
  362.   Msg.Result:= htTopRight
  363. else if (Pt.x > Width -4) and (Pt.y > Height -4) then
  364.   Msg.Result:= htBottomRight
  365. else if (Pt.x < 4) and (Pt.y > Height -4) then
  366.   Msg.Result:= htBottomLeft
  367. else if (Pt.x< 4) then
  368.   Msg.Result:= htLeft
  369. else if (Pt.y < 4) then
  370.   Msg.Result:= htTop
  371. else if (Pt.x > Width -4) then
  372.   Msg.Result:= htRight
  373. else if (Pt.y > Height -4) then
  374.   Msg.Result:= htBottom
  375. else
  376.   inherited;
  377. end;
  378. procedure TfcCustomImagePanel.SetPicture(Value: TBitMap);
  379. begin
  380.   //FPicture.Assign(Value);
  381. end;
  382. end.