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

Delphi控件源码

开发平台:

Delphi

  1. unit fctpanel;
  2. {
  3. //
  4. // Components : TwwCustomTransparentPanel
  5. //              Supporting component for transparent navigator
  6. //
  7. // Copyright (c) 1999-2001 by Woll2Woll Software
  8. //
  9. }
  10. {$i wwIfDef.pas}
  11. interface
  12. uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  13.   CommCtrl, StdCtrls, Buttons, ExtCtrls;
  14. type
  15.   TfcCustomPanel = class(TCustomGroupBox)
  16.   private
  17.     InPaint: boolean;
  18.     fb2: TBitmap;
  19.     procedure WMEraseBkGnd(var Message:TWMEraseBkGnd); message WM_ERASEBKGND;
  20.     procedure WMMove(var Message: TWMMove); Message WM_Move;
  21.     procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  22.   protected
  23.     // Property Storage Variables
  24.     FTransparent: Boolean;
  25.     FInEraseBkGnd: Boolean;
  26.     procedure CreateWnd; override;
  27.     procedure ClipChildren(Value: Boolean);
  28.     // Property Access Methods
  29.     procedure SetTransparent(Value: Boolean); virtual;
  30.     // Overridden methods
  31.     procedure AlignControls(AControl: TControl; var Rect: TRect); override;
  32.     procedure CreateParams(var Params: TCreateParams); override;
  33.     procedure Paint; override;
  34.     procedure SetParent(AParent:TWinControl); override;
  35.     function IsTransparent: boolean; virtual;
  36.     function GetImage(Control: TWinControl): TBitmap;
  37. //    procedure PaintTo(DC: HDC; X, Y: Integer); override;
  38.   public
  39.     BasePatch: Variant;
  40.     fb: TBitmap;
  41.     constructor Create(AOwner: TComponent); override;
  42.     destructor Destroy; override;
  43.     procedure Invalidate; override;
  44.     procedure RegionalizePanel;
  45.     property Transparent: Boolean read FTransparent write SetTransparent default False;
  46.   end;
  47.   TfcPanel = class(TfcCustomPanel)
  48.   published
  49.     property Align;
  50.     property BevelInner;
  51.     property BevelOuter;
  52.     property BevelWidth;
  53. //    property BorderStyle;
  54.     property BorderWidth;
  55.     property Color;
  56.     property Transparent;
  57.   end;
  58. implementation
  59. constructor TfcCustomPanel.Create(AOwner: TComponent);
  60. begin
  61.   inherited Create(AOwner);
  62.   ControlStyle := ControlStyle;
  63.   FTransparent := False;
  64.   BevelOuter := bvRaised;
  65.   fb2:= TBitmap.create;
  66. end;
  67. destructor TfcCustomPanel.Destroy;
  68. begin
  69.   fb.free;
  70.   inherited Destroy;
  71. end;
  72. procedure TfcCustomPanel.CreateParams(var Params: TCreateParams);
  73. begin
  74.   inherited CreateParams(Params);
  75.   if IsTransparent then
  76.      Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
  77. end;
  78. procedure TfcCustomPanel.CreateWnd;
  79. //var origstyle, exStyle: longint;
  80. begin
  81.   inherited CreateWnd;
  82. //  if fb=nil then
  83. //     fb:= GetParentForm(self).GetFormImage;
  84. {  if FTransparent and (not IsTransparent) then
  85.   begin
  86.      OrigStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);
  87.      exStyle:= OrigStyle and not WS_EX_TRANSPARENT;
  88.      if origStyle<>exStyle then
  89.         Windows.SetWindowLong(handle, GWL_EXSTYLE, exStyle);
  90.   end
  91. }
  92. end;
  93. procedure TfcCustomPanel.AlignControls(AControl: TControl; var Rect: TRect);
  94. begin
  95.   inherited;
  96.   if IsTransparent then Invalidate;
  97. end;
  98. procedure TfcCustomPanel.Paint;
  99. var
  100.   ARect: TRect;
  101.   TopColor, BottomColor: TColor;
  102.   r: TRect;
  103.   p: TControl;
  104.   procedure AdjustColors(Bevel: TPanelBevel);
  105.   begin
  106.     TopColor := clBtnHighlight;
  107.     if Bevel = bvLowered then TopColor := clBtnShadow;
  108.     BottomColor := clBtnShadow;
  109.     if Bevel = bvLowered then BottomColor := clBtnHighlight;
  110.   end;
  111. begin
  112.   inherited;
  113.   exit;
  114.   if InPaint then //(csPaintCopy in ControlState) {InPaint} then
  115.   begin
  116. //     screen.cursor:= crarrow;
  117.     // save copy of bitmap
  118.      r:= ClientRect;
  119.      fb2.width:= clientwidth;
  120.      fb2.height:= clientheight;
  121.      fb2.Canvas.CopyRect(ClientRect, {fb.}Canvas, r);
  122.      exit;
  123.   end;
  124.   InPaint:= True;
  125.   if fb=nil then
  126. //     fb:= GetParentForm(self).GetFormImage;
  127.      fb:= GetImage(GetParentForm(self));
  128.   // Get position relative to form
  129.   r:= Rect(Left, Top, Left+width, 0);
  130.   p:= parent;
  131.   while not (p is TCustomForm) do begin
  132.      r.left:= r.Left + p.left;
  133.      r.top := r.top + p.top;
  134.      p:= p.parent;
  135.      if p=nil then break;
  136.   end;
  137.   r:= Rect(r.left, r.top, r.left + width, r.top + height);
  138. //  r:= Rect(0, 0, Width, Height);//r.left, r.top, r.left + width, r.top + height);
  139. //  Canvas.CopyRect(ClientRect, fb.Canvas, r);
  140.   Canvas.CopyRect(ClientRect, fb.Canvas, ClientRect);
  141. //  Canvas.CopyRect(ClientRect, fb2.Canvas, ClientRect);
  142. //  fb.SaveToFile('m:transfertemp.bmp');
  143. //  exit;
  144. //  CopyRect(
  145.   if IsTransparent then
  146.   begin
  147.     inherited;
  148.     ARect := GetClientRect;
  149.     // For BevelOuter property
  150.     if BevelOuter <> bvNone then
  151.     begin
  152.       AdjustColors(BevelOuter);
  153.       Frame3D(Canvas, ARect, TopColor, BottomColor, BevelWidth);
  154.     end;
  155.     // For BorderWidth property
  156.     Frame3D(Canvas, ARect, Color, Color, BorderWidth);
  157.     // For BevelInner Property
  158.     if BevelInner <> bvNone then
  159.     begin
  160.       AdjustColors(BevelInner);
  161.       Frame3D(Canvas, ARect, TopColor, BottomColor, BevelWidth);
  162.     end;
  163. //    Update;
  164.   end else inherited;
  165. //  fb.free;
  166.   InPaint:= False;
  167. end;
  168. procedure TfcCustomPanel.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  169. begin
  170.   if {not (csPaintCopy in ControlSTate)
  171.      and }IsTransparent{ and not (Parent is TCustomGrid) }then
  172.   begin
  173. //      wwInvalidateTransparentArea(self);
  174.       Message.Result := 1
  175.   end
  176.   else inherited;
  177. end;
  178. procedure TfcCustomPanel.WMMove(var Message: TWMMove);
  179. begin
  180.   inherited;
  181.   if IsTransparent then Invalidate;
  182. end;
  183. procedure TfcCustomPanel.ClipChildren(Value: Boolean);
  184. begin
  185.   if (Parent <> nil) then
  186.   begin
  187.     if Value then
  188.       SetWindowLong(Parent.Handle, GWL_STYLE,
  189.         GetWindowLong(Parent.Handle, GWL_STYLE) or WS_CLIPCHILDREN)
  190.     else
  191.       SetWindowLong(Parent.Handle, GWL_STYLE,
  192.         GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  193.     end;
  194. end;
  195. procedure TfcCustomPanel.SetParent(AParent:TWinControl);
  196. begin
  197.   inherited SetParent(AParent);
  198.   // Without this, the panel would be transparent indeed, but you would see through the form into the background apps
  199.   ClipChildren(not FTransparent);
  200. end;
  201. procedure TfcCustomPanel.Invalidate;
  202. var TempRect:TRect;
  203.     i: Integer;
  204.     r: TRect;
  205. begin
  206.   if IsTransparent and (Parent <> nil) and Parent.HandleAllocated then
  207.   begin
  208.     GetUpdateRect(Handle, r, False);
  209.     tempRect:= BoundsRect;
  210.     tempRect:= Rect(TempRect.Left + r.Left, TempRect.Top + r.Top,
  211.                     TempRect.Left + r.Right, TempRect.Top + R.Bottom);
  212.     InvalidateRect(Parent.Handle, @TempRect, False);
  213. //    r:= ClientRect;
  214.     if (r.left=r.right) and (r.top=r.bottom) then
  215.       InvalidateRect(Handle, nil, False)
  216.     else InvalidateRect(Handle, @r, False);
  217. //    Parent.Update; { 8/5/99 - RSW - Calling this causes problem with TImage or TfcImager not being painted }
  218.                      { This happened when you enter page/down in a scrollable region }
  219.     for i := 0 to ControlCount - 1 do
  220.     begin
  221. //        if PtInRect(r, Point(Controls[i].Left, Controls[i].Top)) or
  222. //           PtInRect(r, Point(Controls[i].Left+Controls[i].Width, Controls[i].Left+Controls[i].Height)) then
  223. //           Controls[i].Invalidate;
  224.     end
  225.   end
  226.   else inherited Invalidate;
  227. end;
  228. procedure TfcCustomPanel.SetTransparent(Value: Boolean);
  229. begin
  230.   if FTransparent <> Value then
  231.   begin
  232.     FTransparent := Value;
  233.     if IsTransparent then ControlStyle := ControlStyle - [csOpaque]
  234.     else begin
  235.        ControlStyle := ControlStyle + [csOpaque];
  236.     end;
  237.     if not (csLoading in ComponentState) and HandleAllocated then { 4/30/99 }
  238.       Invalidate;
  239.       ClipChildren(not Value);
  240.       RecreateWnd;
  241.   end;
  242. end;
  243. Function TfcCustomPanel.IsTransparent: boolean;
  244. begin
  245.    result:= FTransparent and not (csDesigning in ComponentState);
  246. //   if result and (parent<>nil) and fcIsClass(parent.classtype, 'TCustomGrid') then
  247. //      result:=false;
  248. end;
  249. procedure TfcCustomPanel.WMPaint(var Message: TWMPaint);
  250. begin
  251. //   if InPaint then
  252. //   begin
  253. //      DefaultHandler(Message);
  254. //      message.result:=1;
  255. //      exit;
  256. //   end;
  257. //   inPaint:= True;
  258.    inherited;
  259. //   InPaint:= False;
  260. end;
  261. {procedure TfcCustomPanel.PaintTo(DC: HDC; X, Y: Integer);
  262. begin
  263.    if InPaint then exit;
  264.    inherited PaintTo(DC, X,Y);
  265. end;
  266. }
  267. function TfcCustomPanel.GetImage(Control: TWinControl): TBitmap;
  268. var Ofs: integer;
  269.     r, ARect: TRect;
  270.   p: TControl;
  271. procedure wwPaintTo(DC: HDC; X, Y: Integer);
  272. var
  273.   I, EdgeFlags, BorderFlags, SaveIndex: Integer;
  274.   R: TRect;
  275. begin
  276.       Control.ControlState:= Control.ControlState + [csPaintCopy] ;
  277.   SaveIndex := SaveDC(DC);
  278.   MoveWindowOrg(DC, X, Y);
  279.   IntersectClipRect(DC, 0, 0, Control.Width, Control.Height);
  280.   BorderFlags := 0;
  281.   EdgeFlags := 0;
  282. {  if GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_CLIENTEDGE <> 0 then
  283.   begin
  284.     EdgeFlags := EDGE_SUNKEN;
  285.     BorderFlags := BF_RECT or BF_ADJUST
  286.   end else
  287.   if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
  288.   begin
  289.     EdgeFlags := BDR_OUTER;
  290.     BorderFlags := BF_RECT or BF_ADJUST or BF_MONO;
  291.   end;
  292.   if BorderFlags <> 0 then
  293.   begin
  294.     SetRect(R, 0, 0, Control.Width, Control.Height);
  295.     DrawEdge(DC, R, EdgeFlags, BorderFlags);
  296.     MoveWindowOrg(DC, R.Left, R.Top);
  297.     IntersectClipRect(DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top);
  298.   end;
  299. }
  300.   Perform(WM_ERASEBKGND, DC, 0);
  301.   Control.Perform(WM_PAINT, DC, 0);
  302. {      with Control do begin
  303.          for I := 0 to ControlCount - 1 do
  304.          begin
  305.             if (Controls[i] is TWinControl) and (Controls[i]<>self) then
  306.               with TWinControl(Controls[I]) do
  307.                  if Visible then
  308.                     PaintTo(dc, Left, Top);
  309.          end
  310.       end;
  311. }
  312. {  if FWinControls <> nil then
  313.     for I := 0 to FWinControls.Count - 1 do
  314.       with TWinControl(FWinControls[I]) do
  315.         if Visible then PaintTo(DC, Left, Top);}
  316.   RestoreDC(DC, SaveIndex);
  317.   Control.ControlState:= Control.ControlState - [csPaintCopy];
  318. end;
  319. {    function ContainsControl(ParentControl, ChildControl: TControl): boolean;
  320.     var i: integer;
  321.     begin
  322.        result:= FAlse;
  323.        with ParentControl do begin
  324.           for i:= 0 to ControlCount-1 do begin
  325.              if Controls[i]=ChildControl then
  326.              begin
  327.                 result:= True;
  328.                 exit;
  329.              end;
  330.              result:= ContainsControl(Controls[i], ChildControl);
  331.           end
  332.        end
  333.     end;
  334. }
  335.     procedure PaintControl(Control: TWinControl;
  336.                            Canvas: TCanvas; ARect: TRect);
  337.     var i: integer;
  338.         SaveIndex: integer;
  339.         rd: TRect;
  340.     begin
  341.       Control.ControlState:= Control.ControlState + [csPaintCopy] ;
  342.       SaveIndex := SaveDC(Canvas.Handle);
  343.       MoveWindowOrg(Canvas.Handle, ARect.Left, ARect.Top);
  344. //      IntersectClipRect(Canvas.Handle, 0, 0, ARect.Right-ARect.Left,
  345. //         ARect.Bottom - ARect.Top);
  346.       IntersectClipRect(Canvas.Handle, 0, 0, Control.Width, Control.Height);
  347.       Control.Perform(WM_PAINT, Canvas.Handle, 0);
  348. //                      ARect.Bottom - ARect.Top);
  349.       // Don't paint children of inspector, as it already does this on its own
  350.       with Control do begin
  351.          for I := 0 to ControlCount - 1 do
  352.          begin
  353.             if (Controls[i] is TWinControl) and
  354.               (not TWinControl(Controls[i]).ContainsControl(self)) and
  355.               (Controls[i]<>self) and
  356.               (IntersectRect(rd, self.BoundsRect, Controls[i].BoundsRect)) then
  357.               with TWinControl(Controls[I]) do
  358.                  if Visible then
  359.                     PaintTo(Canvas.Handle, Left, Top);
  360.          end
  361.       end;
  362.       RestoreDC(Canvas.Handle, SaveIndex);
  363.       Control.ControlState:= Control.ControlState - [csPaintCopy];
  364.     end;
  365. begin
  366.   Result := TBitmap.Create;
  367.   try
  368.     Result.Width := ClientWidth;
  369.     Result.Height := ClientHeight;
  370.     Result.Canvas.Brush := Brush;
  371.     Result.Canvas.FillRect(ClientRect);
  372.     Result.Canvas.Lock;
  373.     try
  374.       if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
  375.         Ofs := -1  // Don't draw form border
  376.       else
  377.         Ofs := 0;  // There is no border
  378.       ARect:= Rect(0, 0,  ClientWidth, ClientHeight);
  379. //      ARect:= Rect(-GetParentForm(self).clientWidth+self.Left,
  380. //                   -GetParentForm(self).ClientHeight+self.Top,
  381.       ARect:= Rect(-self.Left,
  382.                    -self.Top,
  383.                    self.Width, self.Height);
  384.       ARect.Right:= ARect.Left + self.width;
  385.       ARect.Bottom:= ARect.Top + self.height;
  386.       r:= Rect(Left, Top, Left+width, 0);
  387.       p:= parent;
  388.       while not (p is TCustomForm) do begin
  389.          r.left:= r.Left + p.left;
  390.          r.top := r.top + p.top;
  391.          p:= p.parent;
  392.          if p=nil then break;
  393.       end;
  394.       ARect:= Rect(-r.left, -r.top, 0, 0);
  395.       ARect.Right:= ARect.Left + self.width;
  396.       ARect.Bottom:= ARect.Top + self.height;
  397. //      wwPaintTo(Result.Canvas.Handle, ofs, ofs);
  398.       PaintControl(Control, Result.Canvas, ARect);
  399.     finally
  400.       Result.Canvas.Unlock;
  401.     end;
  402.   except
  403.     Result.Free;
  404.     raise;
  405.   end;
  406. end;
  407. procedure TfcCustomPanel.RegionalizePanel;
  408. var i,j:integer;
  409.     tmprgn,cliprgn:HRgn;
  410.     r:TRect;
  411. begin
  412.   cliprgn := CreateRectRgn(0,0,0,0);
  413.   for i:=0 to Controlcount-1 do begin
  414.      if Controls[i] is TWinControl then begin
  415.         r := Controls[i].BoundsRect;
  416.         tmprgn := CreateRectRgn(r.Left,r.Top,r.Right,R.Bottom);
  417.         try
  418.           j:= GetWindowRgn(TWinControl(Controls[i]).handle,tmprgn);
  419.           if j > 0 then begin
  420.              OffsetRgn(tmprgn,Controls[i].Left,Controls[i].Top);
  421.           end;
  422.           CombineRgn(cliprgn,cliprgn,tmprgn,RGN_OR);
  423.         finally
  424.           DeleteObject(tmprgn);
  425.         end;
  426.      end
  427.      else begin
  428.         r := Controls[i].BoundsRect;
  429.         tmprgn := CreateRectRgn(r.Left,r.Top,r.Right,R.Bottom);
  430.         CombineRgn(cliprgn,cliprgn,tmprgn,RGN_OR);
  431.      end;
  432.   end;
  433.   SetWindowRgn(Handle,cliprgn,true);
  434.   DeleteObject(cliprgn);
  435. end;
  436. end.