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

Delphi控件源码

开发平台:

Delphi

  1. unit fcimageform;
  2. {
  3. //
  4. // Components : TfcImageForm
  5. //
  6. // Copyright (c) 1999 by Woll2Woll Software
  7. //
  8. // History:
  9. // 5/10/99  PYW  Checked for click or mousedown event assigned for a control on a caption bar.
  10. // 4/14/00  PYW  Use Window system command for dragging instead.
  11. // 10/4/00 - RSW New ifRenderWithTImage property
  12. // 1/8/2002 - PYW - Don't use perform.  Use postMessage instead.  More reliable.
  13. //                  When drag full windows was true, perform didn't work and window would not drag.
  14. // 5/24/2002 - Allow clicking on Caption Control to bring form to front.
  15. //
  16. }
  17. interface
  18. uses
  19.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  20.   StdCtrls, ExtCtrls, Buttons, fcCommon, fcimage;
  21. type
  22.   TfcImageFormOption = (ifUseWindowsDrag, ifNoPaletteDither);
  23.   // 10/4/00 -
  24.   // ifRenderWithTImage will use Delphi's TImage code to paint,
  25.   // otherwise use TfcBitmap.  This property is only releveant in
  26.   // 256 color for palette switching.
  27.   TfcImageFormOptions = set of TfcImageFormOption;
  28.   TfcCustomImageForm = class(TfcCustomImage)
  29.   private
  30.     FDragTolerance: Integer;
  31.     FTransparentColor: TColor;
  32.     FRegion: HRgn;
  33.     FCaptionBarControl:TControl;
  34. //    FCaptureMessageClass: TfcCaptureMessageClass;
  35.     FOptions: TfcImageFormOptions;
  36.     LastFocusRect: TRect;    procedure ReadRegions(Reader: TStream);
  37.     procedure WriteRegions(Writer: TStream);
  38.     function GetPicture: TPicture;
  39.     procedure SetPicture(Value: TPicture);
  40.     procedure SetOptions(Value: TFcImageFormOptions);
  41.     procedure SetCaptionBarControl(Value: TControl);
  42.   protected
  43.     DraggingForm: Boolean;
  44.     procedure DestroyWnd;
  45.     procedure Paint; override;
  46.     function GetTransparentColor: TColor;
  47.     procedure DrawFocusRect(DC: HDC; FocusRect: TRect); virtual;
  48.     procedure WndProc(var Message: TMessage); override;
  49.     procedure FormMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual;
  50.     procedure DefineProperties(Filer: TFiler);override;
  51.     procedure SetParent(Value:TWinControl); override;
  52.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  53.     procedure AfterFormWndProc(var Message: TMessage); virtual;
  54.     procedure MouseLoop(X, Y: Integer); virtual;
  55.     procedure MouseLoop_MouseMove(X, Y: Integer; ACursorPos: TPoint;
  56.       var FirstTime: Boolean; var FocusRect: TRect; OriginalRect:TRect); virtual;
  57.     procedure MouseLoop_MouseUp(X, Y: Integer; ACursorPos: TPoint;
  58.       OriginalRect, FocusRect: TRect); virtual;
  59.     function GetDragFullWindows: Boolean; virtual;
  60.   public
  61.     Patch: Variant;
  62.     constructor Create(Aowner:TComponent); override;
  63.     destructor Destroy; override;
  64.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  65.     procedure ApplyBitmapRegion; virtual;
  66.     procedure ScaleRegion(xFact, yFact:Single);virtual;
  67.     property RegionData: HRgn read FRegion stored True;
  68.     property CaptionBarControl: TControl read FCaptionBarControl write SetCaptionBarControl;
  69.     property DragTolerance: Integer read FDragTolerance write FDragTolerance;
  70.     property Picture: TPicture read GetPicture write SetPicture;
  71.     property TransparentColor: TColor read FTransparentColor write FTransparentColor default clNone;
  72.     property Options: TfcImageFormOptions read FOptions write SetOptions default [];
  73.   end;
  74.   TfcImageForm = class(TfcCustomImageForm)
  75.   published
  76.     property Options;
  77.     property Align;
  78.     property AutoSize;
  79.     property Picture;
  80.     property PopupMenu;
  81.     property ShowHint;
  82.     property Visible;
  83.     property OnClick;
  84.     property OnDblClick;
  85.     property OnMouseDown;
  86.     property OnMouseMove;
  87.     property OnMouseUp;
  88.     property CaptionBarControl;
  89.     property DragTolerance;
  90.     property TransparentColor;
  91.   end;
  92. implementation
  93. {$r fcFrmBtn.RES}
  94. var MouseHook : HHOOK;
  95.     HookCount: integer;
  96.     InHook: boolean;
  97. function wwMouseHookProc(nCode: Integer; wParam: Integer; lParam: Integer): LResult; stdcall;
  98. var ac: TWinControl;
  99.     form: TCustomForm;
  100.     ptControl,mouseControl: TControl;
  101.     i: integer;
  102.     imageform: TfcCustomImageForm;
  103.     ClickOrMouseDownAssigned,PtInDragControl:boolean;
  104.     currentpt:TPoint;
  105. begin
  106.   result := CallNextHookEx(MouseHook, nCode, wParam, lParam);
  107.   if InHook then exit;
  108.   with PMouseHookStruct(lParam)^ do
  109.   begin
  110.     if (wParam = WM_LBUTTONDOWN) or (wParam = WM_NCLBUTTONDOWN) then
  111.     begin
  112.        ac:= Screen.ActiveControl;
  113.        if ac=nil then exit;           // 5/24/2002 - Apparently necessary when trayicons are used.
  114.        ac:= GetParentForm(ac);
  115.        if ac=nil then exit;
  116.        form := TCustomForm(ac);
  117. //       mousecontrol:= ac.ControlAtPos(  Point(pt.x, pt.y), True);
  118.        mousecontrol:= FindControl(PMouseHookStruct(lparam)^.hwnd);
  119.        ptinDragControl := (mousecontrol <> nil);  //Initialize to True and set to False when control should not drag form.
  120.        with form do begin
  121.          for i:= 0 to controlcount-1 do
  122.          begin
  123.             if fcIsClass(controls[i].ClassType, 'TfcCustomImageForm') then
  124.             begin
  125.               imageForm:= TfcCustomImageForm(Controls[i]);
  126.               ClickOrMouseDownAssigned := False;
  127.               if Mousecontrol <> nil then begin
  128.                  if (imageform.captionbarcontrol = nil) or (imageform.captionbarcontrol.parent = form) then begin
  129.                     currentpt:= Form.ScreenToClient(pt);
  130.                     ptControl := Form.ControlAtPos(currentpt,True);
  131.                  end
  132.                  else begin
  133.                     currentpt:= imageform.captionbarcontrol.parent.ScreenToClient(pt);
  134.                     ptControl := imageform.captionbarcontrol.parent.controlatpos(currentpt,True);
  135.                  end;
  136.                  if ptControl <> nil then  //Control that was clicked on.  Check if Click or mousedown assigned.
  137.                     ClickOrMouseDownAssigned := Assigned(TButton(ptControl).OnClick) or
  138.                                                 Assigned(TButton(ptControl).OnMouseDown);
  139.                  if (imageform.CaptionBarControl = nil) then begin
  140.                     currentpt:= form.ScreenToClient(pt);
  141.                     ptinDragControl := PtInRect(form.boundsrect,currentpt);
  142.                  end
  143.                  else begin
  144.                     currentpt:= TButton(imageform.CaptionBarControl).ScreenToClient(pt);
  145.                     ptinDragControl := PtInRect(imageform.CaptionBarControl.boundsrect,currentpt);
  146.                  end;
  147.                  if ptinDragControl then
  148.                     ptinDragControl := ((imageform.captionbarcontrol<>nil) and (mousecontrol = imageform.captionbarcontrol.parent));
  149.               end;
  150.               currentpt:= form.ScreenToClient(pt);
  151.               InHook:= True;
  152.               //Check if the caption control is defined.  If so, then check if the caption control was clicked on or if
  153.               //a different control was clicked on in the caption that has an onclick event.  Use cheating cast.
  154.                if ((imageform.CaptionBarControl <> nil) and (not ClickOrMouseDownAssigned) and ptInDragControl) or
  155.                   ((imageform.CaptionBarControl <> nil) and (mouseControl = imageform.CaptionBarControl)) or
  156.                   ((imageform.CaptionBarControl = nil) and (not ClickOrMouseDownAssigned) and (mousecontrol = form)) then begin
  157.                   BringToFront;  //5/24/2002 - Allow clicking on Caption Control to bring form to front.
  158.                   ImageForm.FormMouseDown(mbLeft, [ssleft], currentpt.x, currentpt.y);
  159.                   result := 1;
  160.                end;
  161. //              ImageForm.CaptionBarControl.ControlState:=
  162. //                 ImageForm.CaptionBarControl.ControlState - [cslButtonDown];
  163.               InHook:= False;
  164.             end
  165.          end
  166.        end
  167.     end;
  168.   end;
  169. end;
  170. constructor TfcCustomImageForm.Create(Aowner:TComponent);
  171. begin
  172.   inherited;
  173.   FDragTolerance := 5;
  174.   FRegion := 0;
  175.   Align := alClient;
  176.   FTransparentColor := clNone;
  177. //  FCaptureMessageClass := nil;
  178.   FOptions:= [];
  179.   if not (csDesigning in ComponentState) then
  180.   begin
  181.     if (MouseHook=0) and (HookCount=0) then
  182.        MouseHook := SetWindowsHookEx(WH_MOUSE, @wwMouseHookProc, HINSTANCE, GetCurrentThreadID);
  183.     inc(HookCount);
  184.   end;
  185. end;
  186. destructor TfcCustomImageForm.Destroy;
  187. begin
  188.   if FRegion <> 0 then DeleteObject(FRegion);
  189.   if not (csDesigning in ComponentState) then
  190.   begin
  191.      Dec(HookCount);
  192.      if (HookCount<=0) and (MouseHook<>0) then
  193.      begin
  194.         UnhookWindowsHookEx(MouseHook);
  195.         MouseHook:= 0;
  196.      end;
  197.   end;
  198. //  if FCaptureMessageClass <> nil then FCaptureMessageClass.Free;
  199. //  FCaptureMessageClass:= nil;
  200.   inherited Destroy;
  201. end;
  202. procedure TfcCustomImageForm.DestroyWnd;
  203. begin
  204.   if FRegion <> 0 then
  205.   begin
  206.     SetWindowRgn(GetParentForm(self).Handle, 0, False);
  207.     DeleteObject(FRegion);
  208.     FRegion := 0;
  209.   end;
  210. end;
  211. // 10/26/98 - Added check to use windows setting for dragging of form when UseWindowsDrag is set.
  212. function TfcCustomImageForm.GetDragFullWindows: Boolean;
  213. var s: integer;
  214. begin
  215.   s:= 0;
  216.   if ifUseWindowsDrag in Options then
  217.     SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, Pointer(@s), 0);
  218.   result:= (s<>0);
  219. end;
  220. procedure TfcCustomImageForm.ScaleRegion(xFact, yFact:Single);
  221. var
  222.    size:integer;
  223.    rgndata: pRGNData;
  224. //   stat: integer;
  225.    newregion,existingrgn:HRgn;
  226.    xform:TXForm;
  227. begin
  228.     existingrgn := CreateRectRgn(0,0,1,1);
  229.     GetWindowRgn(GetParentForm(self).handle,existingrgn);
  230.     Size := GetRegionData(existingrgn, 0, nil);
  231.     if Size > 0 then
  232.     begin
  233.       Getmem(RgnData,size);
  234.       try
  235.         GetRegionData(existingrgn, Size, RgnData);
  236.         FillChar(Xform,sizeof(xform),0);
  237.         xform.eM11 := xfact;
  238.         xform.em22 := yfact;
  239.         newRegion := ExtCreateRegion(@xform,size,rgndata^);
  240.         SetWindowRgn(GetParentForm(self).Handle, 0, False);
  241.         if FRegion <> 0 then DeleteObject(FRegion);
  242.         SetWindowRgn(GetParentForm(self).Handle,newRegion,true)
  243.       finally
  244.         FreeMem(RgnData);
  245.         DeleteObject(existingrgn);
  246.       end;
  247.     end;
  248. end;
  249. procedure TfcCustomImageForm.AfterFormWndProc(var Message: TMessage);
  250. var AControl: TControl;
  251.     ClickOrMouseDownAssigned:Boolean;
  252. begin
  253.   if not (csDesigning in componentstate) then
  254.   case Message.Msg of
  255.     WM_DESTROY: DestroyWnd;
  256.     WM_LBUTTONDOWN:  //Needed to capture mouse messages from caption control
  257.       with TWMMouse(Message) do begin
  258.         AControl := Parent.ControlAtPos(Point(XPos, YPos), True);
  259.         //Check if the caption control is defined.  If so, then check if the caption control was clicked on or if
  260.         //a different control was clicked on in the caption that has an onclick event.  Use cheating cast.
  261.         //3/11/99-PYW-Don't Drag if a different control has an OnMouseDown event as well.
  262.         //5/15/2001-PYW-Handle when acontrol =nil.
  263.         if AControl <> nil then
  264.            ClickOrMouseDownAssigned := Assigned(TButton(AControl).OnClick) or
  265.                                        Assigned(TButton(AControl).OnMouseDown)
  266.         else ClickOrMouseDownAssigned:= false;
  267.         //5/10/99-PYW-Checked for click or mousedown event assigned for a control on a caption bar.
  268.         //5/15/2001-PYW-Handle when acontrol is nil.  Allow dragging in this case.
  269.         if ((FCaptionBarControl <> nil) and not ClickOrMouseDownAssigned) or
  270.            ((FCaptionBarControl <> nil) and (AControl = CaptionBarControl)) or
  271.            ((FCaptionBarControl = nil) and (AControl = self))or
  272.            (AControl = nil) then
  273.           FormMouseDown(mbLeft, KeysToShiftState(Keys), XPos, YPos);
  274.       end;
  275.   end;
  276. end;
  277. procedure TfcCustomImageForm.FormMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  278. const SC_DragMove = $F012;
  279. var p: TPoint;
  280.     ParentForm: TCustomForm;
  281. begin
  282. {  if (FCaptionBarControl <> nil) then
  283.     with FCaptionBarControl do
  284.       if not (PtinRect(Rect(Left, Top, Width + Left, Height + Top), Point(x, y))) then
  285.         Exit;}
  286.   if ssLeft in Shift then begin
  287.      ParentForm:= GetParentForm(self);
  288.      if GetDragFullWindows then begin  //4/14/00 - PYW - Use Window system command for dragging instead.
  289.         ReleaseCapture;
  290. //        ParentForm.perform(WM_SysCommand, SC_DragMove, 0);
  291.         //1/8/2002 - Don't use perform.  Use postMessage instead.  More reliable.
  292.         Postmessage(ParentForm.Handle,WM_SysCommand, SC_DragMove, 0);
  293.         exit;
  294.      end;
  295.      if TForm(ParentForm).FormStyle = fsMDIChild then
  296.      begin
  297.         p:= ClientToScreen(Point(x,y));
  298.         p.x:= p.x - ParentForm.left;
  299.         p.y:= p.y - ParentForm.Top;
  300.      end else p := Point(x, y);
  301.      MouseLoop(p.x, p.y)
  302.   end
  303.   else SendMessage(Parent.Handle, WM_SYSCOMMAND, SC_KEYMENU, 0);
  304. end;
  305. procedure TfcCustomImageForm.Notification(AComponent: TComponent; Operation: TOperation);
  306. begin
  307.   inherited;
  308.   if (Operation = opRemove) and (AComponent = FCaptionBarControl) then
  309.     FCaptionBarControl := nil;
  310. end;
  311. procedure TfcCustomImageForm.MouseLoop(X, Y: Integer);
  312. var ACursor: TPoint;
  313.     Msg: TMsg;
  314.     FirstTime: Boolean;
  315.     OriginalRect, FocusRect: TRect;
  316. begin
  317.   FirstTime := True;
  318.   with Parent do OriginalRect := Rect(Left, Top, Left + Width, Top + Height);
  319.   FocusRect := Rect(0, 0, 0, 0);
  320.   with GetParentForm(self) do
  321.   begin
  322.     SetCapture(Handle);
  323.     try
  324.       while GetCapture = Handle do
  325.       begin
  326.         GetCursorPos(ACursor);
  327.         case Integer(GetMessage(Msg, 0, 0, 0)) of
  328.           -1: Break;
  329.           0: begin
  330.             PostQuitMessage(Msg.WParam);
  331.             Break;
  332.           end;
  333.         end;
  334.         case Msg.Message of
  335.           WM_MOUSEMOVE: MouseLoop_MouseMove(X, Y, ACursor, FirstTime, FocusRect, OriginalRect);
  336.           WM_LBUTTONUP: begin
  337.             MouseLoop_MouseUp(X, Y, ACursor, OriginalRect, FocusRect);
  338.             TranslateMessage(Msg);   // So OnMouseUp fires
  339.             DispatchMessage(Msg);
  340.             if GetCapture = Handle then ReleaseCapture;
  341.           end;
  342.           else begin // 12/07/98 - Following code needed to prevent eating of messages.
  343.             TranslateMessage(Msg);
  344.             DispatchMessage(Msg);
  345.           end;
  346.         end;
  347.       end;
  348.     finally
  349.       if GetCapture = Handle then ReleaseCapture;
  350.     end;
  351.   end;
  352. end;
  353. procedure TfcCustomImageForm.MouseLoop_MouseMove(X, Y: Integer; ACursorPos: TPoint;
  354.   var FirstTime: Boolean; var FocusRect: TRect; OriginalRect:TRect);
  355. var DC: HDC;
  356.     p: TPoint;
  357.     Msg: TMsg;
  358.     PaintFocusRect: TRect;
  359. begin
  360.   p := ClientToScreen(Point(x, y));
  361.   if (Abs(ACursorPos.X - p.x) <= DragTolerance) and
  362.      (Abs(ACursorPos.Y - p.y) <= DragTolerance) then
  363.     Exit;
  364.   with GetParentForm(self) do
  365.   begin
  366.     // 10/26/98 - Added Check For Full Windows Drag option on ImageForm.
  367.     if not GetDragFullWindows then
  368.     begin
  369.       DC := GetDC(0);
  370.       try
  371.         if FirstTime then
  372.         begin
  373.           DraggingForm := True;
  374.         end else begin
  375.           DrawFocusRect(DC, LastFocusRect); { Hide previous focus rect }
  376.         end;
  377.         FocusRect := Rect(ACursorPos.x - x, ACursorPos.y - y, ACursorPos.x - x + Width, ACursorPos.y - y + Height);
  378.         if TForm(GetParentForm(self)).FormStyle = fsMDIChild then
  379.         begin
  380.            PaintFocusRect:= FocusRect;
  381.            PaintFocusRect.Left:= PaintFocusRect.Left + ClientToScreen(Point(0,0)).x - Left;
  382.            PaintFocusRect.Top:= PaintFocusRect.Top+ ClientToScreen(Point(0,0)).y - Top;
  383.            PaintFocusRect.Right:= PaintFocusRect.Left+ Width;
  384.            PaintFocusRect.Bottom:= PaintFocusRect.Top + Height;
  385.         end
  386.         else begin
  387.            PaintFocusRect:= FocusRect;
  388.         end;
  389.         DrawFocusRect(DC, PaintFocusRect);
  390.         LastFocusRect:= PaintFocusRect;
  391.         FirstTime:= False;
  392.       finally
  393.         ReleaseDC(0, DC);
  394.       end;
  395.     end else begin //10/26/98 - Drag Full Windows.
  396.       DraggingForm := True;
  397.       sleep(10);
  398.       while PeekMessage(Msg, Handle, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE) do;
  399.       GetCursorPos(ACursorPos);
  400.       SetWindowPos(Handle, 0, ACursorPos.x - x, ACursorPos.y - y, 0, 0,
  401.            SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
  402.     end;
  403.   end;
  404. end;
  405. procedure TfcCustomImageForm.MouseLoop_MouseUp(X, Y: Integer; ACursorPos: TPoint;
  406.   OriginalRect, FocusRect: TRect);
  407. var DC: HDC;
  408. begin
  409.   if not DraggingForm then Exit;
  410.   DraggingForm:= False;
  411.   with GetParentForm(self) do
  412.   begin
  413.     if not GetDragFullWindows then
  414.     begin
  415.       DC := GetDC(0);
  416.       try
  417.          DrawFocusRect(DC, LastFocusRect);
  418. //        if TForm(GetParentForm(self)).FormStyle = fsMDIChild then
  419. //           Windows.DrawFocusRect(DC, LastFocusRect)
  420. //        else
  421. //           Windows.DrawFocusRect(DC, FocusRect);
  422.       finally
  423.         ReleaseDC(0, DC);
  424.       end;
  425.       SetWindowPos(Handle, 0, FocusRect.Left, FocusRect.top, 0, 0, SWP_NOZORDER {or SWP_NOMOVE }or
  426.         SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
  427. //      RedrawWindow(GetDesktopWindow, @OriginalRect, 0, RDW_UPDATENOW or
  428. //        RDW_ALLCHILDREN or RDW_INVALIDATE);
  429.       if GetCapture = Handle then ReleaseCapture;
  430.     end;
  431.   end;
  432. end;
  433. procedure TfcCustomImageForm.ReadRegions(Reader: TStream);
  434. var
  435.    rgnsize:integer;
  436.    rgndata: pRGNData;
  437. begin
  438.   Reader.Read(RgnSize, 4);
  439.   if RgnSize <> 0 then
  440.   begin
  441.     GetMem(RgnData, RgnSize);
  442.     try
  443.       Reader.Read(RgnData^,rgnSize);
  444.       FRegion := ExtCreateRegion(nil, RgnSize, RgnData^);
  445.       if not (csDesigning in ComponentState) and (FRegion<>0) then
  446.         SetWindowRgn(parent.handle,Fregion,true)
  447.     finally
  448.       FreeMem(RgnData);
  449.     end;
  450.   end else begin
  451.     FRegion := 0;
  452.     ApplyBitmapRegion;
  453.   end
  454. end;
  455. procedure TfcCustomImageForm.WriteRegions(Writer: TStream);
  456. var
  457.    size:integer;
  458.    rgndata: pRGNData;
  459.    stat: integer;
  460. begin
  461.   ApplyBitmapRegion;
  462.   if (FRegion <> 0) then
  463.   begin
  464.     Size := GetRegionData(FRegion, 0, nil);
  465.     Writer.Write(Size, SizeOf(Size));
  466.     if Size > 0 then
  467.     begin
  468.       Getmem(RgnData,size);
  469.       try
  470.         Stat := GetRegionData(FRegion, Size, RgnData);
  471.         if Stat > 0 then Writer.Write(RgnData^, Size);
  472.       finally
  473.         FreeMem(RgnData);
  474.       end;
  475.     end;
  476.   end else begin
  477.     Size := 0;
  478.     Writer.Write(Size, SizeOf(Size));
  479.   end;
  480. end;
  481. procedure TfcCustomImageForm.DefineProperties(Filer: TFiler);
  482. begin
  483.   inherited DefineProperties(Filer);
  484.   Filer.DefineBinaryProperty('RegionData', ReadRegions, WriteRegions, True);
  485. end;
  486. procedure TfcCustomImageForm.SetParent(Value: TWinControl);
  487. begin
  488.   if (Value <> nil) and not (Value is TCustomForm) then
  489.     Value := GetParentForm(Value);
  490.   inherited SetParent(value);
  491.   if Parent <> nil then
  492.     SetWindowLong(Parent.Handle, GWL_STYLE,
  493.       GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  494.   if Value<>Nil then TForm(Value).BorderStyle:= bsNone;
  495. (*
  496.   if (Value<>nil) and { 5/13/99 }
  497.      (FCaptureMessageClass = nil) and not (csDesigning in ComponentState) then
  498.   begin
  499.     FCaptureMessageClass := TfcCaptureMessageClass.Create(Owner);
  500.     FCaptureMessageClass.WindowHandle := Value.Handle;
  501.     FCaptureMessageClass.Enabled := True;
  502.     FCaptureMessageClass.OnWndProc := AfterFormWndProc;
  503.   end;
  504. *)
  505. end;
  506. procedure TfcCustomImageForm.ApplyBitmapRegion;
  507. //var tempBitmap: TBitmap;
  508. begin
  509.   SetWindowRgn(GetParentForm(self).Handle, 0, False);
  510.   if FRegion <> 0 then DeleteObject(FRegion);
  511. { This would work for JPG, but JPG would leave non-transparent areas where the intention
  512.   is to be transparent. Thus we do not support JPG }
  513. {  tempBitmap:= TBitmap.create;
  514.   tempBitmap.assign(picture.graphic);
  515.   FRegion := fcCreateRegionFromBitmap(tempbitmap, tempbitmap.canvas.pixels[0,0]);
  516.   tempBitmap.free;
  517. }
  518.   FRegion := fcCreateRegionFromBitmap(Picture.Bitmap, GetTransparentColor);
  519.   if not (csDesigning in ComponentState) then
  520.      SetWindowRgn(GetParentForm(self).Handle, FRegion, True);
  521. end;
  522. function TfcCustomImageForm.GetPicture: TPicture;
  523. begin
  524.   result := inherited Picture;
  525. end;
  526. function TfcCustomImageForm.GetTransparentColor: TColor;
  527. begin
  528.    result := FTransparentColor;
  529.    if FTransparentColor=clNone then
  530.    begin
  531.       if (Picture.Bitmap<>Nil) then
  532.          result:= Picture.Bitmap.Canvas.Pixels[0,Picture.Bitmap.height-1]
  533.    end
  534.    else result:= FTransparentColor;
  535. end;
  536. procedure TfcCustomImageForm.SetPicture(Value: TPicture);
  537. begin
  538.   inherited Picture := Value;
  539.   if (Value <> nil) and (Value.Width > 0) and (Value.height > 0) then
  540.   begin
  541.     (Parent as TCustomForm).ClientWidth := Value.Width;
  542.     (Parent as TCustomForm).ClientHeight := Value.Height;
  543.   end;
  544.   Invalidate;
  545. end;
  546. procedure TfcCustomImageForm.SetOptions(Value: TFcImageFormOptions);
  547. begin
  548.   FOptions:= Value;
  549. end;
  550. procedure TfcCustomImageForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  551. begin
  552.   inherited;
  553.   // Added to support autosizing of the form
  554.   if AutoSize then with GetParentForm(self) do
  555.   begin
  556.     ClientWidth := AWidth;
  557.     ClientHeight := AHeight;
  558.   end;
  559. end;
  560. procedure TfcCustomImageForm.DrawFocusRect(DC: HDC; FocusRect: TRect);
  561. begin
  562.    Windows.DrawFocusRect(DC, FocusRect);
  563.    InflateRect(FocusRect, -1, -1);
  564.    Windows.DrawFocusRect(DC, FocusRect);
  565.    InflateRect(FocusRect, -1, -1);
  566.    Windows.DrawFocusRect(DC, FocusRect);
  567. end;
  568. procedure TfcCustomImageForm.SetCaptionBarControl(Value: TControl);
  569. begin
  570.    if Value<>FCaptionBarControl then
  571.    begin
  572. //      if CaptionBarControl<>nil then
  573. //         CaptionBarControl.WindowProc:= FLastCaptionWindowProc;
  574.       FCaptionBarControl:= Value;
  575. //      if (CaptionBarControl<>nil) and (not (csDesigning in componentstate)) then
  576. //      begin
  577. //         FLastCaptionWindowProc:= CaptionBarControl.WindowProc;
  578. //         CaptionBarControl.WindowProc:= CaptionWindowProc;
  579. //      end
  580.    end
  581. end;
  582. procedure TfcCustomImageForm.WndProc(var Message: TMessage);
  583. begin
  584.   inherited;
  585. end;
  586. procedure TfcCustomImageForm.Paint;
  587. begin
  588.    if ifNoPaletteDither in Options then
  589.       BasePatch[0]:= True;
  590.    inherited;
  591. end;
  592. end.