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

Delphi控件源码

开发平台:

Delphi

  1. unit fcpaneltest;
  2. {
  3. //
  4. // Components : TwwCustomTransparentPanel
  5. //              Supporting component for transparent navigator
  6. //
  7. // Copyright (c) 1999-2001 by Woll2Woll Software
  8. //
  9. }
  10. {$i fcIfDef.pas}
  11. interface
  12. uses Windows, Messages, SysUtils, Classes, Controls, Forms,
  13.   CommCtrl, StdCtrls, Buttons, ExtCtrls, Graphics, fcframe;
  14. type
  15.   TfcCustomPanel = class(TCustomPanel)
  16.   private
  17.     procedure WMEraseBkGnd(var Message:TWMEraseBkGnd); message WM_ERASEBKGND;
  18.     procedure WMMove(var Message: TWMMove); Message WM_Move;
  19.   protected
  20.     // Property Storage Variables
  21.     FTransparent: Boolean;
  22.     procedure ClipChildren(Value: Boolean);
  23.     procedure CreateWnd; override;
  24.     // Property Access Methods
  25.     procedure SetTransparent(Value: Boolean); virtual;
  26.     // Overridden methods
  27.     procedure Paint; override;
  28.     procedure AlignControls(AControl: TControl; var Rect: TRect); override;
  29.     procedure CreateParams(var Params: TCreateParams); override;
  30.     procedure SetParent(AParent:TWinControl); override;
  31.     function IsTransparent: boolean; virtual;
  32.   public
  33.     constructor Create(AOwner: TComponent); override;
  34.     destructor Destroy; override;
  35.     procedure Invalidate; override;
  36.     property Transparent: Boolean read FTransparent write SetTransparent default False;
  37.   end;
  38.   TfcCustomGroupBox = class(TCustomGroupBox)
  39.   private
  40.     procedure WMEraseBkGnd(var Message:TWMEraseBkGnd); message WM_ERASEBKGND;
  41.     procedure WMMove(var Message: TWMMove); Message WM_Move;
  42.   protected
  43.     // Property Storage Variables
  44.     FTransparent: Boolean;
  45.     procedure ClipChildren(Value: Boolean);
  46.     procedure CreateWnd; override;
  47.     procedure Paint; override;
  48.     // Property Access Methods
  49.     procedure SetTransparent(Value: Boolean); virtual;
  50.     // Overridden methods
  51.     procedure AlignControls(AControl: TControl; var Rect: TRect); override;
  52.     procedure CreateParams(var Params: TCreateParams); override;
  53.     procedure SetParent(AParent:TWinControl); override;
  54.     function IsTransparent: boolean; virtual;
  55.   public
  56.     constructor Create(AOwner: TComponent); override;
  57.     destructor Destroy; override;
  58.     procedure Invalidate; override;
  59.     property Transparent: Boolean read FTransparent write SetTransparent default False;
  60.   end;
  61.   TfcPanel = class(TfcCustomPanel)
  62.   public
  63.     property DockManager;
  64.   published
  65.     property Align;
  66.     property Alignment;
  67.     property Anchors;
  68.     property AutoSize;
  69.     property BevelInner;
  70.     property BevelOuter;
  71.     property BevelWidth;
  72.     property BiDiMode;
  73.     property BorderWidth;
  74.     property BorderStyle;
  75.     property Caption;
  76.     property Color;
  77.     property Constraints;
  78.     property Ctl3D;
  79.     property UseDockManager default True;
  80.     property DockSite;
  81.     property DragCursor;
  82.     property DragKind;
  83.     property DragMode;
  84.     property Enabled;
  85.     property FullRepaint;
  86.     property Font;
  87.     property Locked;
  88.     property ParentBiDiMode;
  89.     property ParentColor;
  90.     property ParentCtl3D;
  91.     property ParentFont;
  92.     property ParentShowHint;
  93.     property PopupMenu;
  94.     property ShowHint;
  95.     property TabOrder;
  96.     property TabStop;
  97.     property Transparent;
  98.     property Visible;
  99.     property OnCanResize;
  100.     property OnClick;
  101.     property OnConstrainedResize;
  102.     property OnContextPopup;
  103.     property OnDockDrop;
  104.     property OnDockOver;
  105.     property OnDblClick;
  106.     property OnDragDrop;
  107.     property OnDragOver;
  108.     property OnEndDock;
  109.     property OnEndDrag;
  110.     property OnEnter;
  111.     property OnExit;
  112.     property OnGetSiteInfo;
  113.     property OnMouseDown;
  114.     property OnMouseMove;
  115.     property OnMouseUp;
  116.     property OnResize;
  117.     property OnStartDock;
  118.     property OnStartDrag;
  119.     property OnUnDock;
  120.   end;
  121.   TfcGroupBox = class(TfcCustomGroupBox)
  122.   published
  123.     property Align;
  124.     property Anchors;
  125.     property BiDiMode;
  126.     property Caption;
  127.     property Color;
  128.     property Constraints;
  129.     property Ctl3D;
  130.     property DockSite;
  131.     property DragCursor;
  132.     property DragKind;
  133.     property DragMode;
  134.     property Enabled;
  135.     property Font;
  136.     property ParentBiDiMode;
  137.     property ParentColor;
  138.     property ParentCtl3D;
  139.     property ParentFont;
  140.     property ParentShowHint;
  141.     property PopupMenu;
  142.     property ShowHint;
  143.     property TabOrder;
  144.     property TabStop;
  145.     property Transparent;
  146.     property Visible;
  147.     property OnClick;
  148.     property OnContextPopup;
  149.     property OnDblClick;
  150.     property OnDragDrop;
  151.     property OnDockDrop;
  152.     property OnDockOver;
  153.     property OnDragOver;
  154.     property OnEndDock;
  155.     property OnEndDrag;
  156.     property OnEnter;
  157.     property OnExit;
  158.     property OnGetSiteInfo;
  159.     property OnMouseDown;
  160.     property OnMouseMove;
  161.     property OnMouseUp;
  162.     property OnStartDock;
  163.     property OnStartDrag;
  164.     property OnUnDock;
  165.   end;
  166. implementation
  167. constructor TfcCustomPanel.Create(AOwner: TComponent);
  168. begin
  169.   inherited Create(AOwner);
  170.   FTransparent := False;
  171. end;
  172. destructor TfcCustomPanel.Destroy;
  173. begin
  174.   inherited Destroy;
  175. end;
  176. procedure TfcCustomPanel.CreateParams(var Params: TCreateParams);
  177. begin
  178.   inherited CreateParams(Params);
  179.   if IsTransparent then
  180.      Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
  181. end;
  182. procedure TfcCustomPanel.AlignControls(AControl: TControl; var Rect: TRect);
  183. begin
  184.   inherited;
  185.   if IsTransparent then Invalidate;
  186. //  if (Parent<>nil) and (Parent.Parent<>nil) then
  187. //  else
  188. //     fcInvalidateTransparentArea(self);
  189. //  if Parent is TCustomPanel then
  190. //  begin
  191. //     Parent.Parent.Invalidate;
  192. //  end;
  193. end;
  194. procedure TfcCustomPanel.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  195. begin
  196.   if IsTransparent then Message.result:=1
  197.   else inherited;
  198. end;
  199. procedure TfcCustomPanel.WMMove(var Message: TWMMove);
  200. begin
  201.   inherited;
  202.   if IsTransparent then Invalidate;
  203. //  if Parent is TCustomPanel then
  204. //     Parent.Parent.Invalidate;
  205. end;
  206. procedure TfcCustomPanel.ClipChildren(Value: Boolean);
  207. //var tc: TWinControl;
  208. begin
  209.   if (Parent <> nil) then
  210.   begin
  211.       SetWindowLong(Parent.Handle, GWL_STYLE,
  212.         GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  213.       if HandleAllocated then
  214.         SetWindowLong(Handle, GWL_STYLE,
  215.           GetWindowLong(Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  216. //    tc:= self;
  217. //
  218.     // Only disable parent clipping, don't enable it
  219. //    while (tc.parent<>nil) do begin
  220. //        SetWindowLong(tc.Parent.Handle, GWL_STYLE,
  221. //          GetWindowLong(tc.Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  222. //      if tc.parent is TCustomForm then break;
  223. //      tc:= tc.parent;
  224. //      break;
  225. //    end;
  226.   end
  227. end;
  228. procedure TfcCustomPanel.SetParent(AParent:TWinControl);
  229. begin
  230.   inherited SetParent(AParent);
  231.   // Without this, the panel would be transparent indeed, but you would see through the form into the background apps
  232. //  ClipChildren(not FTransparent);
  233. end;
  234. procedure TfcCustomPanel.Invalidate;
  235. var TempRect:TRect;
  236.     i: Integer;
  237.     r: TRect;
  238. begin
  239. //  inherited;
  240. //  if (Parent<>nil) and (Parent.Parent<>nil) then
  241. //     fcInvalidateTransparentArea(self);
  242. //     Parent.Parent.Update;
  243. //  exit;
  244.   if IsTransparent and (Parent <> nil) and Parent.HandleAllocated then
  245.   begin
  246.     GetUpdateRect(Handle, r, False);
  247.     tempRect:= BoundsRect;
  248.     tempRect:= Rect(TempRect.Left + r.Left, TempRect.Top + r.Top,
  249.                     TempRect.Left + r.Right, TempRect.Top + R.Bottom);
  250.     InvalidateRect(Parent.Handle, @TempRect, False);
  251.     Parent.Update;
  252.     if (r.left=r.right) and (r.top=r.bottom) then
  253.       InvalidateRect(Handle, nil, False)
  254.     else InvalidateRect(Handle, @r, False);
  255.   end
  256.   else inherited Invalidate;
  257. end;
  258. procedure TfcCustomPanel.SetTransparent(Value: Boolean);
  259. begin
  260.   if FTransparent <> Value then
  261.   begin
  262.     FTransparent := Value;
  263.     if IsTransparent then ControlStyle := ControlStyle - [csOpaque]
  264.     else begin
  265.        ControlStyle := ControlStyle + [csOpaque];
  266.     end;
  267.     if not (csLoading in ComponentState) and HandleAllocated then { 4/30/99 }
  268.     begin
  269.       Invalidate;
  270.       ClipChildren(not Value);
  271.       RecreateWnd;
  272.     end
  273.   end;
  274. end;
  275. Function TfcCustomPanel.IsTransparent: boolean;
  276. begin
  277.    result:= FTransparent and not (csDesigning in ComponentState);
  278. end;
  279. procedure TfcCustomPanel.Paint;
  280. const
  281.   Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
  282. var
  283.   Rect: TRect;
  284.   TopColor, BottomColor: TColor;
  285.   FontHeight: Integer;
  286.   Flags: Longint;
  287.   procedure AdjustColors(Bevel: TPanelBevel);
  288.   begin
  289.     TopColor := clBtnHighlight;
  290.     if Bevel = bvLowered then TopColor := clBtnShadow;
  291.     BottomColor := clBtnShadow;
  292.     if Bevel = bvLowered then BottomColor := clBtnHighlight;
  293.   end;
  294. begin
  295.   Rect := GetClientRect;
  296.   if BevelOuter <> bvNone then
  297.   begin
  298.     AdjustColors(BevelOuter);
  299.     Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
  300.   end;
  301.   Frame3D(Canvas, Rect, Color, Color, BorderWidth);
  302.   if BevelInner <> bvNone then
  303.   begin
  304.     AdjustColors(BevelInner);
  305.     Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
  306.   end;
  307.   with Canvas do
  308.   begin
  309.     Brush.Color := Color;
  310.     if not Transparent then FillRect(Rect);
  311.     Brush.Style := bsClear;
  312.     Font := Self.Font;
  313.     FontHeight := TextHeight('W');
  314.     with Rect do
  315.     begin
  316.       Top := ((Bottom + Top) - FontHeight) div 2;
  317.       Bottom := Top + FontHeight;
  318.     end;
  319.     Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[Alignment];
  320.     Flags := DrawTextBiDiModeFlags(Flags);
  321.     DrawText(Handle, PChar(Caption), -1, Rect, Flags);
  322.   end;
  323. end;
  324. constructor TfcCustomGroupBox.Create(AOwner: TComponent);
  325. begin
  326.   inherited Create(AOwner);
  327.   FTransparent := False;
  328. end;
  329. destructor TfcCustomGroupBox.Destroy;
  330. begin
  331.   inherited Destroy;
  332. end;
  333. procedure TfcCustomGroupBox.CreateParams(var Params: TCreateParams);
  334. begin
  335.   inherited CreateParams(Params);
  336.   if IsTransparent then
  337.      Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
  338. end;
  339. procedure TfcCustomGroupBox.AlignControls(AControl: TControl; var Rect: TRect);
  340. begin
  341.   inherited;
  342.   if IsTransparent then Invalidate;
  343. end;
  344. procedure TfcCustomGroupBox.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  345. begin
  346.   if IsTransparent then Message.result:=1
  347.   else inherited;
  348. end;
  349. procedure TfcCustomGroupBox.WMMove(var Message: TWMMove);
  350. begin
  351.   inherited;
  352.   if IsTransparent then Invalidate;
  353.   if Parent is TCustomPanel then
  354.      Parent.Parent.Invalidate;
  355. end;
  356. procedure TfcCustomGroupBox.ClipChildren(Value: Boolean);
  357. begin
  358.   if (Parent <> nil) then
  359.   begin
  360.       SetWindowLong(Parent.Handle, GWL_STYLE,
  361.         GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  362.       if HandleAllocated then
  363.         SetWindowLong(Handle, GWL_STYLE,
  364.           GetWindowLong(Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  365.   end;
  366. end;
  367. procedure TfcCustomGroupBox.SetParent(AParent:TWinControl);
  368. begin
  369.   inherited SetParent(AParent);
  370.   // Without this, the panel would be transparent indeed, but you would see through the form into the background apps
  371. //  ClipChildren(not FTransparent);
  372. end;
  373. procedure TfcCustomGroupBox.Invalidate;
  374. var TempRect:TRect;
  375.     i: Integer;
  376.     r: TRect;
  377. begin
  378. inherited;
  379. exit;
  380.   if IsTransparent and (Parent <> nil) and Parent.HandleAllocated then
  381.   begin
  382.     GetUpdateRect(Handle, r, False);
  383.     tempRect:= BoundsRect;
  384.     tempRect:= Rect(TempRect.Left + r.Left, TempRect.Top + r.Top,
  385.                     TempRect.Left + r.Right, TempRect.Top + R.Bottom);
  386.     InvalidateRect(Parent.Handle, @TempRect, False);
  387.     if (r.left=r.right) and (r.top=r.bottom) then
  388.       InvalidateRect(Handle, nil, False)
  389.     else InvalidateRect(Handle, @r, False);
  390.   end
  391.   else inherited Invalidate;
  392. end;
  393. procedure TfcCustomGroupBox.SetTransparent(Value: Boolean);
  394. begin
  395.   if FTransparent <> Value then
  396.   begin
  397.     FTransparent := Value;
  398.     if IsTransparent then ControlStyle := ControlStyle - [csOpaque]
  399.     else begin
  400.        ControlStyle := ControlStyle + [csOpaque];
  401.     end;
  402.     if not (csLoading in ComponentState) and HandleAllocated then { 4/30/99 }
  403.     begin
  404.       Invalidate;
  405.       ClipChildren(not Value);
  406.       RecreateWnd;
  407.     end
  408.   end;
  409. end;
  410. Function TfcCustomGroupBox.IsTransparent: boolean;
  411. begin
  412.    result:= FTransparent and not (csDesigning in ComponentState);
  413. end;
  414. procedure TfcCustomGroupBox.CreateWnd;
  415. begin
  416.    inherited;
  417.    ClipChildren(not FTransparent);
  418. end;
  419. procedure TfcCustomPanel.CreateWnd;
  420. begin
  421.    inherited;
  422.    ClipChildren(not FTransparent);
  423. end;
  424. procedure TfcCustomGroupBox.Paint;
  425. var
  426.   H: Integer;
  427.   R: TRect;
  428.   Flags: Longint;
  429. begin
  430.   with Canvas do
  431.   begin
  432.     Font := Self.Font;
  433.     H := TextHeight('0');
  434.     R := Rect(0, H div 2 - 1, Width, Height);
  435.     if Ctl3D then
  436.     begin
  437.       Inc(R.Left);
  438.       Inc(R.Top);
  439.       Brush.Color := clBtnHighlight;
  440.       FrameRect(R);
  441.       OffsetRect(R, -1, -1);
  442.       Brush.Color := clBtnShadow;
  443.     end else
  444.       Brush.Color := clWindowFrame;
  445.     FrameRect(R);
  446.     if Text <> '' then
  447.     begin
  448.       if not UseRightToLeftAlignment then
  449.         R := Rect(8, 0, 0, H)
  450.       else                         
  451.         R := Rect(R.Right - Canvas.TextWidth(Text) - 8, 0, 0, H);
  452.       Flags := DrawTextBiDiModeFlags(DT_SINGLELINE);
  453.       DrawText(Handle, PChar(Text), Length(Text), R, Flags or DT_CALCRECT);
  454.       Brush.Color := Color;
  455.       Brush.Style := bsClear;
  456.       DrawText(Handle, PChar(Text), Length(Text), R, Flags);
  457.     end;
  458.   end;
  459. end;
  460. end.