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

Delphi控件源码

开发平台:

Delphi

  1. unit fcframe;
  2. {$i fcIfDef.pas}
  3. interface
  4. uses classes, Windows, controls, stdctrls, graphics, forms, Messages, typinfo;
  5. type
  6. //  TfcComboButtonStyle = (cbsEllipsis, cbsDownArrow, cbsCustom);
  7.   TfcButtonEffects = class(TPersistent)
  8.   private
  9.      FTransparent: boolean;
  10.      FFlat: boolean;
  11.      procedure SetTransparent(val: boolean);
  12.      procedure SetFlat(val: boolean);
  13.   protected
  14.      Procedure Refresh; virtual;
  15.   public
  16.      Control: TControl;
  17.      Button: TControl;
  18.      constructor Create(Owner: TComponent; AButton: TControl);
  19.      class Function Get(Control: TControl): TfcButtonEffects;
  20.      Procedure Assign(Source: TPersistent); override;
  21.   published
  22.      property Transparent: boolean read FTransparent write SetTransparent default false;
  23.      property Flat: boolean read FFlat write SetFlat default false;
  24.   end;
  25.   TfcEditFocusStyle = (efsFrameBox, efsFrameSunken, efsFrameRaised, efsFrameEtched,
  26.                        efsFrameBump, efsFrameSingle);
  27.   TfcEditFrameEnabledType = (efLeftBorder, efTopBorder, efRightBorder, efBottomBorder);
  28.   TfcEditFrameEnabledSet = set of TfcEditFrameEnabledType;
  29.   TfcEditFrame = class(TPersistent)
  30.   private
  31.     Control: TWinControl;
  32.     FEnabled: boolean;
  33.     FNonFocusBorders: TfcEditFrameEnabledSet;
  34.     FFocusBorders: TfcEditFrameEnabledSet;
  35.     FFocusStyle: TfcEditFocusStyle;
  36.     FNonFocusStyle: TfcEditFocusStyle;
  37.     FNonFocusTextOffsetX: integer;
  38.     FNonFocusTextOffsetY: integer;
  39.     FTransparent: boolean;
  40.     FTransparentClearsBackground: boolean;
  41.     FMouseEnterSameAsFocus:boolean;
  42.     FAutoSizeHeightAdjust: integer;
  43.     FNonFocusTransparentFontColor: TColor;
  44.     FNonFocusColor: TColor;
  45.     FNonFocusFontColor: TColor;
  46.     procedure SetFocusBorders(val: TfcEditFrameEnabledSet);
  47.     procedure SetNonFocusBorders(val: TfcEditFrameEnabledSet);
  48.     procedure SetNonFocusStyle(val: TfcEditFocusStyle);
  49.     procedure SetEnabled(val: boolean);
  50.     procedure SetTransparent(val: boolean);
  51.     procedure CheckParentClipping;
  52. //    procedure AdjustEditRect;
  53.   public
  54.     CreateTransparent: boolean;
  55.     function IsSingleBorderStyle(Style: TfcEditFocusStyle): boolean;
  56.     constructor Create(Owner: TComponent);
  57.     procedure GetEditRectForFrame(var Loc: TRect);
  58.     procedure RefreshTransparentText(InvalidateBorders: boolean=False; UseEditRect: boolean = True);
  59.     procedure RefreshControl;
  60.     procedure AdjustHeight;
  61.     Function IsFrameEffective: boolean;
  62.     procedure GetFrameTextPosition(
  63.        var Left, Indent: integer;
  64.        Focused: boolean = False); virtual;
  65.     class Function Get(Control: TControl): TfcEditFrame;
  66.     Procedure Assign(Source: TPersistent); override;
  67.     property TransparentClearsBackground: boolean
  68.        read FTransparentClearsBackground write FTransparentClearsBackground default False;
  69.   published
  70.     property Enabled: boolean read FEnabled write SetEnabled default False;
  71.     property Transparent: boolean read FTransparent write SetTransparent default False;
  72.     property AutoSizeHeightAdjust: integer read FAutoSizeHeightAdjust write FAutoSizeHeightAdjust default 0;
  73.     property FocusBorders : TfcEditFrameEnabledSet read FFocusBorders write SetFocusBorders
  74.        default [efLeftBorder, efTopBorder, efRightBorder, efBottomBorder];
  75.     property NonFocusBorders : TfcEditFrameEnabledSet read FNonFocusBorders write SetNonFocusBorders
  76.              default [efBottomBorder];
  77.     property FocusStyle: TfcEditFocusStyle read FFocusStyle write FFocusStyle default efsFrameBox;
  78.     property NonFocusStyle: TfcEditFocusStyle read FNonFocusStyle write SetNonFocusStyle default efsFrameBox;
  79.     property NonFocusTextOffsetX: integer read FNonFocusTextOffsetX write FNonFocusTextOffsetX default 0;
  80.     property NonFocusTextOffsetY: integer read FNonFocusTextOffsetY write FNonFocusTextOffsetY default 0;
  81.             // Obsolete
  82.     property NonFocusTransparentFontColor: TColor read FNonFocusTransparentFontColor write FNonFocusTransparentFontColor default clNone;
  83.     property NonFocusColor: TColor read FNonFocusColor write FNonFocusColor default clNone;
  84.     property NonFocusFontColor: TColor read FNonFocusFontColor write FNonFocusFontColor default clNone;
  85.     property MouseEnterSameAsFocus: boolean
  86.        read FMouseEnterSameAsFocus write FMouseEnterSameAsFocus default False;
  87.   end;
  88. procedure fcDrawEdge(
  89.      Control: TWinControl;
  90.      Frame: TfcEditFrame;
  91.      Canvas: TCanvas;
  92.      Focused: boolean);
  93. procedure fcInvalidateTransparentArea(control : TControl);
  94. function fcIsTransparentParent(control : TControl): boolean;
  95. implementation
  96. uses fccommon, grids;
  97. Function fcSetBorder(ctrl: TControl; val: boolean): boolean;
  98. var PropInfo: PPropInfo;
  99.     intval: integer;
  100. begin
  101.    Result:= False;
  102.    PropInfo:= Typinfo.GetPropInfo(ctrl.ClassInfo, 'BorderStyle');
  103.    if (PropInfo<>Nil) then begin
  104.       if val then intval:= ord(bsSingle)
  105.       else intval:= ord(bsNone);
  106.       SetOrdProp(Ctrl, PropInfo, intval);
  107.       result:= True;
  108.    end
  109. end;
  110. function fcTransparent(Control: TControl): boolean;
  111. var PropInfo: PPropInfo;
  112. begin
  113.    Result:= False;
  114.    PropInfo:= Typinfo.GetPropInfo(Control.ClassInfo,'Transparent');
  115.    if PropInfo<>Nil then result:= Boolean(GetOrdProp(Control, PropInfo));
  116. end;
  117. function fcIsTransparentParent(control : TControl): boolean;
  118. var OrigStyle: longint;
  119.     pc: TControl;
  120. begin
  121.    result:= false;
  122.    pc:= control;
  123.    // If parent is not transparent then just return
  124.    if (fcIsClass(pc.Parent.ClassType, 'TfcPanel') or
  125.        fcIsClass(pc.Parent.ClassType, 'TfcGroupBox')) and
  126.       fcTransparent(pc.Parent) then
  127.    begin
  128.       result:= True;
  129.       exit;
  130.    end;
  131.    if (pc.parent is TWinControl) and
  132.       TWinControl(pc.parent).HandleAllocated then
  133.    begin
  134.       OrigStyle:= Windows.GetWindowLong(TWinControl(pc.parent).handle, GWL_EXSTYLE);
  135.       result:= (OrigStyle and WS_EX_TRANSPARENT)<>0;
  136.    end;
  137. end;
  138. constructor TfcEditFrame.Create(Owner: TComponent);
  139. begin
  140.    inherited Create;
  141.    Enabled:= false;
  142.    FNonFocusBorders:= [efBottomBorder];
  143.    FFocusBorders:= [efLeftBorder, efTopBorder, efRightBorder, efBottomBorder];
  144.    if Owner is TWinControl then
  145.      control:= TWinControl(Owner)
  146.    else
  147.      control:= nil;
  148.    FFocusStyle := efsFrameBox;
  149.    FNonFocusStyle:= efsFrameBox;
  150.    FNonFocusTextOffsetX:=0;
  151.    FNonFocusTextOffsetX:=0;
  152.    FNonFocusTransparentFontColor:= clNone;
  153.    FNonFocusColor:= clNone;
  154.    FNonFocusFontcolor:= clNone;
  155.    FMouseEnterSameAsFocus := False;
  156. end;
  157. procedure TfcEditFrame.SetNonFocusBorders(val: TfcEditFrameEnabledSet);
  158. begin
  159.    FNonFocusBorders:= val;
  160.    if control is TCustomEdit then
  161.    begin
  162.       RefreshControl;
  163.    end
  164. //   control.invalidate;
  165. end;
  166. procedure TfcEditFrame.SetFocusBorders(val: TfcEditFrameEnabledSet);
  167. begin
  168.    FFocusBorders:= val;
  169.    if control is TCustomEdit then
  170.    begin
  171.       control.invalidate;
  172.    end
  173. end;
  174. procedure TfcEditFrame.SetNonFocusStyle(val: TfcEditFocusStyle);
  175. begin
  176.    if val<>FNonFocusStyle then
  177.    begin
  178.       FNonFocusStyle:= val;
  179.       if control is TCustomEdit then
  180.       begin
  181.          control.invalidate;
  182.       end
  183.    end
  184. end;
  185. procedure TfcEditFrame.SetEnabled(val: boolean);
  186.    Function wwGetAutoSize(ctrl: TControl): boolean;
  187.    var PropInfo: PPropInfo;
  188.    begin
  189.       Result:= False;
  190.       PropInfo:= Typinfo.GetPropInfo(ctrl.ClassInfo,'AutoSize');
  191.       if PropInfo<>Nil then result:= Boolean(GetOrdProp(Ctrl, PropInfo));
  192.    end;
  193. begin
  194.    if val<>FEnabled then
  195.    begin
  196.       FEnabled:= val;
  197.       if control is TCustomEdit then
  198.       begin
  199.          if val then fcSetBorder(control, False);
  200.          if wwGetAutoSize(control) then AdjustHeight;
  201.          control.invalidate;
  202.       end
  203.    end
  204. end;
  205. procedure fcDrawEdge(
  206.      Control: TWinControl;
  207.      Frame: TfcEditFrame;
  208.      Canvas: TCanvas;
  209.      Focused: boolean);
  210. var cr: TRect;
  211. //    StateFlags: Word;
  212.     Flags: integer;
  213.     focusStyle: TfcEditFocusStyle;
  214. begin
  215.    cr:= Control.ClientRect;
  216.    if Focused then begin
  217.       if not (efRightBorder in Frame.FocusBorders) and
  218.          frame.transparent then cr.right:= cr.right-2;
  219.       flags:= 0;
  220.       if efLeftBorder in Frame.FocusBorders then flags:= flags + bf_left;
  221.       if efBottomBorder in Frame.FocusBorders then flags:= flags + bf_bottom;
  222.       if efTopBorder in Frame.FocusBorders then flags:= flags + bf_top;
  223.       if efRightBorder in Frame.FocusBorders then flags:= flags + bf_right;
  224.       focusStyle:= Frame.FocusStyle;
  225.    end
  226.    else begin
  227.       if not (efRightBorder in Frame.NonFocusBorders) and
  228.          frame.transparent then cr.right:= cr.right-2;
  229.       flags:= 0;
  230.       if efLeftBorder in Frame.NonFocusBorders then flags:= flags + bf_left;
  231.       if efBottomBorder in Frame.NonFocusBorders then flags:= flags + bf_bottom;
  232.       if efTopBorder in Frame.NonFocusBorders then flags:= flags + bf_top;
  233.       if efRightBorder in Frame.NonFocusBorders then flags:= flags + bf_right;
  234.       focusStyle:= Frame.NonFocusStyle;
  235.    end;
  236.       if (FocusStyle=efsFrameSingle) then
  237.       begin
  238.         DrawEdge(Canvas.Handle, cr, BDR_SUNKENOUTER, flags or bf_mono );
  239.       end
  240.       else if (FocusStyle=efsFrameBox) then
  241.       begin
  242.         DrawEdge(Canvas.Handle, cr, EDGE_SUNKEN, flags or bf_mono);
  243.       end
  244.       else if (FocusStyle=efsFrameSunken) then
  245.       begin
  246.         DrawEdge(Canvas.Handle, cr, EDGE_SUNKEN, flags);
  247.       end
  248.       else if (FocusStyle=efsFrameRaised) then
  249.       begin
  250.         DrawEdge(Canvas.Handle, cr, EDGE_RAISED, flags);
  251.       end
  252.       else if (FocusStyle=efsFrameEtched) then
  253.       begin
  254.         DrawEdge(Canvas.Handle, cr, EDGE_ETCHED, flags);
  255.       end
  256.       else if (FocusStyle=efsFrameBump) then
  257.       begin
  258.          DrawEdge(Canvas.Handle, cr, EDGE_BUMP, flags);
  259.       end;
  260. end;
  261. procedure TfcEditFrame.CheckParentClipping;
  262. var OldStyle:  longint;
  263. begin
  264.    if FTransparent and IsFrameEffective and (Control<>nil) and
  265.       not (csDesigning in Control.ComponentState) then
  266.    begin
  267.       if Control.HandleAllocated then
  268.       begin
  269.          OldStyle:= GetWindowLong(Control.Parent.Handle, GWL_STYLE);
  270.          if OldStyle and (NOT WS_CLIPCHILDREN)<>OldStyle then
  271.          begin
  272.             SendMessage(Control.Handle, CM_RECREATEWND, 0, 0);
  273.          end
  274.       end
  275.    end
  276. end;
  277. procedure TfcEditFrame.SetTransparent(val: boolean);
  278. begin
  279.    if val<>FTransparent then
  280.    begin
  281.      CreateTransparent:= val;
  282.      FTransparent:= val;
  283.      CheckParentClipping;
  284.    end;
  285. {   if (Control<>nil) and Control.HandleAllocated and
  286.       fcIsClass(Control.ClassType, 'TfcCustomRichEdit') and (Control<>nil) then
  287.    begin
  288.      SendMessage(control.handle, cm_recreatewnd, 0, 0);
  289.    end;;
  290. }
  291. end;
  292. procedure TfcEditFrame.RefreshTransparentText(InvalidateBorders: boolean=False; UseEditRect: boolean = True);
  293. var r,tempeditrect:TRect;
  294.     dc: HDC;
  295.     brush: HBRUSH;
  296. begin
  297.    r:= Control.BoundsRect;
  298.    if not InvalidateBorders then
  299.    begin
  300.      SendMessage(Control.handle,em_getrect, 0, Integer(@tempeditrect));
  301.      if not useEditRect then begin
  302.        InflateRect(r,-2,-2);
  303.        if not (efLeftBorder in nonFocusBorders) then dec(r.Left,2);
  304.      end
  305.      else if (TEdit(Control).BorderStyle=bsNone) then
  306.      begin
  307.        InflateRect(r,-2,-2);
  308.        if not (efLeftBorder in nonFocusBorders) then dec(r.Left,2);
  309.        r.Right := r.Left+tempeditrect.Right+1;
  310.      end
  311.    end;
  312.    { If imager not in background, then need to explicitly clear background }
  313.    if fcIsTransparentParent(Control) { or True } then
  314.       fcInvalidateTransparentArea(Control)
  315.    else if (Control.Parent.ControlAtPos(  Point(Control.Left, Control.Top), True)=nil) then
  316.    begin
  317.       DC := GetDC(Control.Handle);
  318.       brush:= 0;
  319.       try
  320.         brush:= CreateSolidBrush(ColorToRGB(TEdit(Control.parent).color));
  321.         SelectObject(DC, brush);
  322.         if not InvalidateBorders then
  323.         begin
  324.           InflateRect(tempEditRect, 1, 1);
  325.           { 11/22/99 - Fix problem where far left pixels are not cleared }
  326.           if not (efLeftBorder in nonFocusBorders) then
  327.           begin
  328.              dec(tempEditRect.Left,1);
  329.              if tempEditRect.Left<0 then tempEditRect.left:= 0;
  330.           end;
  331.           Windows.FillRect(DC, tempEditRect, brush);
  332.         end
  333.         else begin
  334.           r:= Control.ClientRect;
  335.           Windows.FillRect(DC, r, brush);
  336.         end;
  337.       finally
  338.         ReleaseDC(Control.Handle, DC);
  339.         DeleteObject(brush);
  340.       end
  341.    end
  342.    else
  343.       InvalidateRect(Control.parent.handle, @r, TransparentClearsBackground);
  344. end;
  345. procedure TfcEditFrame.RefreshControl;
  346. var r:TRect;
  347. begin
  348. //   AdjustEditRect;
  349.    r:= Control.BoundsRect;
  350.    if Enabled and Transparent then
  351.       InvalidateRect(Control.parent.handle, @r, false)
  352.    else Control.Invalidate;
  353. end;
  354. {procedure TfcEditFrame.AdjustEditRect;
  355. var TempEditRect:TRect;
  356. begin
  357.    if not Control.HandleAllocated then exit;
  358.    SendMessage(Control.handle,em_getrect, 0, Integer(@TempEditRect));
  359.    GetEditRectForFrame(TempEditRect);
  360.    SendMessage(Control.Handle, EM_SETRECTNP, 0, LongInt(@TempEditRect));
  361. end;
  362. }
  363. function TfcEditFrame.IsSingleBorderStyle(Style: TfcEditFocusStyle): boolean;
  364. begin
  365.   result:= Style in [efsFrameBox, efsFrameSingle];
  366. end;
  367. procedure TfcEditFrame.GetEditRectForFrame(var Loc: TRect);
  368. begin
  369.      if IsSingleBorderStyle(FocusStyle) then
  370. //     if (FocusStyle = efsFrameBox) then
  371.      begin
  372.         Loc.Top := 2;
  373.         Loc.Left := 2;
  374.         //6/22/01 - Copy change from IP wwframe - PYW - Correct problem where editrect is 1 pixel too large when RightBorder is showing for FrameBox.
  375.         if (efRightBorder in FocusBorders) and (FocusStyle = efsFrameBox) then
  376.           Loc.Right:= Loc.Right - 1
  377.      end
  378.      else begin
  379.         Loc.Top := 3;
  380.         if efLeftBorder in FocusBorders then
  381.         begin
  382.            if FocusStyle in [efsFrameSunken, efsFrameBump] then
  383.               Loc.Left := 3
  384.            else Loc.Left:= 2;
  385.         end
  386.         else Loc.Left:=1;
  387.         Loc.Right:= Loc.Right -2
  388.      end
  389. end;
  390. procedure TfcEditFrame.AdjustHeight;
  391. var
  392.   DC: HDC;
  393.   SaveFont: HFont;
  394.   I: Integer;
  395.   SysMetrics, Metrics: TTextMetric;
  396. begin
  397.   DC := GetDC(0);
  398.   GetTextMetrics(DC, SysMetrics);
  399.   SaveFont := SelectObject(DC, TEdit(Control).Font.Handle);
  400.   GetTextMetrics(DC, Metrics);
  401.   SelectObject(DC, SaveFont);
  402.   ReleaseDC(0, DC);
  403.   if NewStyleControls then
  404.   begin
  405.     if TEdit(Control).Ctl3D then I := 8 else I := 6;
  406.     I := GetSystemMetrics(SM_CYBORDER) * I;
  407.     if TEdit(Control).BorderStyle=bsNone  then i:= 6;
  408.     if self.enabled then i:= i + AutoSizeHeightAdjust;;
  409.   end else
  410.   begin
  411.     I := SysMetrics.tmHeight;
  412.     if I > Metrics.tmHeight then I := Metrics.tmHeight;
  413.     I := I div 4 + GetSystemMetrics(SM_CYBORDER) * 4;
  414.   end;
  415.   if Control.Height=Metrics.tmHeight+i then begin
  416.      Control.Height := Metrics.tmHeight + I - 1; { Force wmsize to take place to call setEditRect }
  417.      Control.Height := Metrics.tmHeight + I;
  418.   end
  419.   else
  420.      Control.Height := Metrics.tmHeight + I;
  421. end;
  422. {Function GetBooleanProp(control: TControl; PropertyName: string): boolean;
  423. var PropInfo: PPropInfo;
  424. begin
  425.    Result:= False;
  426.    PropInfo:= Typinfo.GetPropInfo(Control.ClassInfo, PropertyName);
  427.    if PropInfo<>Nil then
  428.       result:= Boolean(GetOrdProp(Control, PropInfo));
  429. end;
  430. }
  431. procedure SetBooleanProp(control: TControl; PropertyName: string; val: boolean);
  432. var PropInfo: PPropInfo;
  433. begin
  434.    PropInfo:= Typinfo.GetPropInfo(Control.ClassInfo, PropertyName);
  435.    if PropInfo<>Nil then
  436.       SetOrdProp(control, PropInfo, ord(val));
  437. end;
  438. procedure TfcButtonEffects.SetTransparent(val: boolean);
  439. begin
  440.    if FTransparent<>val then
  441.    begin
  442.       FTransparent:= val;
  443.       SetBooleanProp(Button, 'Transparent', FFlat or FTransparent);
  444.       SetBooleanProp(Button, 'Flat', FFlat or FTransparent);
  445.       Refresh;  //      FButton.Glyph.Handle:= LoadComboGlyph;
  446.       Button.Invalidate;
  447.    end;
  448. end;
  449. procedure TfcButtonEffects.SetFlat(val: boolean);
  450. begin
  451.    if FFlat<>val then
  452.    begin
  453.       FFlat:= val;
  454.       SetBooleanProp(Button, 'Flat', FFlat or FTransparent);
  455.       Refresh;  //      FButton.Glyph.Handle:= LoadComboGlyph;
  456.       Button.Invalidate;
  457.    end;
  458. end;
  459. constructor TfcButtonEffects.Create(Owner: TComponent; AButton: TControl);
  460. begin
  461.    inherited Create;
  462.    button:= TControl(AButton);
  463.    control:= TControl(Owner);
  464. end;
  465. Procedure TfcButtonEffects.Refresh;
  466. begin
  467. end;
  468. class Function TfcEditFrame.Get(Control: TControl): TfcEditFrame;
  469. var PropInfo: PPropInfo;
  470. begin
  471.    Result:= Nil;
  472.    PropInfo:= Typinfo.GetPropInfo(Control.ClassInfo,'Frame');
  473.    if PropInfo<>Nil then
  474.       result:= TfcEditFrame(GetOrdProp(Control, PropInfo));
  475. end;
  476. class Function TfcButtonEffects.Get(Control: TControl): TfcButtonEffects;
  477. var PropInfo: PPropInfo;
  478. begin
  479.    Result:= Nil;
  480.    PropInfo:= Typinfo.GetPropInfo(Control.ClassInfo,'ButtonEffects');
  481.    if PropInfo<>Nil then
  482.       result:= TfcButtonEffects(GetOrdProp(Control, PropInfo));
  483. end;
  484. Function TfcEditFrame.IsFrameEffective: boolean;
  485. begin
  486.    result:= enabled and (control<>nil) and not (control.parent is TCustomGrid);
  487. end;
  488. Procedure TfcButtonEffects.Assign(Source: TPersistent);
  489. var s: TfcButtonEffects;
  490. begin
  491.   if fcIsClass(Source.classtype, 'TwwButtonEffects') or (Source is TfcButtonEffects) then
  492.   begin
  493.      s:= TfcButtonEffects(source);
  494.      Flat:= s.Flat;
  495.      Transparent:= s.Transparent;
  496.   end
  497.   else inherited Assign(Source);
  498. end;
  499. procedure TfcEditFrame.Assign(Source: TPersistent);
  500. var s: TfcEditFrame;
  501. begin
  502.   if fcIsClass(Source.classtype, 'TwwEditFrame') or (Source is TfcEditFrame) then
  503.   begin
  504.      s:= TfcEditFrame(source);
  505.      FocusStyle:= s.FocusStyle;
  506.      Enabled:= s.Enabled;
  507.      Transparent:= s.Transparent;
  508.      if not Enabled then exit; {Optimization }
  509.      TransparentClearsBackground:= s.TransparentClearsBackground;
  510.      AutoSizeHeightAdjust:= s.AutoSizeHeightAdjust;
  511.      FocusBorders:= s.FocusBorders;
  512.      NonFocusBorders:= s.NonFocusBorders;
  513.      NonFocusStyle:= s.NonFocusStyle;
  514.      NonFocusTextOffsetX:= s.NonFocusTextOffsetX;
  515.      NonFocusTextOffsetY:= s.NonFocusTextOffsetY;
  516.      NonFocusTransparentFontColor:= s.NonFocusTransparentFontColor;
  517.      NonFocusColor:= s.NonFocusColor;
  518.      NonFocusFontColor:= s.NonFocusFontColor;
  519.      MouseEnterSameAsFocus:= s.MouseEnterSameAsFocus;
  520.   end
  521.   else inherited Assign(Source);
  522. end;
  523. procedure TfcEditFrame.GetFrameTextPosition(
  524.    var Left, Indent: integer;
  525.    Focused: boolean = False);
  526. var Borders: TfcEditFrameEnabledSet;
  527.     FrameStyle: TfcEditFocusStyle;
  528. begin
  529.    if Focused then
  530.    begin
  531.       Borders:= FocusBorders;
  532.       FrameStyle:= FocusStyle;
  533.    end
  534.    else begin
  535.       Borders:= NonFocusBorders;
  536.       FrameStyle:= NonFocusStyle;
  537.    end;
  538.    Left:= 1;
  539.    if (efLeftBorder in Borders) then begin
  540. //      if FrameStyle=efsFrameBox then Left:= 2
  541.       if IsSingleBorderStyle(FrameStyle) then Left:= 2
  542.       else Left:= 3;
  543.    end;
  544.    Indent:= 2;
  545.    if (efTopBorder in Borders) and
  546.       (not IsSingleBorderStyle(FrameStyle)) then
  547. //      (FrameStyle<>efsFrameBox) then
  548.       Indent:= Indent + 1;
  549.    Left:= Left + NonFocusTextOffsetX;
  550.    Indent:= Indent + NonFocusTextOffsetY;
  551. end;
  552. (*procedure fcInvalidateTransparentArea(control : TControl);
  553. var r: TRect;
  554.    pc: TControl;
  555.    pt: TPoint;
  556.    clearBackground: boolean;
  557. begin
  558.   { Draws any image in the background }
  559.    with Control do  r:= Rect(Left, Top, Left+Width, Top+Height);
  560.    r:= Control.ClientRect;
  561.    pc:= control;
  562.    if pc.parent=nil then exit;
  563.    // If parent is not transparent then just return
  564. //   if not fcIsTransparentParent(control) then exit;
  565.    pc:= Control;
  566.    While (pc.parent<>nil) do begin
  567. //     oldpc:= pc;
  568.      pc:= pc.Parent;
  569.      pt:= Point(0,0);
  570.      // Don't invalidate area outside of control
  571.      if Control.Left<0 then pt.x:= pt.x - Control.Left;
  572.      if Control.Top<0 then pt.y:= pt.y - Control.Top;
  573.      pt:= Control.ClientToScreen(pt);
  574.      ScreenToClient(TWinControl(pc).handle, pt);
  575.      r:= Rect(pt.X, pt.y, pt.x+Control.Width, pt.y+Control.Height);
  576.      // Don't invalidate area outside of control
  577.      if Control.Left<0 then r.Right:= r.Right - Control.Left;
  578.      if Control.Top<0 then r.Top:= r.Top - Control.Top;
  579.      clearBackground:= TransparentClearsBackground;
  580. {
  581.      InvalidateRect(TWinControl(pc).handle, @r, ClearBackground);
  582.      if not wwIsTransparentParent(oldpc) then exit;
  583.      InvalidateRect(TWinControl(pc).handle, @r, True);
  584.      if pc is TCustomForm then begin
  585.         pc.update; // Complete painting as background imager is not painted sometimes otherwise
  586.                    // Later may need to only do this code in cmexit, instead of also
  587.                    // in cmTextChanged
  588. //        Application.ProcessMessages;
  589.         break;
  590.      end;
  591. }
  592.    end;
  593. end;
  594. *)
  595. (*procedure fcInvalidateTransparentArea(control : TControl);
  596. var r: TRect;
  597.    pc: TControl;
  598. begin
  599.   { Draws any image in the background }
  600.   if not fcIsTransparentParent(control) then exit;
  601.   r:= Rect(Control.Left, Control.Top, Control.Left+Control.Width, Control.Top + Control.Height);
  602.   InvalidateRect(Control.Parent.Handle, @r, False);
  603.   exit;
  604.    with Control do  r:= Rect(Left, Top, Left+Width, Top+Height);
  605.    pc:= control;
  606.    if pc.parent=nil then exit;
  607.    // If parent is not transparent then just return
  608. //   if not fcIsTransparentParent(control) then exit;
  609.    repeat
  610.       pc:= pc.parent;
  611.       if (pc<>nil) and (pc.parent=nil) then break;
  612.       r:= Rect(pc.left + r.Left, pc.top+r.top,
  613.            pc.left + r.right, pc.top + r.bottom);
  614.    until pc.parent=nil;
  615.    if pc is TWinControl then
  616.        InvalidateRect(TWinControl(pc).handle, @r, False);
  617. end;
  618. *)
  619. procedure fcInvalidateTransparentArea2(control : TControl;
  620.    TransparentClearsBackground: boolean);
  621. var r: TRect;
  622.    pc, oldpc: TControl;
  623.    pt: TPoint;
  624.    clearBackground: boolean;
  625. begin
  626.   { Draws any image in the background }
  627.    with Control do  r:= Rect(Left, Top, Left+Width, Top+Height);
  628.    r:= Control.ClientRect;
  629.    pc:= control;
  630.    if pc.parent=nil then exit;
  631.    // If parent is not transparent then just return
  632. //   if not fcIsTransparentParent(control) then exit;
  633.    pc:= Control;
  634.    While (pc.parent<>nil) do begin
  635.      oldpc:= pc;
  636.      pc:= pc.Parent;
  637.      pt:= Point(0,0);
  638.      // Don't invalidate area outside of control
  639.      if Control.Left<0 then pt.x:= pt.x - Control.Left;
  640.      if Control.Top<0 then pt.y:= pt.y - Control.Top;
  641.      pt:= Control.ClientToScreen(pt);
  642.      ScreenToClient(TWinControl(pc).handle, pt);
  643.      r:= Rect(pt.X, pt.y, pt.x+Control.Width, pt.y+Control.Height);
  644.      // Don't invalidate area outside of control
  645.      if Control.Left<0 then r.Right:= r.Right - Control.Left;
  646.      if Control.Top<0 then r.Top:= r.Top - Control.Top;
  647. {     if wwIsClass(control.classtype, 'TwwNavButton') and
  648.         (wwIsTransparentParent(oldpc)) then clearBackground:=false
  649.      else }
  650.      clearBackground:= TransparentClearsBackground;
  651.      InvalidateRect(TWinControl(pc).handle, @r, ClearBackground);
  652.      if not fcIsTransparentParent(oldpc) then exit;
  653.    end;
  654. end;
  655. procedure fcInvalidateTransparentArea(control : TControl);
  656. var frame: TfcEditFrame;
  657.     clearBackground: boolean;
  658. begin
  659.    Frame:= TfcEditFrame.Get(Control);
  660.    if ((Frame<>Nil) and Frame.TransparentClearsBackground) then
  661.       ClearBackground:=True
  662.    else clearBackground:= false;
  663.    fcInvalidateTransparentArea2(control, clearBackground);
  664. end;
  665. end.