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

Delphi控件源码

开发平台:

Delphi

  1. unit fcpanel;
  2. {
  3. //
  4. // Components : TwwCustomTransparentPanel
  5. //              Supporting component for transparent navigator
  6. //
  7. // Copyright (c) 1999-2001 by Woll2Woll Software
  8. //
  9. // Revision History:
  10. // 10/23/2001-Handle refresh of text when caption changes.
  11. // 11/1/2001 - PYW - Invalidate when setting captionindent or FullBorder.
  12. // 12/19/01 - PYW - Don't call invalidate unless framing or transparent in cmenter, cmexit
  13. //
  14. }
  15. {$i fcIfDef.pas}
  16. interface
  17. uses Windows, Messages, SysUtils, Classes, Controls, Forms,
  18.   CommCtrl, StdCtrls, Buttons, ExtCtrls, Graphics, fcframe;
  19. type
  20.   TfcCustomPanel = class(TCustomPanel)
  21.   private
  22.     FFrame: TfcEditframe;
  23.     FFocused: boolean;
  24.     procedure WMEraseBkGnd(var Message:TWMEraseBkGnd); message WM_ERASEBKGND;
  25.     procedure WMMove(var Message: TWMMove); Message WM_Move;
  26.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  27.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  28.     procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  29.   protected
  30.     // Property Storage Variables
  31.     FTransparent: Boolean;
  32.     procedure ClipChildren(Value: Boolean);
  33.     procedure CreateWnd; override;
  34.     // Property Access Methods
  35.     procedure SetTransparent(Value: Boolean); virtual;
  36.     // Overridden methods
  37.     procedure Paint; override;
  38.     procedure AlignControls(AControl: TControl; var Rect: TRect); override;
  39.     procedure CreateParams(var Params: TCreateParams); override;
  40.     procedure SetParent(AParent:TWinControl); override;
  41.     function IsTransparent: boolean; virtual;
  42.     function InvalidateNeeded:boolean; virtual;
  43.   public
  44.     constructor Create(AOwner: TComponent); override;
  45.     destructor Destroy; override;
  46.     procedure Invalidate; override;
  47.     property Frame: TfcEditFrame read FFrame write FFrame;
  48.     property Transparent: Boolean read FTransparent write SetTransparent default False;
  49.   end;
  50.   TfcCustomGroupBox = class(TCustomGroupBox)
  51.   private
  52.     FBorderAroundLabel: boolean;
  53.     FFrame: TfcEditframe;
  54.     FFocused: boolean;
  55.     FCaptionIndent: integer;
  56.     FFullBorder: boolean;
  57.     procedure SetCaptionIndent(Value:Integer);
  58.     procedure SetFullBorder(Value:Boolean);
  59.     procedure WMEraseBkGnd(var Message:TWMEraseBkGnd); message WM_ERASEBKGND;
  60.     procedure WMMove(var Message: TWMMove); Message WM_Move;
  61.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  62.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  63.     procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  64.   protected
  65.     // Property Storage Variables
  66.     FTransparent: Boolean;
  67.     procedure ClipChildren(Value: Boolean);
  68.     procedure CreateWnd; override;
  69.     procedure Paint; override;
  70.     // Property Access Methods
  71.     procedure SetTransparent(Value: Boolean); virtual;
  72.     // Overridden methods
  73.     procedure AlignControls(AControl: TControl; var Rect: TRect); override;
  74.     procedure CreateParams(var Params: TCreateParams); override;
  75.     procedure SetParent(AParent:TWinControl); override;
  76.     function IsTransparent: boolean; virtual;
  77.     function InvalidateNeeded:boolean; virtual;
  78.   public
  79.     constructor Create(AOwner: TComponent); override;
  80.     destructor Destroy; override;
  81.     procedure Invalidate; override;
  82.     property CaptionIndent: integer read FCaptionIndent write SetCaptionIndent default 8;
  83.     property BorderAroundLabel: boolean read FBorderAroundLabel write FBorderAroundLabel default False;
  84.     property FullBorder: boolean read FFullBorder write SetFullBorder default False;
  85.     property Transparent: Boolean read FTransparent write SetTransparent default False;
  86.     property Frame: TfcEditFrame read FFrame write FFrame;
  87.   end;
  88.   TfcPanel = class(TfcCustomPanel)
  89.   public
  90.     property DockManager;
  91.   published
  92.     property Align;
  93.     property Alignment;
  94.     property Anchors;
  95.     property AutoSize;
  96.     property BevelInner;
  97.     property BevelOuter;
  98.     property BevelWidth;
  99.     property BiDiMode;
  100.     property BorderWidth;
  101.     property BorderStyle;
  102.     property Caption;
  103.     property Color;
  104.     property Constraints;
  105.     property Ctl3D;
  106.     property UseDockManager default True;
  107.     property DockSite;
  108.     property DragCursor;
  109.     property DragKind;
  110.     property DragMode;
  111.     property Enabled;
  112.     property FullRepaint;
  113.     property Font;
  114.     property Frame;
  115.     property Locked;
  116.     property ParentBiDiMode;
  117.     property ParentColor;
  118.     property ParentCtl3D;
  119.     property ParentFont;
  120.     property ParentShowHint;
  121.     property PopupMenu;
  122.     property ShowHint;
  123.     property TabOrder;
  124.     property TabStop;
  125.     property Transparent;
  126.     property Visible;
  127.     property OnCanResize;
  128.     property OnClick;
  129.     property OnConstrainedResize;
  130.     property OnContextPopup;
  131.     property OnDockDrop;
  132.     property OnDockOver;
  133.     property OnDblClick;
  134.     property OnDragDrop;
  135.     property OnDragOver;
  136.     property OnEndDock;
  137.     property OnEndDrag;
  138.     property OnEnter;
  139.     property OnExit;
  140.     property OnGetSiteInfo;
  141.     property OnMouseDown;
  142.     property OnMouseMove;
  143.     property OnMouseUp;
  144.     property OnResize;
  145.     property OnStartDock;
  146.     property OnStartDrag;
  147.     property OnUnDock;
  148.   end;
  149.   TfcGroupBox = class(TfcCustomGroupBox)
  150.   published
  151.     property Align;
  152.     property Anchors;
  153.     property BiDiMode;
  154.     property BorderAroundLabel;
  155.     property Caption;
  156.     property CaptionIndent;
  157.     property Color;
  158.     property Constraints;
  159.     property Ctl3D;
  160.     property DockSite;
  161.     property DragCursor;
  162.     property DragKind;
  163.     property DragMode;
  164.     property Enabled;
  165.     property Font;
  166.     property Frame;
  167.     property FullBorder;
  168.     property ParentBiDiMode;
  169.     property ParentColor;
  170.     property ParentCtl3D;
  171.     property ParentFont;
  172.     property ParentShowHint;
  173.     property PopupMenu;
  174.     property ShowHint;
  175.     property TabOrder;
  176.     property TabStop;
  177.     property Transparent;
  178.     property Visible;
  179.     property OnClick;
  180.     property OnContextPopup;
  181.     property OnDblClick;
  182.     property OnDragDrop;
  183.     property OnDockDrop;
  184.     property OnDockOver;
  185.     property OnDragOver;
  186.     property OnEndDock;
  187.     property OnEndDrag;
  188.     property OnEnter;
  189.     property OnExit;
  190.     property OnGetSiteInfo;
  191.     property OnMouseDown;
  192.     property OnMouseMove;
  193.     property OnMouseUp;
  194.     property OnStartDock;
  195.     property OnStartDrag;
  196.     property OnUnDock;
  197.   end;
  198. implementation
  199. uses fccommon;
  200. constructor TfcCustomPanel.Create(AOwner: TComponent);
  201. begin
  202.   inherited Create(AOwner);
  203.   FFrame:= TfcEditFrame.create(self);
  204.   FTransparent := False;
  205. end;
  206. destructor TfcCustomPanel.Destroy;
  207. begin
  208.   FFrame.Free;
  209.   inherited Destroy;
  210. end;
  211. procedure TfcCustomPanel.CreateParams(var Params: TCreateParams);
  212. begin
  213.   inherited CreateParams(Params);
  214.   if IsTransparent then
  215.      Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
  216. end;
  217. procedure TfcCustomPanel.AlignControls(AControl: TControl; var Rect: TRect);
  218. begin
  219.   inherited;
  220.   if IsTransparent then Invalidate;
  221. end;
  222. procedure TfcCustomPanel.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  223. begin
  224.   if IsTransparent then Message.result:=1
  225.   else inherited;
  226. end;
  227. procedure TfcCustomPanel.WMMove(var Message: TWMMove);
  228. begin
  229.   inherited;
  230.   if IsTransparent then Invalidate;
  231. end;
  232. procedure TfcCustomPanel.ClipChildren(Value: Boolean);
  233. //var tc: TWinControl;
  234. begin
  235.   if (Parent <> nil) then
  236.   begin
  237.       SetWindowLong(Parent.Handle, GWL_STYLE,
  238.         GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  239.       if HandleAllocated then
  240.         SetWindowLong(Handle, GWL_STYLE,
  241.           GetWindowLong(Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  242. //    tc:= self;
  243. //
  244.     // Only disable parent clipping, don't enable it
  245. //    while (tc.parent<>nil) do begin
  246. //        SetWindowLong(tc.Parent.Handle, GWL_STYLE,
  247. //          GetWindowLong(tc.Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  248. //      if tc.parent is TCustomForm then break;
  249. //      tc:= tc.parent;
  250. //      break;
  251. //    end;
  252.   end
  253. end;
  254. procedure TfcCustomPanel.SetParent(AParent:TWinControl);
  255. begin
  256.   inherited SetParent(AParent);
  257.   // Without this, the panel would be transparent indeed, but you would see through the form into the background apps
  258. //  ClipChildren(not FTransparent);
  259. end;
  260. procedure TfcCustomPanel.Invalidate;
  261. var TempRect:TRect;
  262.     r: TRect;
  263. begin
  264. //  inherited;
  265. //  exit;
  266.   if IsTransparent and (Parent <> nil) and Parent.HandleAllocated then
  267.   begin
  268.     GetUpdateRect(Handle, r, False);
  269.     tempRect:= BoundsRect;
  270.     tempRect:= Rect(TempRect.Left + r.Left, TempRect.Top + r.Top,
  271.                     TempRect.Left + r.Right, TempRect.Top + R.Bottom);
  272.     InvalidateRect(Parent.Handle, @TempRect, False);
  273.    // 10/23/01 - The following code causes a transpareant panel to not be transparent in some cases
  274.    // when the form first comes up.  In fact only 1 panel seems to exhibit this problem
  275.    // when having multiple panels or groupboxes.
  276. {    if not fcIsTransparentParent(self) then
  277.        Parent.Update; // Seems necessary for transparent panel in transparent panel when
  278. }
  279.     if (r.left=r.right) and (r.top=r.bottom) then
  280.       InvalidateRect(Handle, nil, False)
  281.     else InvalidateRect(Handle, @r, False);
  282.   end
  283.   else inherited Invalidate;
  284. end;
  285. procedure TfcCustomPanel.SetTransparent(Value: Boolean);
  286. begin
  287.   if FTransparent <> Value then
  288.   begin
  289.     FTransparent := Value;
  290.     if IsTransparent then ControlStyle := ControlStyle - [csOpaque]
  291.     else begin
  292.        ControlStyle := ControlStyle + [csOpaque];
  293.     end;
  294.     if not (csLoading in ComponentState) and HandleAllocated and
  295.        not (csDesigning in ComponentState) then
  296.     begin
  297.       Invalidate;
  298.       ClipChildren(not Value);
  299.       RecreateWnd;
  300.     end
  301.   end;
  302. end;
  303. Function TfcCustomPanel.IsTransparent: boolean;
  304. begin
  305.    result:= FTransparent and not (csDesigning in ComponentState);
  306. end;
  307. //10/23/2001-Handle refresh of text when caption changes.
  308. procedure TfcCustomPanel.CMTextChanged(var Message: TMessage);
  309. begin
  310.   if (not (csDesigning in ComponentState)) or FTransparent then
  311.      Frame.RefreshTransparentText(True);
  312.   inherited;
  313. end;
  314. procedure TfcCustomPanel.Paint;
  315. const
  316.   Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
  317. var
  318.   Rect: TRect;
  319.   TopColor, BottomColor: TColor;
  320.   FontHeight: Integer;
  321.   Flags: Longint;
  322.   TempRect: TRect;
  323.   procedure AdjustColors(Bevel: TPanelBevel);
  324.   begin
  325.     TopColor := clBtnHighlight;
  326.     if Bevel = bvLowered then TopColor := clBtnShadow;
  327.     BottomColor := clBtnShadow;
  328.     if Bevel = bvLowered then BottomColor := clBtnHighlight;
  329.   end;
  330. begin
  331.   Rect := GetClientRect;
  332.   if Frame.IsFrameEffective then
  333.   begin
  334.      if (Frame.NonFocusColor<>clNone) and (not FFocused) then
  335.         Canvas.Brush.Color := Frame.NonFocusColor
  336.      else Canvas.Brush.Color := Color;
  337.      if not Transparent then Canvas.FillRect(Rect);
  338.      fcDrawEdge(self, Frame, Canvas, FFocused);
  339.   end
  340.   else begin
  341.      if BevelOuter <> bvNone then
  342.      begin
  343.        AdjustColors(BevelOuter);
  344.        Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
  345.      end;
  346.      Frame3D(Canvas, Rect, Color, Color, BorderWidth);
  347.      if BevelInner <> bvNone then
  348.      begin
  349.        AdjustColors(BevelInner);
  350.        Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
  351.      end;
  352.   end;
  353.   with Canvas do
  354.   begin
  355.     if not Transparent then
  356.     begin
  357.        TempRect:= Rect;
  358.        if not Frame.IsFrameEffective then
  359.        begin
  360.           Brush.Color := Color;
  361.           FillRect(TempRect);
  362.        end;
  363.     end;
  364.     Brush.Style := bsClear;
  365.     Font := Self.Font;
  366.     FontHeight := TextHeight('W');
  367.     with Rect do
  368.     begin
  369.       Top := ((Bottom + Top) - FontHeight) div 2;
  370.       Bottom := Top + FontHeight;
  371.     end;
  372.     Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[Alignment];
  373.     Flags := DrawTextBiDiModeFlags(Flags);
  374.     if Frame.IsFrameEffective then
  375.     begin
  376.        if (Frame.NonFocusFontColor<>clNone) and (not FFocused) then
  377.           Font.Color := Frame.NonFocusFontColor
  378.     end;
  379.     DrawText(Handle, PChar(Caption), -1, Rect, Flags);
  380.   end;
  381. end;
  382. constructor TfcCustomGroupBox.Create(AOwner: TComponent);
  383. begin
  384.   inherited Create(AOwner);
  385.   FCaptionIndent := 8;
  386.   FTransparent := False;
  387.   BorderAroundLabel:= false;
  388.   FFullBorder := False;
  389.   FFrame:= TfcEditFrame.create(self);
  390. end;
  391. destructor TfcCustomGroupBox.Destroy;
  392. begin
  393.   FFrame.Free;
  394.   inherited Destroy;
  395. end;
  396. procedure TfcCustomGroupBox.CreateParams(var Params: TCreateParams);
  397. begin
  398.   inherited CreateParams(Params);
  399.   if IsTransparent then
  400.      Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
  401. end;
  402. procedure TfcCustomGroupBox.AlignControls(AControl: TControl; var Rect: TRect);
  403. begin
  404.   inherited;
  405.   if IsTransparent then Invalidate;
  406. end;
  407. procedure TfcCustomGroupBox.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  408. begin
  409.   if IsTransparent then Message.result:=1
  410.   else if not Frame.IsFrameEffective then inherited
  411. //  else message.result:=1
  412.   else if Frame.IsFrameEffective and
  413.        (Frame.NonFocusColor<>clNone) then message.result:=1
  414.   else if BorderAroundLabel then message.result:=1 // Don't paint outside text if true
  415.   else inherited;
  416. end;
  417. procedure TfcCustomGroupBox.WMMove(var Message: TWMMove);
  418. begin
  419.   inherited;
  420.   if IsTransparent then Invalidate;
  421. end;
  422. procedure TfcCustomGroupBox.ClipChildren(Value: Boolean);
  423. begin
  424.   if (Parent <> nil) then
  425.   begin
  426.       SetWindowLong(Parent.Handle, GWL_STYLE,
  427.         GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  428.       if HandleAllocated then
  429.         SetWindowLong(Handle, GWL_STYLE,
  430.           GetWindowLong(Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
  431.   end;
  432. end;
  433. procedure TfcCustomGroupBox.SetParent(AParent:TWinControl);
  434. begin
  435.   inherited SetParent(AParent);
  436.   // Without this, the panel would be transparent indeed, but you would see through the form into the background apps
  437. //  ClipChildren(not FTransparent);
  438. end;
  439. procedure TfcCustomGroupBox.CMTextChanged(var Message: TMessage);
  440. begin
  441.   if (not (csDesigning in ComponentState)) or FTransparent then
  442.      Frame.RefreshTransparentText(True);
  443.   inherited;
  444. end;
  445. procedure TfcCustomGroupBox.Invalidate;
  446. var TempRect:TRect;
  447.     r: TRect;
  448. begin
  449.   if IsTransparent and (Parent <> nil) and Parent.HandleAllocated then
  450.   begin
  451.     GetUpdateRect(Handle, r, False);
  452.     tempRect:= BoundsRect;
  453.     tempRect:= Rect(TempRect.Left + r.Left, TempRect.Top + r.Top,
  454.                     TempRect.Left + r.Right, TempRect.Top + R.Bottom);
  455.     InvalidateRect(Parent.Handle, @TempRect, False);
  456.    // 10/23/01 - The following code causes a transpareant panel to not be transparent in some cases
  457.    // when the form first comes up.  In fact only 1 panel seems to exhibit this problem
  458.    // when having multiple panels or groupboxes.
  459.   {    if not fcIsTransparentParent(self) then
  460.        Parent.Update; // Seems necessary for transparent panel in transparent panel when
  461.                       // using splitter between two panels
  462. }
  463.     if (r.left=r.right) and (r.top=r.bottom) then
  464. //      InvalidateRect(Handle, nil, False)  // 7/11/01 - If this code there than 1stclass combos in us cause flicker when dropped-down
  465.     else InvalidateRect(Handle, @r, False);
  466.   end
  467.   else inherited Invalidate;
  468. end;
  469. procedure TfcCustomGroupBox.SetTransparent(Value: Boolean);
  470. begin
  471.   if FTransparent <> Value then
  472.   begin
  473.     FTransparent := Value;
  474.     if IsTransparent then ControlStyle := ControlStyle - [csOpaque]
  475.     else begin
  476.        ControlStyle := ControlStyle + [csOpaque];
  477.     end;
  478.     if not (csLoading in ComponentState) and HandleAllocated and
  479.        not (csDesigning in ComponentState) then
  480.     begin
  481.       Invalidate;
  482.       ClipChildren(not Value);
  483.       RecreateWnd;
  484.     end
  485.   end;
  486. end;
  487. procedure TfcCustomGroupBox.SetCaptionIndent(Value:Integer);
  488. begin
  489.    if FCaptionIndent <> Value then begin
  490.       FCaptionIndent := fcMax(3,Value);
  491.       Invalidate; // 11/1/2001 - PYW - Invalidate Whole thing.
  492.  //   if (not (csDesigning in ComponentState)) or FTransparent then
  493.  //      Frame.RefreshTransparentText(True);
  494.    end;
  495. end;
  496. procedure TfcCustomGroupBox.SetFullBorder(Value:Boolean);
  497. begin
  498.    if FFullBorder <> Value then begin
  499.       FFullBorder := Value;
  500.       Invalidate; // 11/1/2001 - PYW - Invalidate Whole thing.
  501. //      if (not (csDesigning in ComponentState)) or FTransparent then
  502. //         Frame.RefreshTransparentText(True);
  503.    end;
  504. end;
  505. Function TfcCustomGroupBox.IsTransparent: boolean;
  506. begin
  507.    result:= FTransparent and not (csDesigning in ComponentState);
  508. end;
  509. procedure TfcCustomGroupBox.CreateWnd;
  510. begin
  511.    inherited;
  512.    ClipChildren(not FTransparent);
  513. end;
  514. procedure TfcCustomPanel.CreateWnd;
  515. begin
  516.    inherited;
  517.    ClipChildren(not FTransparent);
  518. end;
  519. procedure TfcCustomGroupBox.Paint;
  520. var
  521.   H: Integer;
  522.   TempRect, R, TextR, FillR: TRect;
  523.   Flags,Pad: Longint;
  524.   Text: string;
  525.   StartText, EndText: integer;
  526.   Function GetRect: TRect;
  527.   begin
  528.      with Canvas do begin
  529.        Font := Self.Font;
  530.        if Text = '' then
  531.          H:= 2
  532.        else begin
  533.           if BorderAroundLabel then
  534.              H := TextHeight('0') + 2 // Add 2 if we are showing border around caption
  535.           else H := TextHeight('0');
  536.        end;
  537. //       if FullBorder and BorderAroundLabel then
  538.        if FullBorder then begin
  539.           if BorderAroundLabel then
  540.              Result := Rect(0, H - 2, Width, Height)
  541.           else Result := Rect(0, H+1, Width, Height);
  542.        end
  543.        else Result := Rect(0, H div 2 - 1, Width, Height);
  544.      end;
  545.   end;
  546. begin
  547.    Text:= Caption;
  548.    if Text='' then exit;
  549.    if text = '' then
  550.       H:= 2
  551.    else
  552.       H:= Canvas.TextHeight('0');
  553.    Pad:=1;
  554.    if not UseRightToLeftAlignment then
  555.      TextR := Rect(CaptionIndent, 0, 0, H)
  556.    else
  557.      TextR := Rect(R.Right - Canvas.TextWidth(Text) - CaptionIndent, 0, 0, H);
  558.    with Canvas do begin
  559.      R:= GetRect;
  560.      if Text = '' then begin
  561.         StartText:= 0;
  562.         EndText:= 0;
  563.      end
  564.      else begin
  565.         StartText:= TextR.Left;
  566.         EndText:= TextR.Left + Canvas.TextWidth(Text);
  567.      end;
  568.      if Frame.IsFrameEffective then
  569.      begin
  570.         if (Frame.NonFocusColor<>clNone) and (not FFocused) then
  571.             Brush.Color := Frame.NonFocusColor
  572.         else Brush.Color := Color;
  573.      end
  574.      else Brush.Color:= Color;
  575.      TempRect:= TextR;
  576.      TempRect.Bottom := TempRect.Bottom+1;
  577.      TempRect.Left:= StartText-3;
  578.      TempRect.Right:= EndText+2;
  579.      if not Transparent then begin
  580.         FillR := r;
  581.         InflateRect(FillR,-1,-1);
  582.         FillRect(FillR);
  583.      end;
  584.      if BorderAroundLabel then
  585.      begin
  586.        if not Transparent then
  587.           FillRect(TempRect);
  588.        Brush.Color := clBtnHighlight;
  589.        Pen.Color:= clBtnHighlight;
  590.        PolyLine([Point(StartText-2, r.Top+1), Point(StartText-2, 1),
  591.                  Point(EndText+2, 1), Point(EndText+2, r.Top)]);
  592. //       PolyLine([Point(StartText-3, r.Top), Point(StartText-3, TextR.Bottom+1),
  593. //                 Point(EndText+2, Textr.Bottom+1), Point(EndText+2, Textr.Top)]);
  594.        Brush.Color := clBtnShadow;
  595.        Pen.Color:= clBtnShadow;
  596.        PolyLine([Point(StartText-3, r.Top), Point(StartText-3, 0),
  597.                  Point(EndText+1, 0), Point(EndText+1, r.Top+1)]);
  598. //       PolyLine([Point(StartText-2, r.Top+1), Point(StartText-2, TextR.Bottom),
  599. //                 Point(EndText+1, TextR.Bottom), Point(EndText+1, r.Top+1)]);
  600.      end
  601.      else if FullBorder then begin
  602.        Pad := 0;
  603.        Brush.Color := clBtnHighlight;
  604.        Pen.Color:= clBtnHighlight;
  605.        PolyLine([Point(StartText-2, r.Top+1), Point(EndText+1, r.Top+1)]);
  606.        Brush.Color := clBtnShadow;
  607.        Pen.Color:= clBtnShadow;
  608.        PolyLine([Point(StartText-3, r.Top), Point(EndText+2, r.Top)]);
  609.      end;
  610.      if Ctl3D then
  611.      begin
  612.        Inc(R.Left);
  613.        Inc(R.Top);
  614.        Brush.Color := clBtnHighlight;
  615.        Pen.Color:= clBtnHighlight;
  616.        if Text = '' then begin
  617.           PolyLine([Point(0, r.top), Point(r.left, r.top), Point(r.left, r.bottom-1),
  618.                  Point(r.right-1, r.bottom-1), Point(r.right-1, r.top),
  619.                  Point(0, r.top)]);
  620.        end
  621.        else begin
  622.           PolyLine([Point(TextR.Left-3, r.top), Point(r.left, r.top), Point(r.left, r.bottom-1),
  623.                  Point(r.right-1, r.bottom-1), Point(r.right-1, r.top),
  624.                  Point(TextR.Left + Canvas.TextWidth(Text)+Pad, r.top)]);
  625.        end;
  626.        OffsetRect(R, -1, -1);
  627.        Brush.Color := clBtnShadow;
  628.        Pen.Color:= clBtnShadow;
  629.      end else
  630.        Brush.Color := clWindowFrame;
  631.      PolyLine([Point(StartText-3, r.top), Point(r.left, r.top), Point(r.left, r.bottom-1),
  632.                  Point(r.right-1, r.bottom-1), Point(r.right-1, r.top),
  633.                  Point(EndText+1, r.top)]);
  634.    end;
  635.    if not UseRightToLeftAlignment then
  636.      R := Rect(CaptionIndent, 0, 0, H)
  637.    else
  638.      R := Rect(R.Right - Canvas.TextWidth(Text) - CaptionIndent, 0, 0, H);
  639.    Flags := DrawTextBiDiModeFlags(DT_SINGLELINE);
  640.    if text = '' then exit;
  641.    if BorderAroundLabel then R.Top:= R.Top + 1;
  642.    Canvas.Font.Color:= Font.Color;
  643.    if Frame.IsFrameEffective then
  644.    begin
  645.       if (Frame.NonFocusFontColor<>clNone) and (not FFocused) then
  646.          Canvas.Font.Color := Frame.NonFocusFontColor
  647.    end;
  648.    with Canvas do begin
  649.       SetBkMode(Handle, windows.TRANSPARENT);
  650.       DrawText(Handle, PChar(Text), Length(Text), R, Flags or DT_CALCRECT);
  651.       SetBkMode(Handle, windows.TRANSPARENT);
  652.       DrawText(Handle, PChar(Text), Length(Text), R, Flags);
  653.    end
  654. end;
  655. {
  656. procedure TfcCustomGroupBox.Paint;
  657. var
  658.   H: Integer;
  659.   R: TRect;
  660.   Flags: Longint;
  661. begin
  662.   with Canvas do
  663.   begin
  664.     Font := Self.Font;
  665.     H := TextHeight('0');
  666.     R := Rect(0, H div 2 - 1, Width, Height);
  667.     if Ctl3D then
  668.     begin
  669.       Inc(R.Left);
  670.       Inc(R.Top);
  671.       Brush.Color := clBtnHighlight;
  672.       FrameRect(R);
  673.       OffsetRect(R, -1, -1);
  674.       Brush.Color := clBtnShadow;
  675.     end else
  676.       Brush.Color := clWindowFrame;
  677.     FrameRect(R);
  678.     if Text <> '' then
  679.     begin
  680.       if not UseRightToLeftAlignment then
  681.         R := Rect(8, 0, 0, H)
  682.       else                         
  683.         R := Rect(R.Right - Canvas.TextWidth(Text) - 8, 0, 0, H);
  684.       Flags := DrawTextBiDiModeFlags(DT_SINGLELINE);
  685.       DrawText(Handle, PChar(Text), Length(Text), R, Flags or DT_CALCRECT);
  686.       Brush.Color := Color;
  687.       Brush.Style := bsClear;
  688.       DrawText(Handle, PChar(Text), Length(Text), R, Flags);
  689.     end;
  690.   end;
  691. end;
  692. }
  693. function TfcCustomPanel.InvalidateNeeded:boolean;
  694. begin
  695.   result := False;
  696.   if Frame.Enabled then
  697.     if (Frame.NonFocusColor <> clNone) then begin
  698.        if (Color <> Frame.NonFocusColor) then result := True;
  699.     end
  700.     else if (Frame.NonFocusFontColor <> clNone) then begin
  701.        if (Font.Color <> Frame.NonFocusFontColor) then result := True;
  702.     end;
  703. end;
  704. procedure TfcCustomPanel.CMEnter(var Message: TCMEnter);
  705. var r,r2:TRect;
  706. begin
  707.    inherited;
  708.    FFocused:= True;
  709.    if invalidateneeded then invalidate;
  710.    if Frame.Enabled then
  711.    if (Frame.FocusBorders * Frame.NonFocusBorders <> Frame.FocusBorders) or
  712.       (Frame.FocusStyle <> Frame.NonFocusStyle) then
  713.    begin
  714.      r:= ClientRect;
  715.      r2:= Rect(r.left+2,r.top+2,r.right-2,r.bottom-2);
  716.      ValidateRect(handle,@r2);
  717.      InvalidateRect(handle, @r, False);
  718.    end;
  719. end;
  720. procedure TfcCustomPanel.CMExit(var Message: TCMExit);
  721. var r,r2:Trect;
  722. begin
  723.    inherited;
  724.    FFocused:= False;
  725.    if invalidateneeded then invalidate;
  726.    if Frame.Enabled then
  727.    if (Frame.FocusBorders * Frame.NonFocusBorders <> Frame.FocusBorders) or
  728.       (Frame.FocusStyle <> Frame.NonFocusStyle) then
  729.    begin
  730.      r:= ClientRect;
  731.      r2:= Rect(r.left+2,r.top+2,r.right-2,r.bottom-2);
  732.      ValidateRect(handle,@r2);
  733.      InvalidateRect(handle, @r, False);
  734.    end;
  735. end;
  736. procedure TfcCustomGroupBox.CMEnter(var Message: TCMEnter);
  737. begin
  738.    inherited;
  739.    FFocused:= True;
  740.    if InvalidateNeeded then invalidate;
  741. end;
  742. function TfcCustomGroupBox.InvalidateNeeded:boolean;
  743. begin
  744.   result := False;
  745.   if Frame.Enabled then
  746.     if (Frame.NonFocusColor <> clNone) then begin
  747.        if (Color <> Frame.NonFocusColor) then result := True;
  748.     end
  749.     else if (Frame.NonFocusFontColor <> clNone) then begin
  750.        if (Font.Color <> Frame.NonFocusFontColor) then result := True;
  751.     end;
  752. end;
  753. procedure TfcCustomGroupBox.CMExit(var Message: TCMExit);
  754. begin
  755.    inherited;
  756.    FFocused:= False;
  757.    if InvalidateNeeded then invalidate;
  758. end;
  759. end.