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

Delphi控件源码

开发平台:

Delphi

  1. unit fcClearPanel;
  2. interface
  3. uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  4.   CommCtrl, StdCtrls, Buttons, ExtCtrls, fcCommon;
  5. type
  6.   TfcCustomTransparentPanel = class(TCustomPanel)
  7.   private
  8.     procedure WMEraseBkGnd(var Message:TWMEraseBkGnd); message WM_ERASEBKGND;
  9.     procedure WMMove(var Message: TWMMove); Message WM_Move;
  10.   protected
  11.     // Property Storage Variables
  12.     FTransparent: Boolean;
  13.     FInEraseBkGnd: Boolean;
  14.     procedure ClipChildren(Value: Boolean);
  15.     // Property Access Methods
  16.     procedure SetTransparent(Value: Boolean); virtual;
  17.     // Overridden methods
  18.     procedure AlignControls(AControl: TControl; var Rect: TRect); override;
  19.     procedure CreateParams(var Params: TCreateParams); override;
  20.     procedure CreateWnd; override;
  21.     procedure Paint; override;
  22.     procedure SetParent(AParent:TWinControl); override;
  23.     function IsTransparent: boolean; virtual;
  24.   public
  25.     BasePatch: Variant;
  26.     constructor Create(AOwner: TComponent); override;
  27.     procedure Invalidate; override;
  28.     property Transparent: Boolean read FTransparent write SetTransparent;
  29.   end;
  30.   TfcTransparentPanel = class(TfcCustomTransparentPanel)
  31.   published
  32.     property Align;
  33.     property BevelInner;
  34.     property BevelOuter;
  35.     property BevelWidth;
  36.     property BorderStyle;
  37.     property BorderWidth;
  38.     property Color;
  39.     property Transparent;
  40.   end;
  41. //  procedure Register;
  42. implementation
  43. {
  44. constructor TfcCustomTransparentPanel.Create(AOwner: TComponent);
  45. begin
  46.   inherited;
  47.   ControlStyle := ControlStyle + [csAcceptsControls];
  48. end;
  49. procedure TfcCustomTransparentPanel.AlignControls(AControl: TControl; var Rect: TRect);
  50. begin
  51.   inherited;
  52.   if AControl is TGraphicControl then Invalidate;
  53. end;
  54. procedure TfcCustomTransparentPanel.Paint;
  55. var i: Integer;
  56. begin
  57.   SetWindowLong(Parent.Handle, GWL_STYLE,
  58.     GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  59.   for i := 0 to ControlCount - 1 do
  60.     if Controls[i] is TWinControl then
  61.       InvalidateRect((Controls[i] as TWinControl).Handle, nil, False);
  62. end;
  63. procedure TfcCustomTransparentPanel.WMEraseBkgnd(var Message: TWMEraseBkGnd);
  64. var DC: HDC;
  65.     r: TRect;
  66.     Rgn, TmpRgn: HRGN;
  67. begin
  68.   if FInEraseBkGnd then Exit;
  69.   FInEraseBkGnd := True;
  70.   Message.result := 1;
  71. {  if Parent <> nil then
  72.   begin
  73.     Rgn := CreateRectRgn(0, 0, Width, Height);
  74.     TmpRgn := fcGetChildRegions(self);
  75.     CombineRgn(Rgn, Rgn, TmpRgn, RGN_DIFF);
  76.     DeleteObject(TmpRgn);
  77.     OffsetRgn(Rgn, Left, Top);
  78.     InvalidateRgn(Parent.Handle, Rgn, False);
  79.     Parent.Update;
  80.     DeleteObject(Rgn);
  81.     DC := GetDC(Parent.Handle);
  82.     BitBlt(Message.DC, 0, 0, Width, Height, DC, Left, Top, SRCCOPY);
  83.     ReleaseDC(Parent.Handle, DC);
  84.   end;
  85.   FInEraseBkGnd := False;
  86. end;
  87. }constructor TfcCustomTransparentPanel.Create(AOwner: TComponent);
  88. begin
  89.   inherited Create(AOwner);
  90.   ControlStyle := ControlStyle - [csOpaque, csSetCaption];
  91.   FTransparent := True;
  92.   BevelOuter := bvRaised;
  93. end;
  94. procedure TfcCustomTransparentPanel.CreateParams(var Params: TCreateParams);
  95. begin
  96.   inherited CreateParams(Params);
  97.   if IsTransparent then Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
  98. end;
  99. procedure TfcCustomTransparentPanel.CreateWnd;
  100. begin
  101.   inherited;
  102. end;
  103. procedure TfcCustomTransparentPanel.AlignControls(AControl: TControl; var Rect: TRect);
  104. begin
  105.   inherited;
  106.   if IsTransparent then Invalidate;
  107. end;
  108. procedure TfcCustomTransparentPanel.Paint;
  109. var
  110.   ARect: TRect;
  111.   TopColor, BottomColor: TColor;
  112.   procedure AdjustColors(Bevel: TPanelBevel);
  113.   begin
  114.     TopColor := clBtnHighlight;
  115.     if Bevel = bvLowered then TopColor := clBtnShadow;
  116.     BottomColor := clBtnShadow;
  117.     if Bevel = bvLowered then BottomColor := clBtnHighlight;
  118.   end;
  119. begin
  120.   if IsTransparent then
  121.   begin
  122.     ARect := GetClientRect;
  123.     // For BevelOuter property
  124.     if BevelOuter <> bvNone then
  125.     begin
  126.       AdjustColors(BevelOuter);
  127.       Frame3D(Canvas, ARect, TopColor, BottomColor, BevelWidth);
  128.     end;
  129.     // For BorderWidth property
  130.     Frame3D(Canvas, ARect, Color, Color, BorderWidth);
  131.     // For BevelInner Property
  132.     if BevelInner <> bvNone then
  133.     begin
  134.       AdjustColors(BevelInner);
  135.       Frame3D(Canvas, ARect, TopColor, BottomColor, BevelWidth);
  136.     end;
  137.     Update;
  138.   end else inherited;
  139. end;
  140. procedure TfcCustomTransparentPanel.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  141. //var r: TRect;
  142. begin
  143. //  inherited;
  144.   if IsTransparent then Message.Result := 1;
  145. {  if not InEraseBK and (csDesigning in ComponentState) and FTransparent then
  146.   begin
  147.     InEraseBK := True;
  148.     r := Rect(Left, Top, Left + Width, Top + Height);
  149.     InvalidateRect(Parent.Handle, @r, True);
  150.     Parent.Update;
  151.     Invalidate;
  152.     Update;
  153. //    InEraseBK := False;
  154.   end;}
  155. end;
  156. procedure TfcCustomTransparentPanel.WMMove(var Message: TWMMove);
  157. begin
  158.   inherited;
  159.   if IsTransparent then Invalidate;
  160. end;
  161. procedure TfcCustomTransparentPanel.ClipChildren(Value: Boolean);
  162. begin
  163.   if (Parent <> nil) then
  164.   begin
  165.     if Value then
  166.       SetWindowLong(Parent.Handle, GWL_STYLE,
  167.         GetWindowLong(Parent.Handle, GWL_STYLE) or WS_CLIPCHILDREN)
  168.     else
  169.       SetWindowLong(Parent.Handle, GWL_STYLE,
  170.         GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  171.     end;
  172. end;
  173. procedure TfcCustomTransparentPanel.SetParent(AParent:TWinControl);
  174. begin
  175.   inherited SetParent(AParent);
  176.   // Without this, the panel would be transparent indeed, but you would see through the form into the background apps
  177. //  ClipChildren(not FTransparent);
  178. end;
  179. procedure TfcCustomTransparentPanel.Invalidate;
  180. var Rect :TRect;
  181.     i: Integer;
  182. begin
  183.   if IsTransparent and (Parent <> nil) and Parent.HandleAllocated then
  184.   begin
  185.     Rect:= BoundsRect;
  186.     InvalidateRect(Parent.Handle, @Rect, True);
  187. //    Parent.Update; { 8/5/99 - RSW - Calling this causes problem with TImage or TfcImager not being painted }
  188.                      { This happened when you enter page/down in a scrollable region }
  189.     for i := 0 to ControlCount - 1 do Controls[i].Invalidate;
  190.   end
  191.   else inherited Invalidate;
  192. end;
  193. procedure TfcCustomTransparentPanel.SetTransparent(Value: Boolean);
  194. begin
  195.   if FTransparent <> Value then
  196.   begin
  197.     FTransparent := Value;
  198.     if not (csLoading in ComponentState) and HandleAllocated then { 4/30/99 }
  199.       Invalidate;
  200. //    ClipChildren(not Value);
  201. //    RecreateWnd;
  202.   end;
  203. end;
  204. Function TfcCustomTransparentPanel.IsTransparent: boolean;
  205. begin
  206.    result:= FTransparent;
  207. end;
  208. {procedure Register;
  209. begin
  210.   RegisterComponents('1stClass', [TfcTransparentPanel]);
  211. end;
  212. }
  213. end.