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

Delphi控件源码

开发平台:

Delphi

  1.   RM := GetResizeMode;
  2.   R := TrackButtonRect;
  3.   case RM of
  4.     2:
  5.       begin
  6.         Off := Width - RectWidth(SkinRect);
  7.         OffsetRect(R, Off, 0);
  8.       end;
  9.     3:
  10.       begin
  11.         Off := Height - RectHeight(SkinRect);
  12.         OffsetRect(R, 0, Off);
  13.       end;
  14.   end;
  15.   Result := R;
  16. end;
  17. function TbsSkinMenuButton.CanMenuTrack;
  18. var
  19.   R: TRect;
  20. begin
  21.   if FSkinPopupMenu = nil
  22.   then
  23.     begin
  24.       Result := False;
  25.       Exit;
  26.     end
  27.   else
  28.     begin
  29.       if not FTrackButtonMode
  30.       then
  31.         Result := True
  32.       else
  33.         begin
  34.           if FIndex <> -1
  35.           then R := GetNewTrackButtonRect
  36.           else R := Rect(Width - 15, 0, Width, Height);
  37.           Result := PointInRect(R, Point(X, Y));
  38.         end;
  39.     end
  40. end;
  41. procedure TbsSkinMenuButton.WMCLOSESKINMENU;
  42. begin
  43.   FMenuTracked := False;
  44.   Down := False;
  45.   if Assigned(FOnHideTrackMenu) then FOnHideTrackMenu(Self);
  46. end;
  47. procedure TbsSkinMenuButton.TrackMenu;
  48. var
  49.   R: TRect;
  50.   P: TPoint;
  51. begin
  52.   if FSkinPopupMenu = nil then Exit;
  53.   P := ClientToScreen(Point(0, 0));
  54.   R := Rect(P.X, P.Y, P.X + Width, P.Y + Height);
  55.   FSkinPopupMenu.PopupFromRect2(Self, R, False);
  56.   if Assigned(FOnShowTrackMenu) then FOnShowTrackMenu(Self); 
  57. end;
  58. procedure TbsSkinMenuButton.Notification;
  59. begin
  60.   inherited Notification(AComponent, Operation);
  61.   if (Operation = opRemove) and (AComponent = FSkinPopupMenu)
  62.   then FSkinPopupMenu := nil;
  63. end;
  64. procedure TbsSkinMenuButton.CMMouseEnter(var Message: TMessage);
  65. begin
  66.   if (csDesigning in ComponentState) then Exit;
  67.   if not FMenuTracked then inherited else FMouseIn := True;
  68. end;
  69. procedure TbsSkinMenuButton.CMMouseLeave(var Message: TMessage);
  70. begin
  71.   if (csDesigning in ComponentState) then Exit;
  72.   if not FMenuTracked then inherited else FMouseIn := False;
  73. end;
  74. procedure TbsSkinMenuButton.GetSkinData;
  75. begin
  76.   inherited;
  77.   if FIndex <> -1
  78.   then
  79.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinMenuButtonControl
  80.     then
  81.       with TbsDataSkinMenuButtonControl(FSD.CtrlList.Items[FIndex]) do
  82.       begin
  83.         Self.TrackButtonRect := TrackButtonRect;
  84.       end;
  85. end;
  86. procedure TbsSkinMenuButton.SetTrackButtonMode;
  87. begin
  88.   FTrackButtonMode := Value;
  89.   if FIndex = - 1 then RePaint;
  90. end;
  91. procedure TbsSkinMenuButton.MouseDown;
  92. begin
  93.   if Button <> mbLeft
  94.   then
  95.     begin
  96.       inherited;
  97.       Exit;
  98.     end;
  99.   FMenuTracked := CanMenuTrack(X, Y);
  100.   FMouseIn := True;
  101.   if FMenuTracked
  102.   then
  103.     begin
  104.       if not FDown then Down := True;
  105.       TrackMenu;
  106.     end
  107.   else
  108.     inherited;
  109. end;
  110. procedure TbsSkinMenuButton.MouseUp;
  111. begin
  112.   if not FMenuTracked then inherited;
  113. end;
  114. //=========== TbsSkinPanel ================
  115. constructor TbsSkinPanel.Create;
  116. begin
  117.   inherited Create(AOwner);
  118.   ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
  119.     csSetCaption, csOpaque, csDoubleClicks, csReplicatable];
  120.   Width := 150;
  121.   Height := 150;
  122.   NewClRect := NullRect;
  123.   FRollUpMode := False;
  124.   FCaptionMode := False;
  125.   FRealHeight := -1;
  126.   FSkinDataName := 'panel';
  127.   BGPictureIndex := -1;
  128.   FDefaultCaptionHeight := 22;
  129.   FNumGlyphs := 1;
  130.   FGlyph := TBitMap.Create;
  131.   FSpacing := 2;
  132.   VisibleControls := nil;
  133.   FAutoEnabledControls := True; 
  134. end;
  135. destructor TbsSkinPanel.Destroy;
  136. begin
  137.   FGlyph.Free;
  138.   inherited;
  139. end;
  140. procedure TbsSkinPanel.SkinDrawCheckImage(X, Y: Integer; Cnvs: TCanvas; IR: TRect; DestCnvs: TCanvas);
  141. var
  142.   B: TBitMap;
  143. begin
  144.   B := TBitMap.Create;
  145.   B.Width := RectWidth(IR);
  146.   B.Height := RectHeight(IR);
  147.   B.Canvas.CopyRect(Rect(0, 0, B.Width, B.Height), Cnvs, IR);
  148.   B.Transparent := True;
  149.   DestCnvs.Draw(X, Y, B);
  150.   B.Free;
  151. end;
  152. procedure TbsSkinPanel.SetCheckedMode;
  153. begin
  154.   FCheckedMode := Value;
  155.   RePaint;
  156. end;
  157. procedure TbsSkinPanel.SetChecked;
  158. var
  159.   i: Integer;
  160. begin
  161.   FChecked := Value;
  162.   if FCheckedMode then RePaint;
  163.   if FAutoEnabledControls and FCheckedMode
  164.   then
  165.     begin
  166.       for i := 0 to ControlCount -1 do
  167.         Controls[i].Enabled := FChecked;
  168.     end;
  169.   if Assigned(FOnChecked) then FOnChecked(Self);
  170. end;
  171. procedure TbsSkinPanel.ShowControls;
  172. var
  173.   i: Integer;
  174. begin
  175.   if VisibleControls = nil then Exit;
  176.   for i := 0 to VisibleControls.Count - 1 do
  177.     TControl(VisibleControls.Items[i]).Visible := True;
  178.   VisibleControls.Clear;
  179.   VisibleControls.Free;
  180.   VisibleControls := nil;
  181. end;
  182. procedure TbsSkinPanel.HideControls;
  183. var
  184.   i: Integer;
  185. begin
  186.   if VisibleControls <> nil then VisibleControls.Free;
  187.   VisibleControls := TList.Create;
  188.   VisibleControls.Clear;
  189.   for i := 0 to ControlCount - 1 do
  190.   begin
  191.     if Controls[i].Visible
  192.     then
  193.       begin
  194.         VisibleControls.Add(Controls[i]);
  195.         Controls[i].Visible := False;
  196.       end;
  197.   end;
  198. end;
  199. procedure TbsSkinPanel.CMEnabledChanged;
  200. begin
  201.   inherited;
  202.   RePaint;
  203. end;
  204. procedure TbsSkinPanel.SetNumGlyphs;
  205. begin
  206.   FNumGlyphs := Value;
  207.   RePaint;
  208. end;
  209. procedure TbsSkinPanel.SetGlyph;
  210. begin
  211.   FGlyph.Assign(Value);
  212.   RePaint;
  213. end;
  214. procedure TbsSkinPanel.SetSpacing;
  215. begin
  216.   FSpacing := Value;
  217.   RePaint;
  218. end;
  219. procedure TbsSkinPanel.SetDefaultAlignment(Value: TAlignment);
  220. begin
  221.   FDefaultAlignment := Value;
  222.   if (FIndex = -1) and FCaptionMode then RePaint;
  223. end;
  224. procedure TbsSkinPanel.SetDefaultCaptionHeight;
  225. begin
  226.   FDefaultCaptionHeight := Value;
  227.   if (FIndex = -1) and FCaptionMode
  228.   then
  229.     begin
  230.       RePaint;
  231.       ReAlign;
  232.     end
  233. end;
  234. procedure TbsSkinPanel.SetBorderStyle;
  235. begin
  236.   FBorderStyle := Value;
  237.   if FIndex = -1
  238.   then
  239.     begin
  240.       RePaint;
  241.       ReAlign;
  242.     end;
  243. end;
  244. procedure TbsSkinPanel.SetRollUpMode(Value: Boolean);
  245. begin
  246.   FRollUpMode := Value;
  247.   if (FIndex = -1) and CaptionMode then RePaint;
  248. end;
  249. procedure TbsSkinPanel.CreateControlDefaultImage;
  250. function GetGlyphTextWidth: Integer;
  251. begin
  252.   Result := B.Canvas.TextWidth(Caption);
  253.   if not FGlyph.Empty then Result := Result + FGlyph.Width div FNumGlyphs + FSpacing;
  254. end;
  255. var
  256.   R, CR: TRect;
  257.   TX, TY, CS: Integer;
  258.   GX, GY: Integer;
  259.   GlyphNum: Integer;
  260. begin
  261.   inherited;
  262.   R := Rect(0, 0, Width, Height);
  263.   case FBorderStyle of
  264.     bvLowered:
  265.       Frame3D(B.Canvas, R, clBtnShadow, clBtnHighLight, 1);
  266.     bvRaised:
  267.       Frame3D(B.Canvas, R, clBtnHighLight, clBtnShadow, 1);
  268.     bvFrame:
  269.       Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  270.   end;
  271.   if FCaptionMode
  272.   then
  273.     begin
  274.       if FBorderStyle = bvFrame
  275.       then
  276.         begin
  277.           R := Rect(0, 0, Width, FDefaultCaptionHeight);
  278.           Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  279.           Frame3D(B.Canvas, R, clBtnHighLight, clBtnFace, 1);
  280.         end
  281.       else
  282.         begin
  283.           R := Rect(1, 1, Width - 1, FDefaultCaptionHeight);
  284.           Frame3D(B.Canvas, R, clBtnShadow, clBtnHighLight, 1);
  285.           Frame3D(B.Canvas, R, clBtnHighLight, clBtnShadow, 1);
  286.         end;
  287.       if FCheckedMode
  288.       then
  289.         Inc(R.Left, 20);
  290.       if RollUpMode
  291.       then
  292.         Dec(R.Right, 10);
  293.       with B.Canvas do
  294.       begin
  295.         Font.Assign(FDefaultFont);
  296.         if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  297.         then
  298.           Font.Charset := SkinData.ResourceStrData.CharSet;
  299.         TY := R.Top + RectHeight(R) div 2 - TextHeight(Caption) div 2;
  300.         TX := R.Left + 2;
  301.         case FDefaultAlignment of
  302.           taCenter: TX := TX + RectWidth(R) div 2 - GetGlyphTextWidth div 2;
  303.           taRightJustify: TX := R.Right - GetGlyphTextWidth;
  304.         end;
  305.         if FCheckedMode
  306.         then
  307.           begin
  308.             CS := 14;
  309.             CR.Left := 5;
  310.             CR.Top := R.Top + RectHeight(R) div 2 - CS div 2;
  311.             CR.Right := CR.Left + CS;
  312.             CR.Bottom := CR.Top + CS;
  313.             Frame3D(B.Canvas, CR, clBtnShadow, clBtnShadow, 1);
  314.             if FChecked then DrawCheckImage(B.Canvas, CR.Left + 3, CR.Top + 2,
  315.             clBtnText);
  316.           end;
  317.         if not FGlyph.Empty
  318.         then
  319.           begin
  320.             GY := R.Top + RectHeight(R) div 2 - FGlyph.Height div 2;
  321.             GX := TX;
  322.             TX := GX + FGlyph.Width div FNumGlyphs + FSpacing;
  323.             GlyphNum := 1;
  324.             if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  325.           end;
  326.         Brush.Style := bsClear;
  327.         TextRect(R, TX, TY, Caption);
  328.         if not FGlyph.Empty
  329.         then DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  330.       end;
  331.       if FRollUpMode
  332.       then
  333.         begin
  334.           R.Left := R.Right;
  335.           R.Right := R.Left + 10;
  336.           if FRollUpState
  337.           then DrawArrowImage(B.Canvas, R, clBtnText, 4)
  338.           else DrawArrowImage(B.Canvas, R, clBtnText, 3);
  339.         end;
  340.   end;
  341. end;
  342. procedure TbsSkinPanel.MouseUp;
  343. begin
  344.   if (FRollUpMode or FCheckedMode) and FCaptionMode and (Button = mbLeft)
  345.   then
  346.     begin
  347.       if ((FIndex <> -1) and (PointInRect(NewCaptionRect, Point(X, Y)) or
  348.                               PointInRect(NewRollUpMarkerRect, Point(X, Y))))
  349.          or
  350.          ((FIndex = -1) and PointInRect(Rect(1, 1, Width - 1, FDefaultCaptionHeight),
  351.            Point(X, Y)))
  352.       then
  353.         begin
  354.           if CheckedMode
  355.           then
  356.             Checked := not Checked;
  357.           if RollUpMode
  358.           then
  359.             RollUpState := not FRollUpState;
  360.         end;
  361.     end;
  362.   inherited;
  363. end;
  364. procedure TbsSkinPanel.DoRollUp(ARollUp: Boolean);
  365. begin
  366.   if FIndex <> -1
  367.   then
  368.     begin
  369.       if ARollUp and (FRealHeight = -1)
  370.       then
  371.         begin
  372.           FRealHeight := Height;
  373.           if VisibleControls = nil then HideControls;
  374.           Height := NewClRect.Top + (Height - NewClRect.Bottom);
  375.         end
  376.       else
  377.         if not ARollUp and (FRealHeight <> -1)
  378.         then
  379.           begin
  380.             Height := FRealHeight;
  381.             FRealHeight := -1;
  382.             if VisibleControls <> nil then ShowControls;
  383.           end;
  384.     end
  385.   else
  386.     begin
  387.       if ARollUp and (FRealHeight = -1)
  388.       then
  389.         begin
  390.           FRealHeight := Height;
  391.           if VisibleControls = nil then HideControls;
  392.           Height := FDEfaultCaptionHeight + 1;
  393.         end
  394.       else
  395.         if not ARollUp and (FRealHeight <> -1)
  396.         then
  397.           begin
  398.             Height := FRealHeight;
  399.             FRealHeight := -1;
  400.             if VisibleControls <> nil then ShowControls;
  401.           end;
  402.     end;
  403. end;
  404. procedure TbsSkinPanel.SetRollUpState;
  405. begin
  406.   if FRollUpState = Value then Exit; 
  407.   if FRollUpMode
  408.   then
  409.     begin
  410.       FRollUpState := Value;
  411.       DoRollUp(FRollUpState);
  412.     end
  413.   else
  414.     FRollUpState := False;
  415. end;
  416. procedure TbsSkinPanel.SetCaptionMode;
  417. begin
  418.   FCaptionMode := Value;
  419.   RePaint;
  420.   ReAlign;
  421. end;
  422. procedure TbsSkinPanel.SetBounds;
  423. begin
  424.   inherited;
  425.   if FIndex = -1 then RePaint;
  426. end;
  427. procedure TbsSkinPanel.GetSkinData;
  428. begin
  429.   inherited;
  430.   BGPictureIndex := -1;
  431.   if FIndex <> -1
  432.   then
  433.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinPanelControl
  434.     then
  435.       with TbsDataSkinPanelControl(FSD.CtrlList.Items[FIndex]) do
  436.       begin
  437.         Self.CaptionRect := CaptionRect;
  438.         Self.Alignment := Alignment;
  439.         Self.FontName := FontName;
  440.         Self.FontColor := FontColor;
  441.         Self.FontStyle := FontStyle;
  442.         Self.FontHeight := FontHeight;
  443.         Self.BGPictureIndex := BGPictureIndex;
  444.         Self.CheckImageRect := CheckImageRect;
  445.         Self.UnCheckImageRect := UnCheckImageRect; 
  446.       end;
  447. end;
  448. procedure TbsSkinPanel.AdjustClientRect(var Rect: TRect);
  449. begin
  450.   inherited AdjustClientRect(Rect);
  451.   if (FIndex <> -1) and not (csDesigning in ComponentState)
  452.   then
  453.     begin
  454.       if (BGPictureIndex = -1) and not ((BorderStyle = bvNone) and not CaptionMode and
  455.          (ResizeMode = 1))
  456.       then Rect := NewClRect;
  457.     end
  458.   else
  459.     begin
  460.       if FBorderStyle <> bvNone then InflateRect(Rect, -1, -1);
  461.       if FCaptionMode then Rect.Top := Rect.Top + FDefaultCaptionHeight;
  462.     end;
  463. end;
  464. procedure TbsSkinPanel.CreateControlSkinImage;
  465. function GetGlyphTextWidth: Integer;
  466. begin
  467.   Result := B.Canvas.TextWidth(Caption);
  468.   if not FGlyph.Empty then Result := Result + FGlyph.Width div FNumGlyphs + FSpacing;
  469. end;
  470. procedure DrawCaption;
  471. var
  472.   TX, TY, GX, GY, CW, CH: Integer;
  473.   GlyphNum: Integer;
  474.   CR, CapRect, R: TRect;
  475. begin
  476.   CapRect := NewCaptionRect;
  477.   if FRollUpMode then Dec(CapRect.Right, 12);
  478.   if FCheckedMode
  479.   then
  480.     begin
  481.       CW := RectWidth(CheckImageRect);
  482.       CH := RectHeight(CheckImageRect);
  483.       CR.Left := CapRect.Left;
  484.       CR.Top := CapRect.Top + RectHeight(CapRect) div 2 - CH div 2;
  485.       CR.Right := CR.Left + CW;
  486.       CR.Bottom := CR.Top + CH;
  487.       if FChecked
  488.       then
  489.         SkinDrawCheckImage(CR.Left, CR.Top, Picture.Canvas, CheckImageRect, B.Canvas)
  490.       else
  491.         SkinDrawCheckImage(CR.Left, CR.Top, Picture.Canvas, UnCheckImageRect, B.Canvas);
  492.       Inc(CapRect.Left, CW + 2);
  493.     end;
  494.   with B.Canvas do
  495.   begin
  496.     if FUseSkinFont
  497.     then
  498.       begin
  499.         Font.Name := FontName;
  500.         Font.Height := FontHeight;
  501.         Font.Style := FontStyle;
  502.       end
  503.     else
  504.       Font.Assign(FDefaultFont);
  505.    if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  506.    then
  507.      Font.Charset := SkinData.ResourceStrData.CharSet
  508.    else
  509.      Font.CharSet := FDefaultFont.Charset;
  510.     Font.Color := FontColor;
  511.     TY := CapRect.Top +
  512.       RectHeight(CapRect) div 2 - TextHeight(Caption) div 2;
  513.     TX := CapRect.Left;
  514.     case Alignment of
  515.       taCenter: TX := TX +
  516.         RectWidth(CapRect) div 2 - GetGlyphTextWidth div 2;
  517.       taRightJustify: TX := CapRect.Right - GetGlyphTextWidth;
  518.     end;
  519.     Brush.Style := bsClear;
  520.     if not FGlyph.Empty
  521.     then
  522.       begin
  523.         GY := CapRect.Top + RectHeight(CapRect) div 2 - FGlyph.Height div 2;
  524.         GX := TX;
  525.         TX := GX + FGlyph.Width div FNumGlyphs + FSpacing;
  526.         GlyphNum := 1;
  527.         if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  528.        end;
  529.      if FRollUpMode
  530.      then
  531.        begin
  532.          R := CapRect;
  533.          R.Left := R.Right;
  534.          R.Right := R.Right + 10;
  535.          if FRollUpState
  536.          then DrawArrowImage(B.Canvas, R, FontColor, 4)
  537.          else DrawArrowImage(B.Canvas, R, FontColor, 3);
  538.        end;
  539.     TextRect(CapRect, TX, TY, Caption);
  540.     if not FGlyph.Empty
  541.     then DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  542.   end;
  543. end;
  544. var
  545.   X, Y, XCnt, YCnt, XO, YO, w, h, w1, h1: Integer;
  546. begin
  547.   if (BorderStyle = bvNone) and (ResizeMode = 1) and not CaptionMode
  548.   then
  549.     with B.Canvas do
  550.     begin
  551.       w1 := Width;
  552.       h1 := Height;
  553.       w := RectWidth(ClRect);
  554.       h := RectHeight(ClRect);
  555.       XCnt := w1 div w;
  556.       YCnt := h1 div h;
  557.       for X := 0 to XCnt do
  558.       for Y := 0 to YCnt do
  559.       begin
  560.         if X * w + w > w1 then XO := X * w + w - w1 else XO := 0;
  561.         if Y * h + h > h1 then YO := Y * h + h - h1 else YO := 0;
  562.         CopyRect(Rect(X * w, Y * h, X * w + w - XO, Y * h + h - YO),
  563.                  Picture.Canvas,
  564.                  Rect(SkinRect.Left + ClRect.Left, SkinRect.Top + ClRect.Top,
  565.                  SkinRect.Left + ClRect.Right - XO,
  566.                  SkinRect.Top + ClRect.Bottom - YO));
  567.       end;           
  568.     end
  569.   else
  570.     begin
  571.       inherited;
  572.       if ResizeMode > 0
  573.       then NewCaptionRect := GetNewRect(CaptionRect)
  574.       else NewCaptionRect := CaptionRect;
  575.       if (Caption <> '') and not IsNullRect(CaptionRect)
  576.       then DrawCaption;
  577.     end;
  578. end;
  579. procedure TbsSkinPanel.Paint;
  580. var
  581.   RealPicture: TBitMap;
  582.   X, Y, XCnt, YCnt: Integer;
  583. begin
  584.   GetSkinData;
  585.   if FIndex =-1
  586.   then
  587.     inherited
  588.   else
  589.   if BGPictureIndex <> -1
  590.   then
  591.     begin
  592.       RealPicture := TBitMap(FSD.FActivePictures.Items[BGPictureIndex]);
  593.       if (Width > 0) and (Height > 0)
  594.       then
  595.         begin
  596.           XCnt := Width div RealPicture.Width;
  597.           YCnt := Height div RealPicture.Height;
  598.           for X := 0 to XCnt do
  599.           for Y := 0 to YCnt do
  600.           Canvas.Draw(X * RealPicture.Width, Y * RealPicture.Height, RealPicture);
  601.         end;
  602.     end
  603.   else
  604.     inherited;
  605. end;
  606. procedure TbsSkinPanel.ChangeSkinData;
  607. var
  608.   TempOldHeight: Integer;
  609. begin
  610.   inherited;
  611.   if FRollUpState
  612.   then
  613.     begin
  614.       TempOldHeight := FRealHeight;
  615.       FRealHeight := -1;
  616.       DoRollUp(True);
  617.       FRealHeight := TempOldHeight;
  618.     end
  619.   else
  620.     ReAlign;
  621. end;
  622. procedure TbsSkinPanel.CMTextChanged;
  623. begin
  624.   if FCaptionMode then RePaint;
  625. end;
  626. procedure TbsSkinPanel.CreateParams(var Params: TCreateParams);
  627. begin
  628.   inherited CreateParams(Params);
  629.   with Params do
  630.   begin
  631.     WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
  632.   end;
  633. end;
  634. constructor TbsSkinGroupBox.Create;
  635. begin
  636.   inherited;
  637.   FSkinDataName := 'groupbox';
  638.   CaptionMode := True;
  639. end;
  640. constructor TbsSkinToolBar.Create;
  641. begin
  642.   inherited;
  643.   FSkinDataName := 'toolpanel';
  644.   FCanScroll := False;
  645.   DefaultHeight := 25;
  646.   BorderStyle := bvNone;
  647.   FAutoShowHideCaptions := False;
  648.   FShowCaptions := False;
  649.   FWidthWithCaptions := 0;
  650.   FWidthWithoutCaptions := 0;
  651.   // scroll
  652.   FHotScroll := False;
  653.   TimerMode := 0;
  654.   ButtonData := nil;
  655.   FScrollOffset := 0;
  656.   FScrollTimerInterval := 50;
  657.   Buttons[0].Visible := False;
  658.   Buttons[1].Visible := False;
  659.   FHSizeOffset := 0;
  660.   SMax := 0;
  661.   SPosition := 0;
  662.   SOldPosition := 0;
  663.   SPage := 0;
  664.   //
  665. end;
  666. procedure TbsSkinToolBar.CreateControlSkinImage(B: TBitMap);
  667. begin
  668.   if ((Buttons[0].Visible) or (Buttons[1].Visible)) and (ResizeMode = 2) 
  669.   then
  670.     begin
  671.       CreateHSkinImage3(LTPt.X, RectWidth(SkinRect) - RTPt.X,
  672.           B, Picture, SkinRect, Width, Height);
  673.     end
  674.   else
  675.     inherited;
  676. end;
  677. procedure TbsSkinToolBar.SetBounds;
  678. var
  679.   MaxWidth, OldWidth: Integer;
  680. begin
  681.   OldWidth := Width;
  682.   inherited;
  683.   if not FCanScroll then Exit;
  684.   if (OldWidth <> Width)
  685.   then
  686.     begin
  687.       if (OldWidth < Width) and (OldWidth <> 0)
  688.       then FHSizeOffset := Width - OldWidth
  689.       else FHSizeOffset := 0;
  690.     end
  691.   else
  692.     FHSizeOffset := 0;
  693.   if Align <> alNone then GetScrollInfo;
  694. end;
  695. procedure TbsSkinToolBar.StartTimer;
  696. begin
  697.   KillTimer(Handle, 1);
  698.   SetTimer(Handle, 1, Self.ScrollTimerInterval, nil);
  699. end;
  700. procedure TbsSkinToolBar.StopTimer;
  701. begin
  702.   KillTimer(Handle, 1);
  703.   TimerMode := 0;
  704. end;
  705. procedure TbsSkinToolBar.AdjustClientRect(var Rect: TRect);
  706. var
  707.   RLeft, RTop, VMax, HMax: Integer;
  708. begin
  709.   inherited;
  710.   if FCanScroll and (Buttons[0].Visible) or (Buttons[1].Visible)
  711.   then
  712.     begin
  713.       RTop := 0;
  714.       RLeft := - SPosition;
  715.       HMax := Max(SMax, ClientWidth);
  716.       VMax := ClientHeight;
  717.       Rect := Bounds(RLeft, RTop,  HMax, VMax);
  718.       if (FIndex <> -1) and not (csDesigning in ComponentState)
  719.       then
  720.         begin
  721.           Rect.Top := NewClRect.Top;
  722.           Rect.Bottom := NewClRect.Bottom;
  723.         end
  724.      else
  725.        begin
  726.           Rect.Top := 1;
  727.           Rect.Bottom := Rect.Bottom - 1;
  728.        end;
  729.     end;
  730. end;
  731. procedure TbsSkinToolBar.HScrollControls(AOffset: Integer);
  732. begin
  733.   ScrollBy(-AOffset, 0);
  734. end;
  735. procedure TbsSkinToolBar.GetScrollInfo;
  736. begin
  737.   GetHRange;
  738. end;
  739. procedure TbsSkinToolBar.GetHRange;
  740. var
  741.   i, FMax, W, MaxRight, Offset: Integer;
  742. begin
  743.   MaxRight := 0;
  744.   if ControlCount > 0
  745.   then
  746.   for i := 0 to ControlCount - 1 do
  747.   with Controls[i] do
  748.   begin
  749.    if Visible
  750.    then
  751.      if Left + Width > MaxRight then MaxRight := left + Width;
  752.   end;
  753.   if MaxRight = 0
  754.   then
  755.     begin
  756.       if Buttons[1].Visible then SetButtonsVisible(False);
  757.       Exit;
  758.     end;
  759.   W := ClientWidth;
  760.   FMax := MaxRight + SPosition;
  761.   if (FMax > W)
  762.   then
  763.     begin
  764.       if not Buttons[1].Visible then  SetButtonsVisible(True);
  765.       if (SPosition > 0) and (MaxRight < W) and (FHSizeOffset > 0)
  766.       then
  767.         begin
  768.           if FHSizeOffset > SPosition then FHSizeOffset := SPosition;
  769.           SMax := FMax - 1;
  770.           SPosition := SPosition - FHSizeOffset;
  771.           SPage := W;
  772.           HScrollControls(-FHSizeOffset);
  773.           SOldPosition := SPosition;
  774.         end
  775.      else
  776.        begin
  777.          if (FHSizeOffset = 0) and ((FMax - 1) < SMax) and (SPosition > 0) and
  778.             (MaxRight < W)
  779.          then
  780.            begin
  781.              Offset := SMax - (FMax - 1);
  782.              Offset := Offset + (SMax - SPage + 1) + SPosition;
  783.              if Offset > SPosition then  Offset := SPosition;
  784.              HScrollControls(-Offset);
  785.              SMax := FMax - 1;
  786.              SPosition := SPosition - Offset;
  787.              SPage := W;
  788.            end
  789.          else
  790.            begin
  791.              SMax := FMax - 1;
  792.              SPage := W;
  793.            end;
  794.           FHSizeOffset := 0;
  795.           SOldPosition := SPosition;
  796.         end;
  797.     end
  798.   else
  799.     begin
  800.       if SPosition > 0 then HScrollControls(-SPosition);
  801.       FHSizeOffset := 0;
  802.       SMax := 0;
  803.       SPosition := 0;
  804.       SPage := 0;
  805.       if Buttons[1].Visible then SetButtonsVisible(False);
  806.    end;
  807. end;
  808. procedure TbsSkinToolBar.ButtonUp(I: Integer);
  809. begin
  810.   case I of
  811.     0:
  812.       begin
  813.         StopTimer;
  814.         TimerMode := 0;
  815.         ButtonClick(0);
  816.       end;
  817.     1:
  818.       begin
  819.         StopTimer;
  820.         TimerMode := 0;
  821.         ButtonClick(1);
  822.       end;
  823.   end;
  824. end;
  825. procedure TbsSkinToolBar.ButtonDown(I: Integer);
  826. begin
  827.   case I of
  828.     0:
  829.       begin
  830.         TimerMode := 1;
  831.         StartTimer;
  832.       end;
  833.     1:
  834.       begin
  835.         TimerMode := 2;
  836.         StartTimer;
  837.       end;
  838.   end;
  839. end;
  840. procedure TbsSkinToolBar.ButtonClick;
  841. var
  842.   SOffset: Integer;
  843. begin
  844.   if FScrollOffset = 0
  845.   then
  846.     SOffset := ClientWidth
  847.   else
  848.     SOffset := FScrollOffset;
  849.   case I of
  850.     0:
  851.         begin
  852.           SPosition := SPosition - SOffset;
  853.           if SPosition < 0 then SPosition := 0;
  854.           if (SPosition - SOldPosition <> 0)
  855.           then
  856.             HScrollControls(SPosition - SOldPosition)
  857.           else
  858.             StopTimer;
  859.         end;
  860.     1:
  861.         begin
  862.           SPosition := SPosition + SOffset;
  863.           if SPosition > SMax - SPage + 1 then SPosition := SMax - SPage + 1;
  864.           if (SPosition - SOldPosition <> 0)
  865.           then
  866.             HScrollControls(SPosition - SOldPosition)
  867.           else
  868.             StopTimer;
  869.         end;
  870.   end;
  871. end;
  872. procedure TbsSkinToolBar.SetButtonsVisible;
  873. begin
  874.   if Buttons[0].Visible <> AVisible
  875.   then
  876.     begin
  877.       Buttons[0].Visible := AVisible;
  878.       Buttons[1].Visible := AVisible;
  879.       ReCreateWnd;
  880.     end;
  881. end;
  882. procedure TbsSkinToolBar.WndProc;
  883. var
  884.   B: Boolean;
  885.   P: TPoint;
  886. begin
  887.   B := True;
  888.   case Message.Msg of
  889.     WM_WINDOWPOSCHANGING:
  890.       if Self.HandleAllocated and (Align = alNone)
  891.       then
  892.         GetScrollInfo;
  893.     WM_NCHITTEST:
  894.       if not (csDesigning in ComponentState) and FCanScroll then
  895.       begin
  896.         P.X := LoWord(Message.lParam);
  897.         P.Y := HiWord(Message.lParam);
  898.         P := ScreenToClient(P);
  899.         if (P.X < 0) and Buttons[0].Visible
  900.         then
  901.           begin
  902.             Message.Result := HTBUTTON1;
  903.             B := False;
  904.           end
  905.         else
  906.         if (P.X > ClientWidth) and Buttons[1].Visible
  907.         then
  908.           begin
  909.             Message.Result := HTBUTTON2;
  910.             B := False;
  911.           end;
  912.       end;
  913.     WM_NCLBUTTONDOWN, WM_NCLBUTTONDBLCLK:
  914.        if FCanScroll then
  915.        begin
  916.          if Message.wParam = HTBUTTON1
  917.          then
  918.            begin
  919.              Buttons[0].Down := True;
  920.              SendMessage(Handle, WM_NCPAINT, 0, 0);
  921.              ButtonDown(0);
  922.            end
  923.          else
  924.          if Message.wParam = HTBUTTON2
  925.          then
  926.            begin
  927.              Buttons[1].Down := True;
  928.              SendMessage(Handle, WM_NCPAINT, 0, 0);
  929.              ButtonDown(1);
  930.            end;
  931.        end;
  932.     WM_NCLBUTTONUP:
  933.        if FCanScroll then
  934.        begin
  935.          if Message.wParam = HTBUTTON1
  936.          then
  937.            begin
  938.              Buttons[0].Down := False;
  939.              SendMessage(Handle, WM_NCPAINT, 0, 0);
  940.              ButtonUp(0);
  941.            end
  942.          else
  943.          if Message.wParam = HTBUTTON2
  944.          then
  945.            begin
  946.              Buttons[1].Down := False;
  947.              SendMessage(Handle, WM_NCPAINT, 0, 0);
  948.              ButtonUp(1);
  949.            end;
  950.        end;
  951.      WM_NCMOUSEMOVE:
  952.        if FCanScroll then
  953.        begin
  954.          if (Message.wParam = HTBUTTON1) and (not Buttons[0].MouseIn)
  955.          then
  956.            begin
  957.              Buttons[0].MouseIn := True;
  958.              Buttons[1].MouseIn := False;
  959.              SendMessage(Handle, WM_NCPAINT, 0, 0);
  960.              if FHotScroll
  961.              then
  962.                begin
  963.                  TimerMode := 1;
  964.                  StartTimer;
  965.                end;
  966.            end
  967.          else
  968.          if (Message.wParam = HTBUTTON2) and (not Buttons[1].MouseIn)
  969.          then
  970.            begin
  971.              Buttons[1].MouseIn := True;
  972.              Buttons[0].MouseIn := False;
  973.              SendMessage(Handle, WM_NCPAINT, 0, 0);
  974.              if FHotScroll
  975.              then
  976.                begin
  977.                  TimerMode := 2;
  978.                  StartTimer;
  979.                end;
  980.            end;
  981.        end;
  982.     WM_MOUSEMOVE:
  983.       begin
  984.         if Buttons[0].MouseIn and Buttons[0].Visible
  985.         then
  986.           begin
  987.             if TimerMode <> 0 then StopTimer;
  988.             Buttons[0].MouseIn := False;
  989.             SendMessage(Handle, WM_NCPAINT, 0, 0);
  990.           end
  991.         else
  992.         if Buttons[1].MouseIn and Buttons[1].Visible
  993.         then
  994.           begin
  995.             if TimerMode <> 0 then StopTimer;
  996.             Buttons[1].MouseIn := False;
  997.             SendMessage(Handle, WM_NCPAINT, 0, 0);
  998.           end;
  999.       end;
  1000.   end;
  1001.   if B then inherited;
  1002. end;
  1003. procedure TbsSkinToolBar.CMMOUSELEAVE;
  1004. var
  1005.   P: TPoint;
  1006. begin
  1007.   inherited;
  1008.   if (csDesigning in ComponentState) or not FCanScroll then Exit;
  1009.   GetCursorPos(P);
  1010.   if WindowFromPoint(P) <> Handle
  1011.   then
  1012.     if Buttons[0].MouseIn and Buttons[0].Visible
  1013.     then
  1014.       begin
  1015.         if TimerMode <> 0 then StopTimer;
  1016.         Buttons[0].MouseIn := False;
  1017.         SendMessage(Handle, WM_NCPAINT, 0, 0);
  1018.       end
  1019.     else
  1020.       if Buttons[1].MouseIn and Buttons[1].Visible
  1021.       then
  1022.         begin
  1023.           if TimerMode <> 0 then StopTimer;
  1024.           Buttons[1].MouseIn := False;
  1025.           SendMessage(Handle, WM_NCPAINT, 0, 0);
  1026.         end;
  1027. end;
  1028. procedure TbsSkinToolBar.WMSIZE;
  1029. begin
  1030.   inherited;
  1031.   if FCanScroll and (Buttons[0].Visible or Buttons[1].Visible)
  1032.   then
  1033.     begin
  1034.       Buttons[0].R := Rect(0, 0, ButtonSize, Height);
  1035.       Buttons[1].R := Rect(Width - ButtonSize, 0, Width, Height);
  1036.       SendMessage(Handle, WM_NCPAINT, 0, 0);
  1037.     end;  
  1038. end;
  1039. procedure TbsSkinToolBar.WMNCPaint;
  1040. var
  1041.   Cnvs: TCanvas;
  1042.   DC: HDC;
  1043. begin
  1044.   if FCanScroll and (Buttons[0].Visible or Buttons[1].Visible)
  1045.   then
  1046.     begin
  1047.       DC := GetWindowDC(Handle);
  1048.       Cnvs := TCanvas.Create;
  1049.       Cnvs.Handle := DC;
  1050.       if Buttons[0].Visible then DrawButton(Cnvs, 0);
  1051.       if Buttons[1].Visible then DrawButton(Cnvs, 1);
  1052.       Cnvs.Handle := 0;
  1053.       ReleaseDC(Handle, DC);
  1054.       Cnvs.Free;
  1055.     end;  
  1056. end;
  1057. procedure TbsSkinToolBar.WMNCCALCSIZE;
  1058. begin
  1059.   if FCanScroll
  1060.   then
  1061.     begin
  1062.       GetSkinData;
  1063.       with TWMNCCALCSIZE(Message).CalcSize_Params^.rgrc[0] do
  1064.       begin
  1065.         if Buttons[0].Visible then Inc(Left, ButtonSize);
  1066.         if Buttons[1].Visible then Dec(Right, ButtonSize);
  1067.       end;
  1068.     end;  
  1069. end;
  1070. procedure TbsSkinToolBar.GetSkinData;
  1071. var
  1072.   CIndex: Integer;
  1073. begin
  1074.   inherited;
  1075.   ButtonData := nil;
  1076.   if FIndex <> -1
  1077.   then
  1078.     begin
  1079.       CIndex := FSD.GetControlIndex('resizebutton');
  1080.       if CIndex <> -1
  1081.       then
  1082.        ButtonData := TbsDataSkinButtonControl(FSD.CtrlList[CIndex]);
  1083.     end;   
  1084. end;
  1085. procedure TbsSkinToolBar.WMTimer;
  1086. begin
  1087.   inherited;
  1088.   if FCanScroll then
  1089.   case TimerMode of
  1090.     1: ButtonClick(0);
  1091.     2: ButtonClick(1);
  1092.   end;    
  1093. end;
  1094. procedure TbsSkinToolBar.SetScrollTimerInterval;
  1095. begin
  1096.   if Value > 0 then FScrollTimerInterval := Value;
  1097. end;
  1098. procedure TbsSkinToolBar.SetScrollOffset;
  1099. begin
  1100.   if Value >= 0 then FScrollOffset := Value;
  1101. end;
  1102. procedure TbsSkinToolBar.DrawButton;
  1103. var
  1104.   B: TBitMap;
  1105.   R, NewCLRect: TRect;
  1106.   FSkinPicture: TBitMap;
  1107.   NewLtPoint, NewRTPoint, NewLBPoint, NewRBPoint: TPoint;
  1108.   XO, YO: Integer;
  1109.   C: TColor;
  1110. begin
  1111.   B := TBitMap.Create;
  1112.   B.Width := RectWidth(Buttons[i].R);
  1113.   B.Height := RectHeight(Buttons[i].R);
  1114.   R := Rect(0, 0, B.Width, B.Height);
  1115.   GetSkinData;
  1116.   if ButtonData = nil
  1117.   then
  1118.     begin
  1119.       C := clBtnText;
  1120.       if ((Buttons[I].Down and Buttons[I].MouseIn)) or
  1121.           (Buttons[I].MouseIn and HotScroll)
  1122.       then
  1123.         begin
  1124.           Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  1125.           B.Canvas.Brush.Color := BS_XP_BTNDOWNCOLOR;
  1126.           B.Canvas.FillRect(R);
  1127.         end
  1128.       else
  1129.       if Buttons[I].MouseIn
  1130.       then
  1131.         begin
  1132.           Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  1133.           B.Canvas.Brush.Color := BS_XP_BTNACTIVECOLOR;
  1134.           B.Canvas.FillRect(R);
  1135.         end
  1136.       else
  1137.         begin
  1138.           Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  1139.           B.Canvas.Brush.Color := clBtnFace;
  1140.           B.Canvas.FillRect(R);
  1141.         end;
  1142.     end
  1143.   else
  1144.     with ButtonData, Buttons[I] do
  1145.     begin
  1146.       //
  1147.       XO := RectWidth(R) - RectWidth(SkinRect);
  1148.       YO := RectHeight(R) - RectHeight(SkinRect);
  1149.       NewLTPoint := LTPoint;
  1150.       NewRTPoint := Point(RTPoint.X + XO, RTPoint.Y);
  1151.       NewLBPoint := Point(LBPoint.X, LBPoint.Y + YO);
  1152.       NewRBPoint := Point(RBPoint.X + XO, RBPoint.Y + YO);
  1153.       NewClRect := Rect(CLRect.Left, ClRect.Top,
  1154.         CLRect.Right + XO, ClRect.Bottom + YO);
  1155.       FSkinPicture := TBitMap(FSD.FActivePictures.Items[ButtonData.PictureIndex]);
  1156.       //
  1157.       if (Down and not IsNullRect(DownSkinRect) and MouseIn) or
  1158.          (MouseIn and HotScroll and not IsNullRect(DownSkinRect))
  1159.       then
  1160.         begin
  1161.           CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
  1162.           NewLtPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  1163.           B, FSkinPicture, DownSkinRect, B.Width, B.Height, True);
  1164.           C := DownFontColor;
  1165.         end
  1166.       else
  1167.       if MouseIn and not IsNullRect(ActiveSkinRect)
  1168.       then
  1169.         begin
  1170.           CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
  1171.           NewLtPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  1172.           B, FSkinPicture, ActiveSkinRect, B.Width, B.Height, True);
  1173.           C := ActiveFontColor;
  1174.         end
  1175.       else
  1176.         begin
  1177.           CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
  1178.           NewLtPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  1179.           B, FSkinPicture, SkinRect, B.Width, B.Height, True);
  1180.           C := FontColor;
  1181.         end;
  1182.    end;
  1183.   //
  1184.   case I of
  1185.     0: DrawArrowImage(B.Canvas, R, C, 1);
  1186.     1: DrawArrowImage(B.Canvas, R, C, 2);
  1187.   end;
  1188.   //
  1189.   Cnvs.Draw(Buttons[I].R.Left, Buttons[I].R.Top, B);
  1190.   B.Free;
  1191. end;
  1192. procedure TbsSkinToolBar.SetShowCaptions(Value: Boolean);
  1193. var
  1194.   I: Integer;
  1195. begin
  1196.   if FShowCaptions <> Value
  1197.   then
  1198.     begin
  1199.       FShowCaptions := Value;
  1200.       if FAutoShowHideCaptions
  1201.       then
  1202.         for I := 0 to ControlCount - 1 do
  1203.           if Controls[I] is TbsSkinSpeedButton
  1204.           then
  1205.             TbsSkinSpeedButton(Controls[I]).ShowCaption := FShowCaptions;
  1206.       if (FWidthWithCaptions <> 0) and (FWidthWithoutCaptions <> 0)
  1207.       then
  1208.         begin
  1209.           if FShowCaptions
  1210.           then Width := FWidthWithCaptions
  1211.           else Width := FWidthWithoutCaptions;
  1212.         end;
  1213.     end;        
  1214. end;
  1215. procedure TbsSkinToolBar.Notification(AComponent: TComponent;
  1216.   Operation: TOperation);
  1217. begin
  1218.   inherited Notification(AComponent, Operation);
  1219.   if Operation = opRemove then
  1220.   begin
  1221.     if AComponent = FImages then Images := nil;
  1222.     if AComponent = FHotImages then HotImages := nil;
  1223.     if AComponent = FDisabledImages then DisabledImages := nil;
  1224.   end;
  1225. end;
  1226. procedure TbsSkinToolBar.SetSkinDataName(Value: String);
  1227. var
  1228.   I: Integer;
  1229. begin
  1230.   inherited;
  1231.   if (csDesigning in ComponentState) and not
  1232.      (csLoading in ComponentState)
  1233.   then    
  1234.   for I := 0 to ControlCount - 1 do
  1235.   if Controls[I] is TbsSkinMenuSpeedButton
  1236.   then
  1237.     with TbsSkinMenuSpeedButton(Controls[I]) do
  1238.     begin
  1239.       if TrackButtonMode
  1240.       then
  1241.         begin
  1242.           if Self.SkinDataName = 'bigtoolpanel'
  1243.           then
  1244.             SkinDataName := 'bigtoolmenutrackbutton'
  1245.           else
  1246.             SkinDataName := 'toolmenutrackbutton';
  1247.         end
  1248.       else
  1249.         begin
  1250.           if Self.SkinDataName = 'bigtoolpanel'
  1251.           then
  1252.             SkinDataName := 'bigtoolmenubutton'
  1253.           else
  1254.             SkinDataName := 'toolmenubutton';
  1255.         end;
  1256.     end
  1257.   else
  1258.   if Controls[I] is TbsSkinSpeedButton
  1259.   then
  1260.     with TbsSkinSpeedButton(Controls[I]) do
  1261.     begin
  1262.       if Self.SkinDataName = 'bigtoolpanel'
  1263.       then
  1264.         SkinDataName := 'bigtoolbutton'
  1265.       else
  1266.         SkinDataName := 'toolbutton';
  1267.     end;
  1268. end;
  1269. procedure TbsSkinToolBar.SetSkinData(Value: TbsSkinData);
  1270. var
  1271.   I: Integer;
  1272. begin
  1273.   inherited;
  1274.   for I := 0 to ControlCount - 1 do
  1275.     if Controls[I] is TbsSkinSpeedButton
  1276.     then
  1277.       TbsSkinSpeedButton(Controls[I]).SkinData := Self.SkinData
  1278.     else
  1279.     if Controls[I] is TbsSkinBevel
  1280.     then
  1281.       TbsSkinBevel(Controls[I]).SkinData := Self.SkinData
  1282. end;
  1283. procedure TbsSkinToolBar.SetFlat(Value: Boolean);
  1284. var
  1285.   I: Integer;
  1286. begin
  1287.   FFlat := Value;
  1288.   for I := 0 to ControlCount - 1 do
  1289.     if Controls[I] is TbsSkinSpeedButton
  1290.      then
  1291.        TbsSkinSpeedButton(Controls[I]).Flat := FFlat;
  1292. end;
  1293. procedure TbsSkinToolBar.SetDisabledImages(Value: TCustomImageList);
  1294. begin
  1295.   FDisabledImages := Value;
  1296. end;
  1297. procedure TbsSkinToolBar.SetHotImages(Value: TCustomImageList);
  1298. begin
  1299.   FHotImages := Value;
  1300. end;
  1301. procedure TbsSkinToolBar.SetImages(Value: TCustomImageList);
  1302. var
  1303.   I: Integer;
  1304. begin
  1305.   FImages := Value;
  1306.   for I := 0 to ControlCount - 1 do
  1307.     if Controls[I] is TbsSkinSpeedButton
  1308.      then
  1309.        TbsSkinSpeedButton(Controls[I]).RePaint;
  1310. end;
  1311. constructor TbsSkinStatusBar.Create;
  1312. begin
  1313.   inherited;
  1314.   FSkinDataName := 'statusbar';
  1315.   Align := alBottom;
  1316.   DefaultHeight := 21;
  1317.   BorderStyle := bvNone;
  1318. end;
  1319. procedure TbsSkinStatusBar.SetSkinData;
  1320. var
  1321.   I: Integer;
  1322. begin
  1323.   inherited;
  1324.   for I := 0 to ControlCount - 1 do
  1325.   if Controls[I] is TbsSkinControl
  1326.   then
  1327.     TbsSkinControl(Controls[I]).SkinData := Self.SkinData
  1328. end;
  1329. //=========== TbsSkinCheckRadioBox ===============
  1330. constructor TbsSkinCheckRadioBox.Create;
  1331. begin
  1332.   inherited;
  1333.   FFlat := True;
  1334.   FCanFocused := True;
  1335.   TabStop := False;
  1336.   FMouseIn := False;
  1337.   Width := 150;
  1338.   Height := 25;
  1339.   FGroupIndex := 0;
  1340.   FSkinDataName := 'checkbox';
  1341.   MorphTimer := nil;
  1342.   FImages := nil;
  1343.   FImageIndex := 0;
  1344. end;
  1345. destructor TbsSkinCheckRadioBox.Destroy;
  1346. begin
  1347.   StopMorph;
  1348.   inherited;
  1349. end;
  1350. procedure TbsSkinCheckRadioBox.Notification(AComponent: TComponent;
  1351.   Operation: TOperation);
  1352. begin
  1353.   inherited Notification(AComponent, Operation);
  1354.   if Operation = opRemove then
  1355.   begin
  1356.     if AComponent = FImages then Images := nil;
  1357.   end;
  1358. end;
  1359. procedure TbsSkinCheckRadioBox.SetImages(Value: TCustomImageList);
  1360. begin
  1361.   FImages := Value;
  1362.   RePaint;
  1363. end;
  1364. procedure TbsSkinCheckRadioBox.SetImageIndex(Value: Integer);
  1365. begin
  1366.   FImageIndex := Value;
  1367.   RePaint;
  1368. end;
  1369. procedure TbsSkinCheckRadioBox.WMMOVE(var Msg: TWMMOVE);
  1370. begin
  1371.   inherited;
  1372.   if FFlat then Invalidate;
  1373. end;
  1374. procedure TbsSkinCheckRadioBox.SkinDrawCheckImage(X, Y: Integer; Cnvs: TCanvas; IR: TRect; DestCnvs: TCanvas);
  1375. var
  1376.   B: TBitMap;
  1377. begin
  1378.   B := TBitMap.Create;
  1379.   B.Width := RectWidth(IR);
  1380.   B.Height := RectHeight(IR);
  1381.   B.Canvas.CopyRect(Rect(0, 0, B.Width, B.Height), Cnvs, IR);
  1382.   B.Transparent := True;
  1383.   DestCnvs.Draw(X, Y, B);
  1384.   B.Free;
  1385. end;
  1386. procedure TbsSkinCheckRadioBox.SetFlat;
  1387. begin
  1388.   FFlat := Value;
  1389.   RePaint;
  1390. end;
  1391. procedure TbsSkinCheckRadioBox.CMEnabledChanged;
  1392. begin
  1393.   inherited;
  1394.   if Morphing
  1395.   then
  1396.     begin
  1397.       StopMorph;
  1398.       FMorphKf := 0;
  1399.     end;
  1400.   FMouseIn := False;
  1401.   RePaint;
  1402. end;
  1403. procedure TbsSkinCheckRadioBox.DoMorph;
  1404. begin
  1405.   if (FIndex = -1) or not Morphing
  1406.   then
  1407.     begin
  1408.       if (FMouseIn or IsFocused) then FMorphKf := 1 else FMorphKf := 0;
  1409.       StopMorph;
  1410.     end
  1411.   else
  1412.   if (FMouseIn or IsFocused) and (FMorphKf < 1)
  1413.   then
  1414.     begin
  1415.       FMorphKf := FMorphKf + MorphInc;
  1416.       RePaint;
  1417.     end
  1418.   else
  1419.   if (not FMouseIn and not IsFocused) and (FMorphKf > 0)
  1420.   then
  1421.     begin
  1422.       FMorphKf := FMorphKf - MorphInc;
  1423.       RePaint;
  1424.     end
  1425.   else
  1426.     begin
  1427.       if (FMouseIn or IsFocused) then FMorphKf := 1 else FMorphKf := 0;
  1428.       StopMorph;
  1429.       RePaint;
  1430.     end;
  1431. end;
  1432. procedure TbsSkinCheckRadioBox.StartMorph;
  1433. begin
  1434.   if MorphTimer <> nil then Exit;
  1435.   MorphTimer := TTimer.Create(Self);
  1436.   MorphTimer.Interval := MorphTimerInterval;
  1437.   MorphTimer.OnTimer := DoMorph;
  1438.   MorphTimer.Enabled := True;
  1439. end;
  1440. procedure TbsSkinCheckRadioBox.StopMorph;
  1441. begin
  1442.   if MorphTimer = nil then Exit;
  1443.   MorphTimer.Free;
  1444.   MorphTimer := nil;
  1445. end;
  1446. procedure TbsSkinCheckRadioBox.Paint;
  1447. var
  1448.   Buffer, ABuffer: TBitMap;
  1449.   PBuffer, APBuffer: TbsEffectBmp;
  1450.   IR, TR: TRect;
  1451.   IX, IY: Integer;
  1452.   ImX, ImY: Integer;
  1453.   C: TColor;
  1454. begin
  1455.   GetSkinData;
  1456.   if FFlat
  1457.   then
  1458.     begin
  1459.       Buffer := TBitMap.Create;
  1460.       Buffer.Width := Width;
  1461.       Buffer.Height := Height;
  1462.       GetParentImage(Self, Buffer.Canvas);
  1463.       if FIndex = -1
  1464.       then
  1465.         with Buffer.Canvas do
  1466.         begin
  1467.           IR := Rect(3, Height div 2 - 7, 17, Height div 2 + 7);
  1468.           // draw caption
  1469.           TR := Rect(0, 0, 0, 0);
  1470.           Font := DefaultFont;
  1471.           if (SkinData <> nil) and (SkinData.ResourceStrData <>  nil)
  1472.           then
  1473.             Font.Charset := SkinData.ResourceStrData.CharSet;
  1474.           Brush.Style := bsClear;
  1475.           DrawText(Buffer.Canvas.Handle, PChar(Caption), Length(Caption), TR,
  1476.              DT_CALCRECT);
  1477.           OffsetRect(TR, 22, Height div 2 - RectHeight(TR) div 2);
  1478.           if TR.Right > Width - 2 then TR.Right := Width - 2;
  1479.           if (FImages <> nil) and (ImageIndex >= 0) and (ImageIndex < FImages.Count)
  1480.           then
  1481.             begin
  1482.               ImX := TR.Left;
  1483.               ImY := Height div 2 - FImages.Height div 2;
  1484.               FIMages.Draw(Buffer.Canvas, ImX, ImY, FImageIndex, Enabled);
  1485.               OffsetRect(TR, FImages.Width + 5, 0);
  1486.             end;
  1487.           Brush.Style := bsClear;
  1488.           if not Enabled then Font.Color := clBtnShadow;
  1489.           BSDrawText(Buffer.Canvas, Caption, TR);
  1490.           // draw glyph
  1491.           if FMouseIn
  1492.           then
  1493.             Frame3D(Buffer.Canvas, IR, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1)
  1494.           else
  1495.             Frame3D(Buffer.Canvas, IR, clbtnShadow, clbtnShadow, 1);
  1496.           Pen.Color := clBlack;
  1497.           if FChecked
  1498.           then
  1499.             begin
  1500.               if Enabled then C := clBlack else C := clBtnShadow;
  1501.               if FRadio
  1502.               then DrawRadioImage(Buffer.Canvas, 7, Height div 2 - 3, C)
  1503.               else DrawCheckImage(Buffer.Canvas, 7, Height div 2 - 4, C);
  1504.             end;
  1505.           // draw focus
  1506.           InflateRect(TR, 2, 1);
  1507.           Inc(TR.Right, 1 );
  1508.           Brush.Style := bsSolid;
  1509.           Brush.Color := clBtnFace;
  1510.           if IsFocused
  1511.           then
  1512.             if Caption <> ''
  1513.             then
  1514.               DrawFocusRect(TR)
  1515.             else
  1516.               if (FImages <> nil) and (ImageIndex >= 0) and (ImageIndex < FImages.Count)
  1517.               then
  1518.                 DrawFocusRect(Rect(ImX - 1, ImY - 1,
  1519.                   ImX + FImages.Width + 1, ImY + FImages.Height + 1));
  1520.         end
  1521.       else
  1522.         with Buffer.Canvas do
  1523.         begin
  1524.           // draw glyph
  1525.           IX := 3;
  1526.           IY := Height div 2 - RectHeight(CheckImageRect) div 2;
  1527.           if not Enabled
  1528.           then
  1529.             begin
  1530.               if FChecked
  1531.               then
  1532.                 SkinDrawCheckImage(IX, IY, Picture.Canvas, UnEnabledCheckImageRect, Buffer.Canvas)
  1533.               else
  1534.                 SkinDrawCheckImage(IX, IY, Picture.Canvas, UnEnabledUnCheckImageRect, Buffer.Canvas);
  1535.             end
  1536.           else
  1537.           if FMouseIn
  1538.           then
  1539.             begin
  1540.               if FChecked
  1541.               then
  1542.                 SkinDrawCheckImage(IX, IY, Picture.Canvas, ActiveCheckImageRect, Buffer.Canvas)
  1543.               else
  1544.                 SkinDrawCheckImage(IX, IY, Picture.Canvas, ActiveUnCheckImageRect, Buffer.Canvas);
  1545.             end
  1546.           else
  1547.             begin
  1548.               if FChecked
  1549.               then
  1550.                 SkinDrawCheckImage(IX, IY, Picture.Canvas, CheckImageRect, Buffer.Canvas)
  1551.               else
  1552.                 SkinDrawCheckImage(IX, IY, Picture.Canvas, UnCheckImageRect, Buffer.Canvas);
  1553.             end;
  1554.           // draw caption
  1555.           if FUseSkinFont
  1556.           then
  1557.             begin
  1558.               Font.Name := FontName;
  1559.               Font.Height := FontHeight;
  1560.               Font.Style := FontStyle;
  1561.              end
  1562.           else
  1563.             Font.Assign(FDefaultFont);
  1564.           if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1565.           then
  1566.             Font.Charset := SkinData.ResourceStrData.CharSet
  1567.           else
  1568.             Font.CharSet := FDefaultFont.Charset;
  1569.           TR := Rect(0, 0, 0, 0);
  1570.           DrawText(Buffer.Canvas.Handle, PChar(Caption), Length(Caption), TR,
  1571.              DT_CALCRECT);
  1572.           OffsetRect(TR, IX + RectWidth(CheckIMageRect) + 4, Height div 2 - RectHeight(TR) div 2);
  1573.           if TR.Right > Width - 2 then TR.Right := Width - 2;
  1574.           //
  1575.           if (FImages <> nil) and (ImageIndex >= 0) and (ImageIndex < FImages.Count)
  1576.           then
  1577.             begin
  1578.               ImX := TR.Left;
  1579.               ImY := Height div 2 - FImages.Height div 2;
  1580.               FIMages.Draw(Buffer.Canvas, ImX, ImY, FImageIndex, Enabled);
  1581.               OffsetRect(TR, FImages.Width + 5, 0);
  1582.             end;
  1583.           //
  1584.           Brush.Style := bsClear;
  1585.           if not Enabled
  1586.           then Font.Color := UnEnabledFontColor
  1587.           else Font.Color := FrameFontColor;
  1588.           BSDrawText(Buffer.Canvas, Caption, TR);
  1589.           // drawfocus
  1590.           InflateRect(TR, 2, 1);
  1591.           Inc(TR.Right, 1 );
  1592.           Brush.Style := bsSolid;
  1593.           if IsFocused
  1594.           then
  1595.             if Caption <> ''
  1596.             then
  1597.               DrawFocusRect(TR)
  1598.             else
  1599.               if (FImages <> nil) and (ImageIndex >= 0) and (ImageIndex < FImages.Count)
  1600.               then
  1601.                 DrawFocusRect(Rect(ImX - 1, ImY - 1,
  1602.                   ImX + FImages.Width + 1, ImY + FImages.Height + 1));
  1603.         end;
  1604.       Self.Canvas.Draw(0, 0, Buffer);
  1605.       Buffer.Free;
  1606.     end
  1607.   else
  1608.   if FIndex = -1
  1609.   then
  1610.     inherited
  1611.   else
  1612.     if Morphing and (FMorphKf < 1) and (FMorphKf > 0)
  1613.     then
  1614.       begin
  1615.         Buffer := TBitMap.Create;
  1616.         ABuffer := TBitMap.Create;
  1617.         CreateImage(Buffer, SkinRect, False);
  1618.         CreateImage(ABuffer, ActiveSkinRect, True);
  1619.         PBuffer := TbsEffectBmp.CreateFromhWnd(Buffer.Handle);
  1620.         APBuffer := TbsEffectBmp.CreateFromhWnd(ABuffer.Handle);
  1621.         case MorphKind of
  1622.           mkDefault: PBuffer.Morph(APBuffer, FMorphKf);
  1623.           mkGradient: PBuffer.MorphGrad(APBuffer, FMorphKf);
  1624.           mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, FMorphKf);
  1625.           mkRightGradient: PBuffer.MorphRightGrad(APBuffer, FMorphKf);
  1626.           mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, FMorphKf);
  1627.           mkRightSlide: PBuffer.MorphRightSlide(APBuffer, FMorphKf);
  1628.           mkPush: PBuffer.MorphPush(APBuffer, FMorphKf);
  1629.         end;
  1630.         PBuffer.Draw(Canvas.Handle, 0, 0);
  1631.         PBuffer.Free;
  1632.         APBuffer.Free;
  1633.         Buffer.Free;
  1634.         ABuffer.Free;
  1635.       end
  1636.     else
  1637.       begin
  1638.         Buffer := TBitMap.Create;
  1639.         Buffer.Width := Width;
  1640.         Buffer.Height := Height;
  1641.         if FMouseIn or IsFocused
  1642.         then CreateImage(Buffer, ActiveSkinRect, FMouseIn or IsFocused)
  1643.         else CreateImage(Buffer, SkinRect, FMouseIn or IsFocused);
  1644.         Canvas.Draw(0, 0, Buffer);
  1645.         Buffer.Free;
  1646.      end;
  1647. end;
  1648. function TbsSkinCheckRadioBox.IsFocused;
  1649. begin
  1650.   Result := Focused and FCanFocused;
  1651. end;
  1652. procedure TbsSkinCheckRadioBox.SetCheckState;
  1653. begin
  1654.   if FRadio
  1655.   then
  1656.     begin
  1657.       if not Checked
  1658.       then
  1659.         Checked := True;
  1660.     end
  1661.   else
  1662.     Checked := not FChecked;
  1663. end;
  1664. procedure TbsSkinCheckRadioBox.CMDialogChar;
  1665. begin
  1666.   with Message do
  1667.     if IsAccel(CharCode, Caption) and CanFocus and FCanFocused
  1668.     then
  1669.       begin
  1670.         SetFocus;
  1671.         SetCheckState;
  1672.         Result := 1;
  1673.       end
  1674.     else
  1675.      inherited;
  1676. end;
  1677. procedure TbsSkinCheckRadioBox.SetCanFocused;
  1678. begin
  1679.   FCanFocused := Value;
  1680.   if FCanFocused then TabStop := True else TabStop := False;
  1681. end;
  1682. procedure TbsSkinCheckRadioBox.WMSETFOCUS;
  1683. begin
  1684.   inherited;
  1685.   if FCanFocused
  1686.   then
  1687.     if FFlat then Invalidate else ReDrawControl;
  1688. end;
  1689. procedure TbsSkinCheckRadioBox.WMKILLFOCUS;
  1690. begin
  1691.   inherited;
  1692.   if FCanFocused
  1693.   then
  1694.     if FFlat then Invalidate else ReDrawControl;
  1695. end;
  1696. procedure TbsSkinCheckRadioBox.WndProc(var Message: TMessage);
  1697. begin
  1698.   if FCanFocused then
  1699.   case Message.Msg of
  1700.     WM_KEYUP:
  1701.       if IsFocused then
  1702.         with TWMKeyUp(Message) do
  1703.         begin
  1704.           if CharCode = VK_SPACE then SetCheckState;
  1705.         end;
  1706.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  1707.       if not (csDesigning in ComponentState) and not Focused then
  1708.       begin
  1709.         FClicksDisabled := True;
  1710.         Windows.SetFocus(Handle);
  1711.         FClicksDisabled := False;
  1712.         if not Focused then Exit;
  1713.       end;
  1714.     CN_COMMAND:
  1715.       if FClicksDisabled then Exit;
  1716.   end;
  1717.   inherited WndProc(Message);
  1718. end;
  1719. procedure TbsSkinCheckRadioBox.ActionChange(Sender: TObject; CheckDefaults: Boolean);
  1720. begin
  1721.   inherited ActionChange(Sender, CheckDefaults);
  1722.   if Sender is TCustomAction then
  1723.     with TCustomAction(Sender) do
  1724.     begin
  1725.       if not CheckDefaults or (Self.Checked = False) then
  1726.         Self.Checked := Checked;
  1727.     end;
  1728. end;
  1729. procedure TbsSkinCheckRadioBox.SetRadio;
  1730. begin
  1731.   FRadio := Value;
  1732.   if (csDesigning in ComponentState) and not
  1733.      (csLoading in ComponentState)
  1734.   then
  1735.     begin
  1736.       if FRadio
  1737.       then
  1738.         begin
  1739.           FSkinDataName := 'radiobox';
  1740.           FGroupIndex := 1;
  1741.         end
  1742.       else
  1743.         begin
  1744.           FSkinDataName := 'checkbox';
  1745.           FGroupIndex := 0;
  1746.         end;
  1747.     end;
  1748.   RePaint;
  1749. end;
  1750. procedure TbsSkinCheckRadioBox.CalcSize;
  1751. var
  1752.   NewCIArea: TRect;
  1753.   Offset: Integer;
  1754.   CIW, CIH: Integer;
  1755. begin
  1756.   if FFlat then Exit;
  1757.   inherited;
  1758.   Offset := W - RectWidth(SkinRect);
  1759.   NewTextArea := TextArea;
  1760.   Inc(NewTextArea.Right, Offset);
  1761.   NewCIArea := CheckImageArea;
  1762.   if CheckImageArea.Right > TextArea.Right
  1763.   then
  1764.     OffsetRect(NewCIArea, Offset, 0);
  1765.   CIW := RectWidth(CheckImageRect);
  1766.   CIH := RectHeight(CheckImageRect);
  1767.   CIRect.Left := NewCIArea.Left + RectWidth(NewCIArea) div 2 - CIW div 2;
  1768.   CIRect.Top := NewCIArea.Top + RectHeight(NewCIArea) div 2 - CIH div 2;
  1769.   CIRect.Right := CIRect.Left + CIW;
  1770.   CIRect.Bottom := CIRect.Top + CIH;
  1771. end;
  1772. procedure TbsSkinCheckRadioBox.SetChecked;
  1773. begin
  1774.   FChecked := Value;
  1775.   RePaint;
  1776.   if FChecked and (GroupIndex <> 0) then UnCheckAll;
  1777.   if (FRadio and FChecked) or not FRadio
  1778.   then
  1779.     if Assigned(FOnClick) then FOnClick(Self);
  1780. end;
  1781. procedure TbsSkinCheckRadioBox.ReDrawControl;
  1782. begin
  1783.   if Morphing and (FIndex <> -1)
  1784.   then StartMorph
  1785.   else RePaint;
  1786. end;
  1787. procedure TbsSkinCheckRadioBox.UnCheckAll;
  1788. var
  1789.   PC: TWinControl;
  1790.   i: Integer;
  1791. begin
  1792.   if Parent = nil then Exit;
  1793.   PC := TWinControl(Parent);
  1794.   for i := 0 to PC.ControlCount - 1 do
  1795.    if (PC.Controls[i] is TbsSkinCheckRadioBox) and
  1796.       (PC.Controls[i] <> Self)
  1797.    then
  1798.      with TbsSkinCheckRadioBox(PC.Controls[i]) do
  1799.        if (GroupIndex = Self.GroupIndex) and
  1800.           (GroupIndex <> 0) and Checked
  1801.        then
  1802.          Checked := False;
  1803. end;
  1804. procedure TbsSkinCheckRadioBox.ChangeSkinData;
  1805. begin
  1806.   if FFlat
  1807.   then
  1808.     begin
  1809.       GetSkinData;
  1810.       RePaint;
  1811.     end
  1812.   else
  1813.    inherited;
  1814. end;
  1815. procedure TbsSkinCheckRadioBox.GetSkinData;
  1816. begin
  1817.   inherited;
  1818.   if FIndex <> -1
  1819.   then
  1820.     begin
  1821.       if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinCheckRadioControl
  1822.       then
  1823.         with TbsDataSkinCheckRadioControl(FSD.CtrlList.Items[FIndex]) do
  1824.         begin
  1825.           Self.FontName := FontName;
  1826.           Self.FontColor := FontColor;
  1827.           Self.ActiveFontColor := ActiveFontColor;
  1828.           Self.FrameFontColor := FrameFontColor;
  1829.           Self.UnEnabledFontColor := UnEnabledFontColor;
  1830.           Self.FontStyle := FontStyle;
  1831.           Self.FontHeight := FontHeight;
  1832.           Self.ActiveSkinRect := ActiveSkinRect;
  1833.           if IsNullRect(ActiveSkinRect) then Self.ActiveSkinRect := SkinRect;
  1834.           Self.CheckImageArea := CheckImageArea;
  1835.           Self.TextArea := TextArea;
  1836.           Self.CheckImageRect := CheckImageRect;
  1837.           Self.UnCheckImageRect := UnCheckImageRect;
  1838.           Self.ActiveCheckImageRect := ActiveCheckImageRect;
  1839.           Self.UnEnabledCheckImageRect := UnEnabledCheckImageRect;
  1840.           Self.UnEnabledUnCheckImageRect := UnEnabledUnCheckImageRect;
  1841.           if IsNullRect(UnEnabledCheckImageRect)
  1842.           then
  1843.             Self.UnEnabledCheckImageRect := CheckImageRect;
  1844.           if IsNullRect(UnEnabledUnCheckImageRect)
  1845.           then
  1846.             Self.UnEnabledUnCheckImageRect := UnCheckImageRect;
  1847.           if IsNullRect(ActiveCheckImageRect)
  1848.           then
  1849.             Self.ActiveCheckImageRect := CheckImageRect;
  1850.           Self.ActiveUnCheckImageRect := ActiveUnCheckImageRect;
  1851.           if IsNullRect(ActiveUnCheckImageRect)
  1852.           then
  1853.             Self.ActiveUnCheckImageRect := UnCheckImageRect;
  1854.           Self.Morphing := Morphing;
  1855.           Self.MorphKind := MorphKind;
  1856.           if FFlat
  1857.           then
  1858.             begin
  1859.               Self.Morphing := False;
  1860.               MaskPicture := nil;
  1861.             end;
  1862.         end;
  1863.      end;
  1864. end;
  1865. procedure TbsSkinCheckRadioBox.CreateImage;
  1866. var
  1867.   IX, IY: Integer;
  1868. begin
  1869.   CreateSkinControlImage(B, Picture, R);
  1870.   with B.Canvas do
  1871.   begin
  1872.     IX := CIRect.Left;
  1873.     IY := CIRect.Top + RectHeight(CIRect) div 2 - RectHeight(CheckImageRect) div 2;
  1874.     if not Enabled
  1875.     then
  1876.       begin
  1877.         if FChecked
  1878.         then
  1879.           SkinDrawCheckImage(IX, IY, Picture.Canvas, UnEnabledCheckImageRect, B.Canvas)
  1880.         else
  1881.           SkinDrawCheckImage(IX, IY, Picture.Canvas, UnEnabledUnCheckImageRect, B.Canvas);
  1882.       end
  1883.     else
  1884.     if FMouseIn
  1885.     then
  1886.       begin
  1887.         if FChecked
  1888.         then
  1889.           SkinDrawCheckImage(IX, IY, Picture.Canvas, ActiveCheckImageRect, B.Canvas)
  1890.         else
  1891.           SkinDrawCheckImage(IX, IY, Picture.Canvas, ActiveUnCheckImageRect, B.Canvas);
  1892.       end
  1893.     else
  1894.       begin
  1895.         if FChecked
  1896.         then
  1897.           SkinDrawCheckImage(IX, IY, Picture.Canvas, CheckImageRect, B.Canvas)
  1898.         else
  1899.           SkinDrawCheckImage(IX, IY, Picture.Canvas, UnCheckImageRect, B.Canvas);
  1900.       end;
  1901.     if FUseSkinFont
  1902.     then
  1903.       begin
  1904.         Font.Name := FontName;
  1905.         Font.Height := FontHeight;
  1906.         Font.Style := FontStyle;
  1907.       end
  1908.     else
  1909.       Font.Assign(FDefaultFont);
  1910.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1911.     then
  1912.       Font.Charset := SkinData.ResourceStrData.CharSet
  1913.     else
  1914.       Font.CharSet := FDefaultFont.Charset;
  1915.     if AMouseIn
  1916.     then Font.Color := ActiveFontColor
  1917.     else Font.Color := FontColor;
  1918.     if not Enabled then Font.Color := UnEnabledFontColor;
  1919.     Brush.Style := bsClear;
  1920.   end;
  1921.   BSDrawText(B.Canvas, Caption, NewTextArea);
  1922. end;
  1923. procedure TbsSkinCheckRadioBox.CreateControlDefaultImage(B: TBitMap);
  1924. var
  1925.   R, IR, TR: TRect;
  1926.   C: TColor;
  1927. begin
  1928.   inherited;
  1929.   if isFocused or FMouseIn
  1930.   then
  1931.     begin
  1932.       R := ClientRect;
  1933.       Frame3D(B.Canvas, R, clbtnShadow, clbtnShadow, 1);
  1934.     end;
  1935.   with B.Canvas do
  1936.   begin
  1937.     Font.Assign(DefaultFont);
  1938.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1939.     then
  1940.       Font.Charset := SkinData.ResourceStrData.CharSet;
  1941.     if not Enabled then Font.Color := clBtnShadow;
  1942.     Pen.Color := clBlack;
  1943.     Brush.Style := bsClear;
  1944.     IR := Rect(3, Height div 2 - 7, 17, Height div 2 + 7);
  1945.     TR := Rect(19, 0, Width, Height);
  1946.     BSDrawText(B.Canvas, Caption, TR);
  1947.   end;
  1948.   if FMouseIn
  1949.   then
  1950.     Frame3D(B.Canvas, IR, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1)
  1951.   else
  1952.     Frame3D(B.Canvas, IR, clbtnShadow, clbtnShadow, 1);
  1953.   if FChecked
  1954.   then
  1955.     begin
  1956.       if Enabled then C := clBlack else C := clBtnShadow; 
  1957.       if FRadio
  1958.       then DrawRadioImage(B.Canvas, 7, Height div 2 - 3, C)
  1959.       else DrawCheckImage(B.Canvas, 7, Height div 2 - 4, C);
  1960.     end;
  1961. end;
  1962. procedure TbsSkinCheckRadioBox.CMTextChanged;
  1963. begin
  1964.   inherited;
  1965.   RePaint;
  1966. end;
  1967. procedure TbsSkinCheckRadioBox.CMMouseEnter(var Message: TMessage);
  1968. begin
  1969.   inherited;
  1970.   if (csDesigning in ComponentState) then Exit;
  1971.   FMouseIn := True;
  1972.   ReDrawControl;
  1973. end;
  1974. procedure TbsSkinCheckRadioBox.CMMouseLeave(var Message: TMessage);
  1975. begin
  1976.   inherited;
  1977.   if (csDesigning in ComponentState) then Exit;
  1978.   FMouseIn := False;
  1979.   ReDrawControl;
  1980. end;
  1981. procedure TbsSkinCheckRadioBox.MouseDown;
  1982. begin
  1983.   if not FMouseIn
  1984.   then
  1985.     begin
  1986.       FMouseIn := True;
  1987.       RedrawControl;
  1988.     end;
  1989.   inherited;
  1990. end;
  1991. procedure TbsSkinCheckRadioBox.MouseUp;
  1992. begin
  1993.   inherited;
  1994.   if (Button = mbLeft) and FMouseIn then SetCheckState;
  1995. end;
  1996. constructor TbsSkinGauge.Create;
  1997. begin
  1998.   inherited;
  1999.   FUseSkinSize := True;
  2000.   FMinValue := 0;
  2001.   FMaxValue := 100;
  2002.   FValue := 50;
  2003.   FVertical := False;
  2004.   Width := 100;
  2005.   Height := 20;
  2006.   BeginOffset := 0;
  2007.   EndOffset := 0;
  2008.   FProgressText := '';
  2009.   FShowPercent := False;
  2010.   FShowProgressText := False;
  2011.   FSkinDataName := 'gauge';
  2012. end;
  2013. procedure TbsSkinGauge.Paint;
  2014. var
  2015.   B1, B2: TBitMap;
  2016. begin
  2017.   if FUseSkinSize or (FIndex = -1)
  2018.   then
  2019.     inherited
  2020.   else
  2021.     begin
  2022.       B1 := TBitMap.Create;
  2023.       B1.Width := Width;
  2024.       B1.Height := Height;
  2025.       B2 := TBitMap.Create;
  2026.       GetSkinData;
  2027.       CreateControlSkinImage(B2);
  2028.       B1.Canvas.StretchDraw(Rect(0, 0, B1.Width, B1.Height), B2);
  2029.       B2.Free;
  2030.       DrawProgressText(B1.Canvas);
  2031.       Canvas.Draw(0, 0, B1);
  2032.       B1.Free;
  2033.     end;
  2034. end;
  2035. procedure TbsSkinGauge.DrawProgressText;
  2036. var
  2037.   Percent: Integer;
  2038.   S: String;
  2039.   TX, TY: Integer;
  2040.   F: TLogFont;
  2041. begin
  2042.   if (FIndex = -1)
  2043.   then
  2044.     C.Font.Assign(FDefaultFont)
  2045.   else
  2046.   if (FIndex <> -1) and not FUseSkinFont
  2047.   then
  2048.     begin
  2049.       C.Font.Assign(FDefaultFont);
  2050.       C.Font.Color := FontColor;
  2051.     end
  2052.   else
  2053.     with C do
  2054.     begin
  2055.       Font.Name := FontName;
  2056.       Font.Height := FontHeight;
  2057.       Font.Style := FontStyle;
  2058.       Font.Color := FontColor;
  2059.     end;
  2060.    if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2061.    then
  2062.      C.Font.Charset := SkinData.ResourceStrData.CharSet
  2063.    else
  2064.      C.Font.CharSet := FDefaultFont.Charset;
  2065.      
  2066.   if MaxValue = MinValue
  2067.   then
  2068.     Percent := 0
  2069.   else
  2070.     Percent := Round((FValue - FMinValue) / (FMaxValue - FMinValue) * 100);
  2071.   S := '';
  2072.   if FShowProgressText then S := S + FProgressText;
  2073.   if FShowPercent then S := S + IntToStr(Percent) + '%';
  2074.   if S = '' then Exit;
  2075.   with C do
  2076.   begin
  2077.     if FVertical
  2078.     then
  2079.       begin
  2080.         GetObject(Font.Handle, SizeOf(F), @F);
  2081.         F.lfEscapement := round(900);
  2082.         Font.Handle := CreateFontIndirect(F);
  2083.         TX := Width div 2 - TextHeight(S) div 2;
  2084.         TY := Height div 2 + TextWidth(S) div 2;
  2085.       end
  2086.     else
  2087.       begin
  2088.         TX := Width div 2 - TextWidth(S) div 2;
  2089.         TY := Height div 2 - TextHeight(S) div 2;
  2090.       end;
  2091.     Brush.Style := bsClear;
  2092.     TextOut(TX, TY, S);
  2093.   end;
  2094. end;
  2095. procedure TbsSkinGauge.SetShowProgressText;
  2096. begin
  2097.   FShowProgressText := Value;
  2098.   RePaint;
  2099. end;
  2100. procedure TbsSkinGauge.SetShowPercent;
  2101. begin
  2102.   FShowPercent := Value;
  2103.   RePaint;
  2104. end;
  2105. procedure TbsSkinGauge.SetProgressText;
  2106. begin
  2107.   FProgressText := Value;
  2108.   RePaint;
  2109. end;
  2110. function TbsSkinGauge.CalcProgressRect;
  2111. var
  2112.   kf: Double;
  2113.   Offset: Integer;
  2114. begin
  2115.   if FMinValue = FMaxValue
  2116.   then
  2117.     Kf := 0
  2118.   else
  2119.     kf := (FValue - FMinValue) / (FMaxValue - FMinValue);
  2120.   if FVertical
  2121.   then
  2122.     begin
  2123.       Offset := Round(RectHeight(R) * kf);
  2124.       R.Top := R.Bottom - Offset;
  2125.       Result := R;
  2126.     end
  2127.   else
  2128.     begin
  2129.       Offset := Round(RectWidth(R) * kf);
  2130.       R.Right := R.Left + Offset;
  2131.       Result := R;
  2132.     end;
  2133. end;
  2134. procedure TbsSkinGauge.CalcSize;
  2135. var
  2136.   Offset: Integer;
  2137.   W1, H1: Integer;
  2138. begin
  2139.   if not FUseSkinSize
  2140.   then
  2141.     begin
  2142.       W1 := W;
  2143.       H1 := H;
  2144.     end;  
  2145.   inherited;
  2146.   if ResizeMode > 0
  2147.   then
  2148.     begin
  2149.       if FVertical
  2150.       then
  2151.         begin
  2152.           Offset := H - RectHeight(SkinRect);
  2153.           NewProgressArea := ProgressArea;
  2154.           Inc(NewProgressArea.Bottom, Offset);
  2155.         end
  2156.       else
  2157.         begin
  2158.           Offset := W - RectWidth(SkinRect);
  2159.           NewProgressArea := ProgressArea;
  2160.           Inc(NewProgressArea.Right, Offset);
  2161.         end
  2162.     end
  2163.   else
  2164.     NewProgressArea := ProgressArea;
  2165.   if not FUseSkinSize
  2166.   then
  2167.     begin
  2168.       W := W1;
  2169.       H := H1;
  2170.     end;
  2171. end;
  2172. procedure TbsSkinGauge.CreateControlSkinImage;
  2173. var
  2174.   PR, PR1, PR2: TRect;
  2175.   i, Cnt, Off: Integer;
  2176.   w1, w2: Integer;
  2177.   B1: TBitMap;
  2178. begin
  2179.   inherited;
  2180.   with B.Canvas do
  2181.   begin
  2182.     PR := CalcProgressRect(NewProgressArea, FVertical);
  2183.     if FVertical
  2184.     then
  2185.       begin
  2186.         if RectHeight(PR) - BeginOffset - EndOffset > 0
  2187.         then
  2188.           begin
  2189.             PR1 := PR;
  2190.             Inc(PR1.Top, BeginOffset);
  2191.             Dec(PR1.Bottom, EndOffset);
  2192.             PR2 := ProgressRect;
  2193.             Inc(PR2.Top, BeginOffset);
  2194.             Dec(PR2.Bottom, EndOffset);
  2195.             w1 := RectHeight(PR1);
  2196.             w2 := RectHeight(PR2);
  2197.             if w2 = 0 then Exit;
  2198.             Cnt := w1 div w2;
  2199.             for i := 0 to Cnt do
  2200.             begin
  2201.               if i * w2 + w2 > w1 then Off := i * w2 + w2 - w1 else Off := 0;
  2202.                 CopyRect(Rect(PR1.Left, PR1.Bottom - (i * w2 + w2 - Off),
  2203.                               PR1.Right, PR1.Bottom - i * w2),
  2204.                          Picture.Canvas,
  2205.                          Rect(PR2.Left, PR2.Top + Off,
  2206.                               PR2.Right, PR2.Bottom));
  2207.             end;
  2208.           end;
  2209.         if RectHeight(PR) >= BeginOffset + EndOffset
  2210.         then
  2211.           begin
  2212.             CopyRect(Rect(PR.Left, PR.Top,
  2213.                      PR.Right, PR.Top + BeginOffset),
  2214.                    Picture.Canvas,
  2215.                    Rect(ProgressRect.Left, ProgressRect.Top,
  2216.                    ProgressRect.Right, ProgressRect.Top + BeginOffset));
  2217.             CopyRect(Rect(PR.Left, PR.Bottom - EndOffset,
  2218.                      PR.Right, PR.Bottom),
  2219.                    Picture.Canvas,
  2220.                    Rect(ProgressRect.Left, ProgressRect.Bottom - EndOffset,
  2221.                    ProgressRect.Right, ProgressRect.Bottom));
  2222.           end;
  2223.       end
  2224.     else
  2225.       begin
  2226.         if RectWidth(PR) - BeginOffset - EndOffset > 0
  2227.         then
  2228.           begin
  2229.             PR1 := PR;
  2230.             Inc(PR1.Left, BeginOffset);
  2231.             Dec(PR1.Right, EndOffset);
  2232.             PR2 := ProgressRect;
  2233.             Inc(PR2.Left, BeginOffset);
  2234.             Dec(PR2.Right, EndOffset);
  2235.             w1 := RectWidth(PR1);
  2236.             w2 := RectWidth(PR2);
  2237.             if w2 = 0 then Exit;
  2238.             Cnt := w1 div w2;
  2239.             for i := 0 to Cnt do
  2240.             begin
  2241.               if i * w2 + w2 > w1 then Off := i * w2 + w2 - w1 else Off := 0;
  2242.                 CopyRect(Rect(PR1.Left + i * w2, PR1.Top,
  2243.                          PR1.Left + i * w2 + w2 - Off, PR1.Bottom),
  2244.                      Picture.Canvas,
  2245.                      Rect(PR2.Left, PR2.Top, PR2.Right - Off, PR2.Bottom));
  2246.             end;
  2247.           end;
  2248.         if RectWidth(PR) >= BeginOffset + EndOffset
  2249.         then
  2250.           begin
  2251.             CopyRect(Rect(PR.Left, PR.Top,
  2252.                      PR.Left + BeginOffset, PR.Bottom),
  2253.                    Picture.Canvas,
  2254.                    Rect(ProgressRect.Left, ProgressRect.Top,
  2255.                    ProgressRect.Left + BeginOffset, ProgressRect.Bottom));
  2256.             CopyRect(Rect(PR.Right - EndOffset, PR.Top,
  2257.                      PR.Right, PR.Bottom),
  2258.                    Picture.Canvas,
  2259.                    Rect(ProgressRect.Right - EndOffset, ProgressRect.Top,
  2260.                    ProgressRect.Right, ProgressRect.Bottom));
  2261.           end;
  2262.       end;
  2263.   end;
  2264.   if FUseSkinSize then DrawProgressText(B.Canvas);
  2265. end;
  2266. procedure TbsSkinGauge.CreateImage;
  2267. begin
  2268.   CreateSkinControlImage(B, Picture, SkinRect);
  2269. end;
  2270. procedure TbsSkinGauge.CreateControlDefaultImage(B: TBitMap);
  2271. var
  2272.   R, PR: TRect;
  2273. begin
  2274.   R := ClientRect;
  2275.   B.Canvas.Brush.Color := clWindow;
  2276.   B.Canvas.FillRect(R);
  2277.   Frame3D(B.Canvas, R, clbtnShadow, clbtnShadow, 1);
  2278.   R := Rect(1, 1, Width - 1, Height - 1);
  2279.   PR := CalcProgressRect(R, FVertical);
  2280.   if not IsNullRect(PR)
  2281.   then
  2282.     begin
  2283.       B.Canvas.Brush.Color := BS_XP_BTNACTIVECOLOR;
  2284.       B.Canvas.FillRect(PR);
  2285.     end;
  2286.   DrawProgressText(B.Canvas);
  2287. end;
  2288. procedure TbsSkinGauge.SetVertical;
  2289. var
  2290.   S: Integer;
  2291. begin
  2292.   FVertical:= AValue;
  2293.   if (csDesigning in ComponentState) and not
  2294.      (csLoading in ComponentState)
  2295.   then
  2296.     begin
  2297.       if FVertical
  2298.       then
  2299.         begin
  2300.           FSkinDataName := 'vgauge';
  2301.           if Width > Height
  2302.           then
  2303.             begin
  2304.               S := Width;
  2305.               Width := Height;
  2306.               Height := S;
  2307.             end;
  2308.           FDefaultWidth := FDefaultHeight;
  2309.           FDefaultHeight := 0;
  2310.         end
  2311.       else
  2312.         begin
  2313.           FSkinDataName := 'gauge';
  2314.           if Width < Height
  2315.           then
  2316.             begin
  2317.               S := Width;
  2318.               Width := Height;
  2319.               Height := S;
  2320.             end;
  2321.           FDefaultHeight := FDefaultWidth;
  2322.           FDefaultWidth := 0;
  2323.         end;
  2324.     end;
  2325. end;
  2326. procedure TbsSkinGauge.SetMinValue;
  2327. begin
  2328.   FMinValue := AValue;
  2329.   if FValue < FMinValue then FValue := FMinValue;
  2330.   RePaint;
  2331. end;
  2332. procedure TbsSkinGauge.SetMaxValue;
  2333. begin
  2334.   FMaxValue := AValue;
  2335.   if FValue > FMaxValue then FValue := FMaxValue;
  2336.   RePaint;
  2337. end;
  2338. procedure TbsSkinGauge.SetValue;
  2339. begin
  2340.   if AValue > FMaxValue
  2341.   then AValue := FMaxValue else
  2342.   if AValue < FMinValue
  2343.   then AValue := FMinValue;
  2344.   if AValue <> FValue
  2345.   then
  2346.     begin
  2347.       FValue := AValue;
  2348.       RePaint;
  2349.     end;
  2350. end;
  2351. procedure TbsSkinGauge.GetSkinData;
  2352. begin
  2353.   inherited;
  2354.   if FIndex <> -1
  2355.   then
  2356.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinGaugeControl
  2357.     then
  2358.       with TbsDataSkinGaugeControl(FSD.CtrlList.Items[FIndex]) do
  2359.       begin
  2360.         if not FUseSkinSize and (MaskPictureIndex <> -1)
  2361.         then
  2362.           MaskPicture := nil;
  2363.         Self.FVertical := Vertical;
  2364.         Self.ProgressRect := ProgressRect;
  2365.         Self.ProgressArea := ProgressArea;
  2366.         Self.BeginOffset := BeginOffset;
  2367.         Self.EndOffset := EndOffset;
  2368.         Self.FontName := FontName;
  2369.         Self.FontStyle := FontStyle;
  2370.         Self.FontHeight := FontHeight;
  2371.         Self.FontColor := FontColor;
  2372.       end;
  2373. end;
  2374. constructor TbsSkinTrackBar.Create;
  2375. begin
  2376.   inherited;
  2377.   FJumpWhenClick := False;
  2378.   FCanFocused := False;
  2379.   TabStop := False;
  2380.   FMinValue := 0;
  2381.   FMaxValue := 100;
  2382.   FValue := 50;
  2383.   FVertical := False;
  2384.   Width := 100;
  2385.   Height := 20;
  2386.   FMouseSupport := True;
  2387.   FDown := False;
  2388.   FSkinDataName := 'htrackbar';
  2389. end;
  2390. procedure TbsSkinTrackBar.KeyDown;
  2391. begin
  2392.   inherited KeyDown(Key, Shift);
  2393.   if FCanFocused then
  2394.   case Key of
  2395.     VK_UP, VK_RIGHT: Value := Value + 1;
  2396.     VK_DOWN, VK_LEFT: Value := Value - 1;
  2397.   end;
  2398. end;
  2399. procedure TbsSkinTrackBar.WMMOUSEWHEEL;
  2400. begin
  2401.   if IsFocused
  2402.   then
  2403.     if Vertical
  2404.     then
  2405.       begin
  2406.         if Message.WParam > 0
  2407.         then
  2408.           Value := Value + 1
  2409.         else
  2410.           Value := Value - 1;
  2411.       end
  2412.     else
  2413.       begin
  2414.         if Message.WParam > 0
  2415.         then
  2416.           Value := Value - 1
  2417.         else
  2418.           Value := Value + 1;
  2419.       end;
  2420. end;
  2421. procedure TbsSkinTrackBar.CMWantSpecialKey(var Msg: TCMWantSpecialKey);
  2422. begin
  2423.   inherited;
  2424.   if FCanFocused then 
  2425.   case Msg.CharCode of
  2426.     VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT: Msg.Result := 1;
  2427.   end;
  2428. end;
  2429. function TbsSkinTrackBar.IsFocused;
  2430. begin
  2431.   Result := Focused and FCanFocused;
  2432. end;
  2433. procedure TbsSkinTrackBar.SetCanFocused;
  2434. begin
  2435.   FCanFocused := Value;
  2436.   if FCanFocused then TabStop := True else TabStop := False;
  2437. end;
  2438. procedure TbsSkinTrackBar.WMSETFOCUS;
  2439. begin
  2440.   inherited;
  2441.   if FCanFocused then RePaint;
  2442. end;
  2443. procedure TbsSkinTrackBar.WMKILLFOCUS;
  2444. begin
  2445.   inherited;
  2446.   if FCanFocused then RePaint;
  2447. end;
  2448. procedure TbsSkinTrackBar.WndProc(var Message: TMessage);
  2449. begin
  2450.   if FCanFocused then
  2451.   case Message.Msg of
  2452.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  2453.       if not (csDesigning in ComponentState) and not Focused then
  2454.       begin
  2455.         FClicksDisabled := True;
  2456.         Windows.SetFocus(Handle);
  2457.         FClicksDisabled := False;
  2458.         if not Focused then Exit;
  2459.       end;
  2460.     CN_COMMAND:
  2461.       if FClicksDisabled then Exit;
  2462.   end;
  2463.   inherited WndProc(Message);
  2464. end;
  2465. function TbsSkinTrackBar.CalcValue;
  2466. var
  2467.   kf: Double;
  2468. begin
  2469.   if (Offset2 - Offset1) <= 0
  2470.   then kf := 0
  2471.   else kf := AOffset / (Offset2 - Offset1);
  2472.   if kf > 1 then kf := 1 else
  2473.   if kf < 0 then kf := 0;
  2474.   Result := FMinValue + Round((FMaxValue - FMinValue) * kf);
  2475. end;
  2476. function TbsSkinTrackBar.CalcButtonRect;
  2477. var
  2478.   kf: Double;
  2479.   BW, BH: Integer;
  2480. begin
  2481.   if FMinValue = FMaxValue
  2482.   then
  2483.     Kf := 0
  2484.   else
  2485.     kf := (FValue - FMinValue) / (FMaxValue - FMinValue);
  2486.   if FIndex = -1
  2487.   then
  2488.     begin
  2489.       if FVertical
  2490.       then
  2491.         begin
  2492.           BW := Width - 4;
  2493.           BH := BW div 2;
  2494.         end
  2495.       else
  2496.         begin
  2497.           BH := Height - 4;
  2498.           BW := BH div 2;
  2499.          end;
  2500.     end
  2501.   else
  2502.     begin
  2503.       BW := RectWidth(ButtonRect);
  2504.       BH := RectHeight(ButtonRect);
  2505.     end;
  2506.   if FVertical
  2507.   then
  2508.     begin
  2509.       Offset1 := R.Top + BH div 2;
  2510.       Offset2 := R.Bottom - BH div 2;
  2511.       BOffset := Round((Offset2 - Offset1) * Kf);
  2512.       Result := Rect(R.Left + RectWidth(R) div 2 - BW div 2,
  2513.        Offset2 - BOffset - BH div 2,
  2514.        R.Left + RectWidth(R) div 2 - BW div 2 + BW,
  2515.        Offset2 - BOffset - BH div 2 + BH);
  2516.     end
  2517.   else
  2518.     begin
  2519.       Offset1 := R.Left + BW div 2;
  2520.       Offset2 := R.Right - BW div 2;
  2521.       BOffset := Round((Offset2 - Offset1) * kf);
  2522.       Result := Rect(Offset1 + BOffset - BW div 2,
  2523.         R.Top + RectHeight(R) div 2 - BH div 2,
  2524.         Offset1 + BOffset - BW div 2 + BW,
  2525.         R.Top + RectHeight(R) div 2 - BH div 2 + BH);
  2526.     end;
  2527. end;
  2528. procedure TbsSkinTrackBar.CalcSize;
  2529. var
  2530.   Offset: Integer;
  2531. begin
  2532.   inherited;
  2533.   if ResizeMode > 0
  2534.   then
  2535.     begin
  2536.       if FVertical
  2537.       then
  2538.         begin
  2539.           Offset := H - RectHeight(SkinRect);
  2540.           NewTrackArea := TrackArea;
  2541.           Inc(NewTrackArea.Bottom, Offset);
  2542.         end
  2543.       else
  2544.         begin
  2545.           Offset := W - RectWidth(SkinRect);
  2546.           NewTrackArea := TrackArea;
  2547.           Inc(NewTrackArea.Right, Offset);
  2548.         end
  2549.     end
  2550.   else
  2551.     NewTrackArea := TrackArea;
  2552. end;
  2553. procedure TbsSkinTrackBar.CreateControlSkinImage;
  2554. begin
  2555.   inherited;
  2556.   BR := CalcButtonRect(NewTrackArea);
  2557.   with B.Canvas do
  2558.   begin
  2559.     if FDown or IsFocused
  2560.     then
  2561.       CopyRect(BR, Picture.Canvas, ActiveButtonRect)
  2562.     else
  2563.       CopyRect(BR, Picture.Canvas, ButtonRect);
  2564.   end;
  2565. end;
  2566. procedure TbsSkinTrackBar.CreateImage;
  2567. begin
  2568.   CreateSkinControlImage(B, Picture, SkinRect);
  2569. end;
  2570. procedure TbsSkinTrackBar.MouseDown;
  2571. begin
  2572.   inherited;
  2573.   if FMouseSupport and
  2574.      PtInRect(Rect(BR.Left, BR.Top, BR.Right + 1, BR.Bottom + 1), Point(X, Y))
  2575.   then
  2576.     begin
  2577.       if FVertical then OMPos := Y else OMPos := X;
  2578.       OldBOffset := BOffset;
  2579.       FDown := True;
  2580.       RePaint;
  2581.     end;
  2582. end;
  2583. procedure TbsSkinTrackBar.MouseUp;
  2584. var
  2585.   Off: Integer;
  2586.   Off2: Integer;
  2587. begin
  2588.   inherited;
  2589.   if FMouseSupport and FDown
  2590.   then
  2591.     begin
  2592.       FDown := False;
  2593.       RePaint;
  2594.     end
  2595.   else
  2596.   if FMouseSupport and not FDown and FJumpWhenClick
  2597.   then
  2598.     begin
  2599.       if FIndex <> -1
  2600.       then
  2601.         begin
  2602.           if FVertical
  2603.           then
  2604.             Off2 := NewTrackArea.Top
  2605.           else
  2606.             Off2 := NewTrackArea.Left;
  2607.         end
  2608.       else
  2609.         Off2 := 2;
  2610.       if FVertical
  2611.       then
  2612.         Off := Height - Y - RectHeight(BR) div 2 - Off2
  2613.       else
  2614.         Off := X - RectWidth(BR) div 2 - Off2;
  2615.       Value := CalcValue(Off);
  2616.     end;
  2617. end;
  2618. procedure TbsSkinTrackBar.MouseMove;
  2619. var
  2620.   Off: Integer;
  2621. begin
  2622.   if FMouseSupport and FDown
  2623.   then
  2624.     begin
  2625.       if Vertical
  2626.       then
  2627.         begin
  2628.           Off := OMPos - Y;
  2629.           Off := OldBOffset + Off;
  2630.         end
  2631.       else
  2632.         begin
  2633.           Off := X - OMPos;
  2634.           Off := OldBOffset + Off;
  2635.         end;
  2636.       Value := CalcValue(Off);
  2637.     end;
  2638.   inherited;
  2639. end;
  2640. procedure TbsSkinTrackBar.CreateControlDefaultImage;
  2641. var
  2642.   R, LR, BR1: TRect;
  2643. begin
  2644.   inherited;
  2645.   R := ClientRect;
  2646.   Frame3D(B.Canvas, R, clbtnShadow, clbtnShadow, 1);
  2647.   R := Rect(2, 2, Width - 2, Height - 2);
  2648.   if FVertical
  2649.   then
  2650.     LR := Rect(Width div 2 - 1, 4, Width div 2 + 1, Height - 4)
  2651.   else
  2652.     LR := Rect(4, Height div 2 - 1, Width - 4, Height div 2 + 1);
  2653.   BR := CalcButtonRect(R);
  2654.   Frame3D(B.Canvas, LR, clbtnShadow, clbtnHighLight, 1);
  2655.   BR1 := BR;
  2656.   with B.Canvas do
  2657.   begin
  2658.     Brush.Style := bsSolid;
  2659.     if FDown
  2660.     then
  2661.       begin
  2662.         Frame3D(B.Canvas, BR1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2663.         Brush.Color := BS_XP_BTNDOWNCOLOR;
  2664.         FillRect(BR1);
  2665.       end
  2666.     else
  2667.     if IsFocused
  2668.     then
  2669.       begin
  2670.         Frame3D(B.Canvas, BR1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2671.         Brush.Color := BS_XP_BTNACTIVECOLOR;
  2672.         FillRect(BR1);
  2673.       end
  2674.     else
  2675.       begin
  2676.         Frame3D(B.Canvas, BR1, clBtnShadow, clBtnShadow, 1);
  2677.         Brush.Color := clBtnFace;
  2678.         FillRect(BR1);
  2679.       end;
  2680.   end;
  2681. end;
  2682. procedure TbsSkinTrackBar.SetVertical;
  2683. var
  2684.   S: Integer;
  2685. begin
  2686.   FVertical := AValue;
  2687.   if (csDesigning in ComponentState) and not
  2688.      (csLoading in ComponentState)
  2689.   then
  2690.     begin
  2691.       if FVertical
  2692.       then
  2693.         begin
  2694.           FSkinDataName := 'trackbar';
  2695.           if Width > Height
  2696.           then
  2697.             begin
  2698.               S := Width;
  2699.               Width := Height;
  2700.               Height := S;
  2701.             end;
  2702.           FDefaultWidth := FDefaultHeight;
  2703.           FDefaultHeight := 0;
  2704.         end
  2705.       else
  2706.         begin
  2707.           FSkinDataName := 'htrackbar';
  2708.           if Width < Height
  2709.           then
  2710.             begin
  2711.               S := Width;
  2712.               Width := Height;
  2713.               Height := S;
  2714.             end;
  2715.           FDefaultHeight := FDefaultWidth;
  2716.           FDefaultWidth := 0;
  2717.         end;
  2718.     end;
  2719. end;
  2720. procedure TbsSkinTrackBar.SetMinValue;
  2721. begin
  2722.   FMinValue := AValue;
  2723.   if FValue < FMinValue then FValue := FMinValue;
  2724.   RePaint;
  2725. end;
  2726. procedure TbsSkinTrackBar.SetMaxValue;
  2727. begin
  2728.   FMaxValue := AValue;
  2729.   if FValue > FMaxValue then FValue := FMaxValue;
  2730.   RePaint;
  2731. end;
  2732. procedure TbsSkinTrackBar.SetValue;
  2733. begin
  2734.   if AValue > MaxValue then AValue := MaxValue else
  2735.     if AValue < MinValue then AValue := MinValue;
  2736.   if AValue <> FValue
  2737.   then
  2738.     begin
  2739.       FValue := AValue;
  2740.       RePaint;
  2741.       if Assigned(FOnChange) then FOnChange(Self);
  2742.     end;
  2743. end;
  2744. procedure TbsSkinTrackBar.GetSkinData;
  2745. begin
  2746.   inherited;
  2747.   if FIndex <> -1
  2748.   then
  2749.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinTrackBarControl
  2750.     then
  2751.       with TbsDataSkinTrackBarControl(FSD.CtrlList.Items[FIndex]) do
  2752.       begin
  2753.         Self.FVertical := Vertical;
  2754.         Self.ButtonRect := ButtonRect;
  2755.         if IsNullRect(ActiveButtonRect)
  2756.         then
  2757.           Self.ActiveButtonRect := ButtonRect
  2758.         else
  2759.           Self.ActiveButtonRect := ActiveButtonRect;
  2760.         Self.TrackArea := TrackArea;
  2761.       end;
  2762. end;
  2763. constructor TbsSkinStdLabel.Create;
  2764. begin
  2765.   inherited;
  2766.   Transparent := True;
  2767.   FSD := nil;
  2768.   FSkinDataName := 'stdlabel';
  2769.   FDefaultFont := TFont.Create;
  2770.   FUseSkinFont := True;
  2771. end;
  2772. destructor TbsSkinStdLabel.Destroy;
  2773. begin
  2774.   FDefaultFont.Free;
  2775.   inherited;
  2776. end;
  2777. procedure TbsSkinStdLabel.DoDrawText(var Rect: TRect; Flags: Longint);
  2778. var
  2779.   Text: string;
  2780. begin
  2781.   GetSkinData;
  2782.   Text := GetLabelText;
  2783.   if (Flags and DT_CALCRECT <> 0) and ((Text = '') or ShowAccelChar and
  2784.     (Text[1] = '&') and (Text[2] = #0)) then Text := Text + ' ';
  2785.   if not ShowAccelChar then Flags := Flags or DT_NOPREFIX;
  2786.   Flags := DrawTextBiDiModeFlags(Flags);
  2787.   if FIndex <> -1
  2788.   then
  2789.     with Canvas.Font do
  2790.     begin
  2791.       if FUseSkinFont
  2792.       then
  2793.         begin
  2794.           Name := FontName;
  2795.           Style := FontStyle;
  2796.           Height := FontHeight;
  2797.         end
  2798.       else
  2799.         Canvas.Font := Self.Font;
  2800.       Color := FontColor;
  2801.     end
  2802.   else
  2803.     if FUseSkinFont
  2804.     then
  2805.       Canvas.Font := DefaultFont
  2806.     else
  2807.       Canvas.Font := Self.Font;
  2808.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2809.   then
  2810.     Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  2811.   else
  2812.     Canvas.Font.CharSet := FDefaultFont.Charset;
  2813.  
  2814.   if not Enabled then
  2815.   begin
  2816.     OffsetRect(Rect, 1, 1);
  2817.     Canvas.Font.Color := clBtnHighlight;
  2818.     DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  2819.     OffsetRect(Rect, -1, -1);
  2820.     Canvas.Font.Color := clBtnShadow;
  2821.     DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  2822.   end
  2823.   else
  2824.     begin
  2825.       Canvas.Font := Self.Font;
  2826.       if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2827.       then
  2828.         Canvas.Font.Charset := SkinData.ResourceStrData.CharSet;
  2829.       DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  2830.     end;
  2831. end;
  2832. procedure TbsSkinStdLabel.SetDefaultFont;
  2833. begin
  2834.   FDefaultFont.Assign(Value);
  2835. end;
  2836. procedure TbsSkinStdLabel.Notification;
  2837. begin
  2838.   inherited Notification(AComponent, Operation);
  2839.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  2840. end;
  2841. procedure TbsSkinStdLabel.GetSkinData;
  2842. begin
  2843.   if (FSD = nil) or FSD.Empty
  2844.   then
  2845.     FIndex := -1
  2846.   else
  2847.     FIndex := FSD.GetControlIndex(FSkinDataName);
  2848.   if (FIndex <> -1)
  2849.   then
  2850.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinStdLabelControl
  2851.     then
  2852.       with TbsDataSkinStdLabelControl(FSD.CtrlList.Items[FIndex]) do
  2853.       begin
  2854.         Self.FontName := FontName;
  2855.         Self.FontColor := FontColor;
  2856.         Self.FontStyle := FontStyle;
  2857.         Self.FontHeight := FontHeight;
  2858.       end
  2859. end;
  2860. procedure TbsSkinStdLabel.ChangeSkinData;
  2861. begin
  2862.   GetSkinData;
  2863.   RePaint;
  2864. end;
  2865. procedure TbsSkinStdLabel.SetSkinData;
  2866. begin
  2867.   FSD := Value;
  2868.   if (FSD <> nil) then ChangeSkinData;
  2869. end;
  2870. constructor TbsSkinLabel.Create;
  2871. begin
  2872.   inherited;
  2873.   Width := 75;
  2874.   Height := 21;
  2875.   FAutoSize := False;
  2876.   FSkinDataName := 'label';
  2877. end;
  2878. procedure TbsSkinLabel.SetBorderStyle;
  2879. begin
  2880.   FBorderStyle := Value;
  2881.   if FIndex = -1
  2882.   then
  2883.     begin
  2884.       RePaint;
  2885.       ReAlign;
  2886.     end;
  2887. end;
  2888. procedure TbsSkinLabel.GetSkinData;
  2889. begin
  2890.   inherited;
  2891.   if FIndex <> -1
  2892.   then
  2893.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinLabelControl
  2894.     then
  2895.       with TbsDataSkinLabelControl(FSD.CtrlList.Items[FIndex]) do
  2896.       begin
  2897.         Self.FontName := FontName;
  2898.         Self.FontColor := FontColor;
  2899.         Self.FontStyle := FontStyle;
  2900.         Self.FontHeight := FontHeight;
  2901.         if ResizeMode = 0 then FAutoSize := False;
  2902.       end;
  2903. end;
  2904. procedure TbsSkinLabel.DrawLabelText;
  2905. var
  2906.   TX, TY: Integer;
  2907. begin
  2908.   with Cnvs do
  2909.   begin
  2910.     if (FIndex <> -1) and UseSkinFont
  2911.     then
  2912.       begin
  2913.         Font.Name := FontName;
  2914.         Font.Style := FontStyle;
  2915.         Font.Height := FontHeight;
  2916.         Font.Color := FontColor;
  2917.       end
  2918.     else
  2919.     if (FIndex <> -1) and not UseSkinFont
  2920.     then
  2921.       begin
  2922.         Font.Assign(DefaultFont);
  2923.         Font.Color := FontColor;
  2924.       end
  2925.     else
  2926.       Font.Assign(DefaultFont);
  2927.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2928.     then
  2929.       Font.Charset := SkinData.ResourceStrData.CharSet
  2930.     else
  2931.       Font.CharSet := FDefaultFont.Charset;
  2932.       
  2933.     TY := R.Top + RectHeight(R) div 2 - TextHeight(Caption) div 2;
  2934.     TX := R.Left;
  2935.     case FAlignment of
  2936.       taRightJustify: TX := R.Right - TextWidth(Caption);
  2937.       taCenter: TX := R.Left + RectWidth(R) div 2 - TextWidth(Caption) div 2;
  2938.     end;
  2939.     Brush.Style := bsClear;
  2940.     TextRect(R, TX, TY, Caption);
  2941.   end;
  2942. end;
  2943. procedure TbsSkinLabel.CreateControlDefaultImage;
  2944. var
  2945.   R: TRect;
  2946. begin
  2947.   inherited;
  2948.   R := ClientRect;
  2949.   case FBorderStyle of
  2950.     bvLowered:
  2951.       Frm3D(B.Canvas, R, clBtnShadow, clBtnHighLight);
  2952.     bvRaised:
  2953.       Frm3D(B.Canvas, R, clBtnHighLight, clBtnShadow);
  2954.     bvFrame:
  2955.       Frm3D(B.Canvas, R, clBtnShadow, clBtnShadow);
  2956.   end;
  2957.   DrawLabelText(B.Canvas, Rect(3, 3, Width - 3, Height - 3));
  2958. end;
  2959. procedure TbsSkinLabel.CreateControlSkinImage;
  2960. begin
  2961.   inherited;
  2962.   DrawLabelText(B.Canvas, NewClRect);
  2963. end;
  2964. procedure TbsSkinLabel.PaintLabel;
  2965. begin
  2966.   CreateSkinControlImage(B, Picture, SkinRect);
  2967. end;
  2968. procedure TbsSkinLabel.CalcSize;
  2969. var
  2970.   Offset: Integer;
  2971. begin
  2972.   inherited;
  2973.   Offset := CalcWidthOffset;
  2974.   if (Offset > 0) and FAutoSize then W := W + Offset;
  2975. end;
  2976. function TbsSkinLabel.CalcWidthOffset;
  2977. begin
  2978.   if (FIndex <> -1)
  2979.   then
  2980.     begin
  2981.       with Canvas do
  2982.       begin
  2983.         if FUseSkinFont
  2984.         then
  2985.           begin
  2986.             Font.Name := FontName;
  2987.             Font.Height := FontHeight;
  2988.             Font.Style := FontStyle;
  2989.           end
  2990.         else
  2991.            Font.Assign(DefaultFont);   
  2992.         if ResizeMode = 0
  2993.         then
  2994.           Result := 0
  2995.         else
  2996.           Result := TextWidth(Caption) - RectWidth(NewClRect);
  2997.       end;
  2998.     end
  2999.   else
  3000.     begin
  3001.       Canvas.Font.Assign(DefaultFont);
  3002.       Result := Canvas.TextWidth(Caption) - (Width - 4);
  3003.     end;
  3004. end;
  3005. procedure TbsSkinLabel.AdjustBounds;
  3006. var
  3007.   Offset: Integer;
  3008. begin
  3009.   if (Align = alTop) or (Align = alBottom)  or (Align = alClient) then Exit;
  3010.   Offset := CalcWidthOffset;
  3011.   if Offset <> 0 then Width := Width + Offset;
  3012. end;
  3013. procedure TbsSkinLabel.SetAlignment(Value: TAlignment);
  3014. begin
  3015.   if FAlignment <> Value
  3016.   then
  3017.     begin
  3018.       FAlignment := Value;
  3019.       RePaint;
  3020.     end;
  3021. end;
  3022. procedure TbsSkinLabel.SetAutoSizeX(Value: Boolean);
  3023. begin
  3024.   FAutoSize := Value;
  3025.   if FAutoSize then AdjustBounds;
  3026. end;
  3027. procedure TbsSkinLabel.CMTextChanged(var Message: TMessage);
  3028. begin
  3029.   if FAutoSize then AdjustBounds;
  3030.   RePaint;
  3031. end;
  3032. constructor TbsSkinStatusPanel.Create;
  3033. begin
  3034.   inherited;
  3035.   FGlyph := TBitMap.Create;
  3036.   FNumGlyphs := 1;
  3037.   FSkinDataName := 'statuspanel';
  3038.   Width := 120;
  3039. end;
  3040. destructor TbsSkinStatusPanel.Destroy;
  3041. begin
  3042.   FGlyph.Free;
  3043.   inherited;
  3044. end;
  3045. function TbsSkinStatusPanel.CalcWidthOffset;
  3046. var
  3047.   X: Integer;
  3048. begin
  3049.   if not FGlyph.Empty
  3050.   then
  3051.     X := FGlyph.Width div FNumGlyphs + 3
  3052.   else
  3053.     X := 0;
  3054.   if FIndex <> -1
  3055.   then
  3056.     begin
  3057.       with Canvas do
  3058.       begin
  3059.         if UseSkinFont
  3060.         then
  3061.           begin
  3062.             Font.Name := FontName;
  3063.             Font.Height := FontHeight;
  3064.             Font.Style := FontStyle;
  3065.           end
  3066.         else
  3067.           Font.Assign(DefaultFont);    
  3068.         if ResizeMode = 0
  3069.         then
  3070.           Result := 0
  3071.         else
  3072.           Result := TextWidth(Caption) + X - RectWidth(NewClRect);
  3073.      end
  3074.    end
  3075.  else
  3076.    begin
  3077.      Canvas.Font.Assign(DefaultFont);
  3078.      Result := Canvas.TextWidth(Caption) + X - (Width - 4);
  3079.    end;
  3080. end;
  3081. procedure TbsSkinStatusPanel.CMEnabledChanged;
  3082. begin
  3083.   inherited;
  3084.   RePaint;
  3085. end;
  3086. procedure TbsSkinStatusPanel.SetNumGlyphs;
  3087. begin
  3088.   FNumGlyphs := Value;
  3089.   RePaint;
  3090. end;
  3091. procedure TbsSkinStatusPanel.SetGlyph;
  3092. begin
  3093.   FGlyph.Assign(Value);
  3094.   RePaint;
  3095. end;
  3096. procedure TbsSkinStatusPanel.CreateControlDefaultImage;
  3097. var
  3098.   R: TRect;
  3099.   GW: Integer;
  3100.   GlyphNum: Integer;
  3101. begin
  3102.   R := ClientRect;
  3103.   with  B.Canvas do
  3104.   begin
  3105.     Brush.Color := clBtnFace;
  3106.     FillRect(R);
  3107.   end;
  3108.   case FBorderStyle of
  3109.     bvLowered:
  3110.       Frm3D(B.Canvas, R, clBtnShadow, clBtnHighLight);
  3111.     bvRaised:
  3112.       Frm3D(B.Canvas, R, clBtnHighLight, clBtnShadow);
  3113.     bvFrame:
  3114.       Frm3D(B.Canvas, R, clBtnShadow, clBtnShadow);
  3115.   end;
  3116.   R := Rect(3, 3, Width - 3, Height - 3);
  3117.   if not FGlyph.Empty
  3118.   then
  3119.     begin
  3120.       GW := FGlyph.Width div FNumGlyphs;
  3121.       Inc(R.Left, GW + 2);
  3122.       if Enabled then GlyphNum := 1 else GlyphNum := 2; 
  3123.       DrawGlyph(B.Canvas, 3, B.Height div 2 - FGlyph.Height div 2, Glyph, NumGlyphs, GlyphNum);
  3124.     end;
  3125.   DrawLabelText(B.Canvas, R);
  3126. end;
  3127. procedure TbsSkinStatusPanel.CreateControlSkinImage;
  3128. var
  3129.   R: TRect;
  3130.   GlyphNum, GX, GY, GW: Integer;
  3131. begin
  3132.   CreateSkinControlImage(B, Picture, SkinRect);
  3133.   R := NewClRect;
  3134.   if not FGlyph.Empty
  3135.   then
  3136.     begin
  3137.       GW := FGlyph.Width div FNumGlyphs;
  3138.       GX := R.Left;
  3139.       GY := R.Top + RectHeight(R) div 2 - FGlyph.Height div 2;
  3140.       if Enabled then GlyphNum := 1 else GlyphNum := 2;
  3141.       DrawGlyph(B.Canvas, GX, GY, Glyph, NumGlyphs, GlyphNum);
  3142.       Inc(R.Left, GW + 2);
  3143.     end;
  3144.   DrawLabelText(B.Canvas, R);
  3145. end;
  3146. //============ TbsSkinScrollBar ===============
  3147. const
  3148.   SBUTTONW = 16;
  3149.   BUTCOUNT = 3;
  3150.   THUMB = 0;
  3151.   UPBUTTON = 1;
  3152.   DOWNBUTTON = 2;
  3153. constructor TbsSkinScrollBar.Create;
  3154. begin
  3155.   inherited;
  3156.   FCanFocused := False;
  3157.   TabStop := False;
  3158.   FMin := 0;
  3159.   FMax := 100;
  3160.   FPosition := 0;
  3161.   FSmallChange := 1;
  3162.   FLargeChange := 1;
  3163.   FPageSize := 0;
  3164.   WaitMode := False;
  3165.   TimerMode := 0;
  3166.   ActiveButton := -1;
  3167.   OldActiveButton := -1;
  3168.   CaptureButton := -1;
  3169.   FOnChange := nil;
  3170.   Width := 200;
  3171.   Height := 19;
  3172.   FBothMarkerWidth := 19;
  3173.   FDefaultHeight := 19;
  3174.   FNormalSkinDataName := '';
  3175.   FBothSkinDataName := 'bothhscrollbar';
  3176.   FSkinDataName := 'hscrollbar';
  3177. end;
  3178. destructor TbsSkinScrollBar.Destroy;
  3179. begin
  3180.   inherited;
  3181. end;
  3182. procedure TbsSkinScrollBar.SetBoth(Value: Boolean);
  3183. begin
  3184.   if FBoth <> Value
  3185.   then
  3186.     begin
  3187.       FBoth := Value;
  3188.       if not (csDesigning in ComponentState)
  3189.       then
  3190.         if FBoth
  3191.         then
  3192.           begin
  3193.             FNormalSkinDataName := SkinDataName;
  3194.             SkinDataName := FBothSkinDataName;
  3195.           end
  3196.         else
  3197.           if FNormalSkinDataName <> ''
  3198.           then
  3199.             SkinDataName := FNormalSkinDataName;
  3200.         if FIndex = -1
  3201.         then
  3202.           RePaint
  3203.         else
  3204.          ChangeSkinData;
  3205.     end;
  3206. end;
  3207. procedure TbsSkinScrollBar.CMEnabledChanged;
  3208. begin
  3209.   inherited;
  3210.   RePaint;
  3211. end;
  3212. procedure TbsSkinScrollBar.SetBothMarkerWidth;
  3213. begin
  3214.   if Value >= 0
  3215.   then
  3216.     begin
  3217.       FBothMarkerWidth := Value;
  3218.       if FIndex = -1 then RePaint;
  3219.     end;
  3220. end;
  3221. procedure TbsSkinScrollBar.KeyDown;
  3222. begin
  3223.   inherited KeyDown(Key, Shift);
  3224.   if FCanFocused then 
  3225.   case Key of
  3226.     VK_DOWN, VK_RIGHT: Position := Position + FSmallChange;
  3227.     VK_UP, VK_LEFT: Position := Position - FSmallChange;
  3228.   end;
  3229. end;
  3230. procedure TbsSkinScrollBar.WMMOUSEWHEEL;
  3231. begin
  3232.   if IsFocused
  3233.   then
  3234.     if Message.WParam > 0
  3235.     then
  3236.       Position := FPosition - FSmallChange
  3237.     else
  3238.       Position := FPosition + FSmallChange;
  3239. end;
  3240. procedure TbsSkinScrollBar.CMWantSpecialKey(var Msg: TCMWantSpecialKey);
  3241. begin
  3242.   inherited;
  3243.   if FCanFocused then 
  3244.   case Msg.CharCode of
  3245.     VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT: Msg.Result := 1;
  3246.   end;
  3247. end;
  3248. function TbsSkinScrollBar.IsFocused;
  3249. begin
  3250.   Result := Focused and FCanFocused;
  3251. end;
  3252. procedure TbsSkinScrollBar.SetCanFocused;
  3253. begin
  3254.   FCanFocused := Value;
  3255.   if FCanFocused then TabStop := True else TabStop := False;
  3256. end;
  3257. procedure TbsSkinScrollBar.WMSETFOCUS;
  3258. begin
  3259.   inherited;
  3260.   if FCanFocused then RePaint;
  3261. end;
  3262. procedure TbsSkinScrollBar.WMKILLFOCUS;
  3263. begin
  3264.   inherited;
  3265.   if FCanFocused then RePaint;
  3266. end;
  3267. procedure TbsSkinScrollBar.WndProc(var Message: TMessage);
  3268. begin
  3269.   if FCanFocused then
  3270.   case Message.Msg of
  3271.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  3272.       if not (csDesigning in ComponentState) and not Focused then
  3273.       begin
  3274.         FClicksDisabled := True;
  3275.         Windows.SetFocus(Handle);
  3276.         FClicksDisabled := False;
  3277.         if not Focused then Exit;
  3278.       end;
  3279.     CN_COMMAND:
  3280.       if FClicksDisabled then Exit;
  3281.   end;
  3282.   inherited WndProc(Message);
  3283. end;
  3284. procedure TbsSkinScrollBar.GetSkinData;
  3285. begin
  3286.   inherited;
  3287.   if FIndex <> -1
  3288.   then
  3289.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinScrollBarControl
  3290.     then
  3291.       with TbsDataSkinScrollBarControl(FSD.CtrlList.Items[FIndex]) do
  3292.       begin
  3293.         Self.TrackArea := TrackArea;
  3294.         Self.UpButtonRect := UpButtonRect;
  3295.         Self.ActiveUpButtonRect := ActiveUpButtonRect;
  3296.         Self.DownUpButtonRect := DownUpButtonRect;
  3297.         if IsNullRect(Self.DownUpButtonRect)
  3298.         then
  3299.           Self.DownUpButtonRect := Self.ActiveUpButtonRect;
  3300.         Self.DownButtonRect := DownButtonRect;
  3301.         Self.ActiveDownButtonRect := ActiveDownButtonRect;
  3302.         Self.DownDownButtonRect := DownDownButtonRect;
  3303.         if IsNullRect(Self.DownDownButtonRect)
  3304.         then
  3305.           Self.DownDownButtonRect := Self.ActiveDownButtonRect;
  3306.         Self.ThumbRect := ThumbRect;
  3307.         Self.ActiveThumbRect := ActiveThumbRect;
  3308.         if IsNullRect(Self.ActiveThumbRect)
  3309.         then
  3310.           Self.ActiveThumbRect := Self.ThumbRect;
  3311.         Self.DownThumbRect := DownThumbRect;
  3312.         if IsNullRect(Self.DownThumbRect)
  3313.         then
  3314.           Self.DownThumbRect := Self.ActiveThumbRect;
  3315.         Self.ThumbOffset1 := ThumbOffset1;
  3316.         Self.ThumbOffset2 := ThumbOffset2;
  3317.         Self.GlyphRect := GlyphRect;
  3318.         Self.ActiveGlyphRect := ActiveGlyphRect;
  3319.         if isNullRect(ActiveGlyphRect)
  3320.         then Self.ActiveGlyphRect := GlyphRect; 
  3321.         Self.DownGlyphRect := DownGlyphRect;
  3322.         if isNullRect(DownGlyphRect)
  3323.         then Self.DownGlyphRect := Self.ActiveGlyphRect;
  3324.       end;
  3325. end;
  3326. procedure TbsSkinScrollBar.CalcSize;
  3327. begin
  3328.   inherited;
  3329.   CalcRects;
  3330. end;
  3331. procedure TbsSkinScrollBar.SetPageSize;
  3332. begin
  3333.   if AValue + FPosition <= FMax - FMin + 1
  3334.   then
  3335.     FPageSize := AValue;
  3336.   RePaint;
  3337. end;
  3338. procedure TbsSkinScrollBar.StopTimer;
  3339. begin
  3340.   KillTimer(Handle, 1);
  3341.   TimerMode := 0;
  3342. end;
  3343. procedure TbsSkinScrollBar.TestActive(X, Y: Integer);
  3344. var
  3345.   i, j: Integer;
  3346. begin
  3347.   j := -1;
  3348.   OldActiveButton := ActiveButton;
  3349.   for i := 0 to BUTCOUNT - 1 do
  3350.   begin
  3351.     if PtInRect(Buttons[i].R, Point(X, Y))
  3352.     then
  3353.       begin
  3354.         j := i;
  3355.         Break;
  3356.       end;
  3357.   end;
  3358.   ActiveButton := j;
  3359.   if (CaptureButton <> -1) and
  3360.      (ActiveButton <> CaptureButton) and (ActiveButton <> -1)
  3361.   then
  3362.     ActiveButton := -1;
  3363.   if (OldActiveButton <> ActiveButton)
  3364.   then
  3365.     begin
  3366.       if OldActiveButton <> - 1
  3367.       then
  3368.         ButtonLeave(OldActiveButton);
  3369.       if ActiveButton <> -1
  3370.       then
  3371.         ButtonEnter(ActiveButton);
  3372.     end;
  3373. end;
  3374. procedure TbsSkinScrollBar.CreateControlSkinImage;
  3375. var
  3376.   i: Integer;
  3377. begin
  3378.   inherited;
  3379.   CalcRects;
  3380.   for i := 1 to BUTCOUNT - 1 do DrawButton(B.Canvas, i);
  3381.   if Enabled then 
  3382.   DrawButton(B.Canvas, THUMB);
  3383. end;
  3384. procedure TbsSkinScrollBar.DrawButton;
  3385. var
  3386.   R1, R2: TRect;
  3387.   C: TColor;
  3388.   ThumbB: TBitMap;
  3389. begin
  3390.   if FIndex = -1
  3391.   then
  3392.     with Buttons[i] do
  3393.     begin
  3394.       R1 := R;
  3395.       with Cnvs do
  3396.       begin
  3397.         if (Down and MouseIn) or ((i = THUMB) and (Down or IsFocused))
  3398.         then
  3399.           begin
  3400.             Frame3D(Cnvs, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3401.             Brush.Color := BS_XP_BTNDOWNCOLOR;
  3402.            FillRect(R1);
  3403.          end
  3404.         else
  3405.           if MouseIn
  3406.           then
  3407.             begin
  3408.               Frame3D(Cnvs, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3409.               Brush.Color := BS_XP_BTNACTIVECOLOR;
  3410.               FillRect(R1);
  3411.             end
  3412.          else
  3413.            begin
  3414.              Frame3D(Cnvs, R1, clBtnShadow, clBtnShadow, 1);
  3415.              Brush.Color := clBtnFace;
  3416.              FillRect(R1);
  3417.            end;
  3418.      end;
  3419.    C := clBlack;
  3420.     case i of
  3421.       DOWNBUTTON:
  3422.         case Kind of
  3423.           sbHorizontal:
  3424.             DrawArrowImage(Cnvs, R1, C, 1);
  3425.           sbVertical:
  3426.             DrawArrowImage(Cnvs, R1, C, 3);
  3427.         end;
  3428.       UPBUTTON:
  3429.         case Kind of
  3430.           sbHorizontal:
  3431.             DrawArrowImage(Cnvs, R1, C, 2);
  3432.           sbVertical:
  3433.             DrawArrowImage(Cnvs, R1, C, 4);
  3434.         end;
  3435.     end;
  3436.   end
  3437.   else
  3438.     begin
  3439.       if I = THUMB
  3440.       then
  3441.         with Buttons[THUMB] do
  3442.         begin
  3443.           if Down or IsFocused
  3444.           then R1 := DownThumbRect
  3445.           else if MouseIn then R1 := ActiveThumbRect
  3446.           else R1 := ThumbRect;
  3447.           ThumbB := TBitMap.Create;
  3448.           ThumbB.Width := RectWidth(R);
  3449.           ThumbB.Height := RectHeight(R);
  3450.           if FPageSize = 0
  3451.           then
  3452.             ThumbB.Canvas.CopyRect(Rect(0, 0, ThumbB.Width, ThumbB.Height), Picture.Canvas, R1)
  3453.           else
  3454.             case Kind of
  3455.               sbHorizontal:
  3456.                 CreateHSkinImage(ThumbOffset1, ThumbOffset2, ThumbB, Picture, R1,
  3457.                   ThumbB.Width, ThumbB.Height);
  3458.               sbVertical:
  3459.                 CreateVSkinImage(ThumbOffset1, ThumbOffset2, ThumbB, Picture, R1,
  3460.                   ThumbB.Width, ThumbB.Height);
  3461.             end;
  3462.           // draw glyph
  3463.           if Down or IsFocused
  3464.           then R1 := DownGlyphRect
  3465.           else if MouseIn then R1 := ActiveGlyphRect
  3466.           else R1 := GlyphRect;
  3467.           if not IsNullRect(R1)
  3468.           then
  3469.             begin
  3470.               R2 := Rect(ThumbB.Width div 2 - RectWidth(R1) div 2,
  3471.                          ThumbB.Height div 2 - RectHeight(R1) div 2,
  3472.                          ThumbB.Width div 2 - RectWidth(R1) div 2 + RectWidth(R1),
  3473.                          ThumbB.Height div 2 - RectHeight(R1) div 2 + RectHeight(R1));
  3474.               ThumbB.Canvas.CopyRect(R2, Picture.Canvas, R1)
  3475.             end;
  3476.           //
  3477.           Cnvs.Draw(R.Left, R.Top, ThumbB);
  3478.           ThumbB.Free;
  3479.         end
  3480.       else
  3481.         begin
  3482.           R1 := NullRect;
  3483.           case I of
  3484.             UPBUTTON:
  3485.             with Buttons[UPBUTTON] do
  3486.             begin
  3487.               if Down and MouseIn
  3488.               then R1 := DownUpButtonRect
  3489.               else if MouseIn then R1 := ActiveUpButtonRect;
  3490.             end;
  3491.             DOWNBUTTON:
  3492.             with Buttons[DOWNBUTTON] do
  3493.             begin
  3494.               if Down and MouseIn
  3495.               then R1 := DownDownButtonRect
  3496.               else if MouseIn then R1 := ActiveDownButtonRect;
  3497.             end
  3498.           end;
  3499.           if not IsNullRect(R1)
  3500.           then
  3501.             Cnvs.CopyRect(Buttons[i].R, Picture.Canvas, R1);
  3502.         end;
  3503.     end;
  3504. end;
  3505. procedure TbsSkinScrollBar.CalcRects;
  3506. var
  3507.   Kf: Double;
  3508.   i, j, k, XMin, XMax: Integer;
  3509.   Offset: Integer;
  3510.   ThumbW, ThumbH: Integer;
  3511.   NewWidth: Integer;
  3512. begin
  3513.   if FMin = FMax
  3514.   then Kf := 0
  3515.   else kf := (FPosition - FMin) / (FMax - FMin);
  3516.   if FIndex = -1
  3517.   then
  3518.     begin
  3519.       ThumbW := SBUTTONW;
  3520.       if FBoth
  3521.       then
  3522.         NewWidth := Width - BothMarkerWidth
  3523.       else
  3524.         NewWidth := Width;
  3525.       case FKind of
  3526.         sbHorizontal:
  3527.           begin
  3528.             Buttons[DOWNBUTTON].R := Rect(1, 1, 1 + SBUTTONW, Height - 1);
  3529.             Buttons[UPBUTTON].R := Rect(NewWidth - SBUTTONW - 1, 1, NewWidth - 1, Height - 1);
  3530.             NewTrackArea := Rect(SBUTTONW + 1, 1, NewWidth - SBUTTONW - 1, Height - 1);
  3531.             if FPageSize = 0
  3532.             then
  3533.               begin
  3534.                 Offset1 := NewTrackArea.Left + ThumbW div 2;
  3535.                 Offset2 := NewTrackArea.Right - ThumbW div 2;
  3536.                 BOffset := Round((Offset2 - Offset1) * kf);
  3537.                 Buttons[THUMB].R :=
  3538.                  Rect(Offset1 + BOffset - ThumbW div 2, NewTrackArea.Top,
  3539.                      Offset1 + BOffset + ThumbW div 2, NewTrackArea.Bottom);
  3540.               end
  3541.             else
  3542.               begin
  3543.                 i := RectWidth(NewTrackArea);
  3544.                 j := FMax - FMin + 1;
  3545.                 if j = 0 then kf := 0 else kf := FPageSize / j;
  3546.                 j := Round(i * kf);
  3547.                 if j < ThumbW then j := ThumbW;
  3548.                 XMin := FMin;
  3549.                 XMax := FMax - FPageSize + 1;
  3550.                 if XMax > XMin
  3551.                 then
  3552.                   kf := (FPosition - XMin) / (XMax - XMin)
  3553.                 else
  3554.                   kf := 1;
  3555.                 Offset1 := NewTrackArea.Left + j div 2;
  3556.                 Offset2 := NewTrackArea.Right - j div 2;
  3557.                 BOffset := Round((Offset2 - Offset1) * kf);
  3558.                 Buttons[THUMB].R :=
  3559.                  Rect(Offset1 + BOffset - j div 2, NewTrackArea.Top,
  3560.                      Offset1 + BOffset + j div 2, NewTrackArea.Bottom);
  3561.               end;
  3562.           end;
  3563.         sbVertical:
  3564.           begin
  3565.             Buttons[DOWNBUTTON].R := Rect(1, 1, Width - 1, 1 + SBUTTONW);
  3566.             Buttons[UPBUTTON].R := Rect(1, Height - SBUTTONW - 1, Width - 1, Height - 1);
  3567.             NewTrackArea := Rect(1, SBUTTONW + 1, Width - 1, Height - SBUTTONW - 1);
  3568.             if PageSize = 0
  3569.             then
  3570.               begin
  3571.                 Offset1 := NewTrackArea.Top + ThumbW div 2;
  3572.                 Offset2 := NewTrackArea.Bottom - ThumbW div 2;
  3573.                 BOffset := Round((Offset2 - Offset1) * kf);
  3574.                 Buttons[THUMB].R :=
  3575.                   Rect(NewTrackArea.Left, Offset1 + BOffset - ThumbW div 2,
  3576.                        NewTrackArea.Right, Offset1 + BOffset + ThumbW div 2);
  3577.               end
  3578.             else
  3579.               begin
  3580.                 i := RectHeight(NewTrackArea);
  3581.                 j := FMax - FMin + 1;
  3582.                 if j = 0 then kf := 0 else kf := FPageSize / j;
  3583.                 j := Round(i * kf);
  3584.                 if j < ThumbW then j := ThumbW;
  3585.                 XMin := FMin;
  3586.                 XMax := FMax - FPageSize + 1;
  3587.                 if XMax - XMin > 0
  3588.                 then
  3589.                   kf := (FPosition - XMin) / (XMax - XMin)
  3590.                 else
  3591.                   kf := 0;
  3592.                 Offset1 := NewTrackArea.Top + j div 2;
  3593.                 Offset2 := NewTrackArea.Bottom - j div 2;
  3594.                 BOffset := Round((Offset2 - Offset1) * kf);
  3595.                 Buttons[THUMB].R :=
  3596.                   Rect(NewTrackArea.Left, Offset1 + BOffset - j div 2,
  3597.                       NewTrackArea.Right, Offset1 + BOffset + j div 2);
  3598.              end;
  3599.           end;
  3600.       end;
  3601.     end
  3602.    else
  3603.      begin
  3604.        ThumbW := RectWidth(ThumbRect);
  3605.        ThumbH := RectHeight(ThumbRect);
  3606.        case FKind of
  3607.          sbHorizontal:
  3608.            begin
  3609.              Offset := Width - RectWidth(SkinRect);
  3610.              NewTrackArea := TrackArea;
  3611.              Inc(NewTrackArea.Right, Offset);
  3612.              Buttons[UPBUTTON].R := UpButtonRect;
  3613.              Buttons[DOWNBUTTON].R := DownButtonRect;
  3614.              //
  3615.              if UpButtonRect.Left > RTPt.X
  3616.              then
  3617.                OffsetRect(Buttons[UPBUTTON].R, Offset, 0);
  3618.              if DownButtonRect.Left > RTPt.X
  3619.              then
  3620.                OffsetRect(Buttons[DOWNBUTTON].R, Offset, 0);
  3621.              if FPageSize = 0
  3622.              then
  3623.                begin
  3624.                  Offset1 := NewTrackArea.Left + ThumbW div 2;
  3625.                  Offset2 := NewTrackArea.Right - ThumbW div 2;
  3626.                  BOffset := Round((Offset2 - Offset1) * kf);
  3627.                  Buttons[THUMB].R :=
  3628.                    Rect(Offset1 + BOffset - ThumbW div 2,
  3629.                         NewTrackArea.Top + RectHeight(NewTrackArea) div 2 - ThumbH div 2,
  3630.                         Offset1 + BOffset + ThumbW div 2,
  3631.                         NewTrackArea.Top + RectHeight(NewTrackArea) div 2 - ThumbH div 2 + ThumbH);
  3632.                end
  3633.              else
  3634.                begin
  3635.                  i := RectWidth(NewTrackArea);
  3636.                  j := FMax - FMin + 1;
  3637.                  if j = 0 then kf := 0 else kf := FPageSize / j;
  3638.                  j := Round(i * kf);
  3639.                  if j < ThumbW then j := ThumbW;
  3640.                  XMin := FMin;
  3641.                  XMax := FMax - FPageSize + 1;
  3642.                  if XMax <= XMin
  3643.                  then
  3644.                    kf := 1
  3645.                  else
  3646.                    kf := (FPosition - XMin) / (XMax - XMin);
  3647.                  Offset1 := NewTrackArea.Left + j div 2;
  3648.                  Offset2 := NewTrackArea.Right - j div 2;
  3649.                  BOffset := Round((Offset2 - Offset1) * kf);
  3650.                  Buttons[THUMB].R :=
  3651.                  Rect(Offset1 + BOffset - j div 2,
  3652.                       NewTrackArea.Top + RectHeight(NewTrackArea) div 2 - ThumbH div 2,
  3653.                       Offset1 + BOffset + j div 2,
  3654.                       NewTrackArea.Top + RectHeight(NewTrackArea) div 2 - ThumbH div 2 +
  3655.                       ThumbH);
  3656.               end;
  3657.            end;
  3658.          sbVertical:
  3659.            begin
  3660.              Offset := Height - RectHeight(SkinRect);
  3661.              NewTrackArea := TrackArea;
  3662.              Inc(NewTrackArea.Bottom, Offset);
  3663.              Buttons[UPBUTTON].R := UpButtonRect;
  3664.              Buttons[DOWNBUTTON].R := DownButtonRect;
  3665.              if UpButtonRect.Top > LBPt.Y
  3666.              then
  3667.                OffsetRect(Buttons[UPBUTTON].R, 0, Offset);
  3668.              if DownButtonRect.Top > LBPt.Y
  3669.              then
  3670.                OffsetRect(Buttons[DOWNBUTTON].R, 0, Offset);
  3671.              if PageSize = 0
  3672.              then
  3673.               begin
  3674.                 Offset1 := NewTrackArea.Top + ThumbH div 2;
  3675.                 Offset2 := NewTrackArea.Bottom - ThumbH div 2;
  3676.                 BOffset := Round((Offset2 - Offset1) * kf);
  3677.                 Buttons[THUMB].R :=
  3678.                   Rect(NewTrackArea.Left + RectWidth(NewTrackArea) div 2 -
  3679.                        ThumbW div 2,
  3680.                        Offset1 + BOffset - ThumbH div 2,
  3681.                        NewTrackArea.Left + RectWidth(NewTrackArea) div 2 -
  3682.                        ThumbW div 2 + ThumbW,
  3683.                        Offset1 + BOffset + ThumbH div 2);
  3684.               end
  3685.              else
  3686.                begin
  3687.                  i := RectHeight(NewTrackArea);
  3688.                  j := FMax - FMin + 1;
  3689.                  if j = 0 then kf := 0 else kf := FPageSize / j;
  3690.                  j := Round(i * kf);
  3691.                  if j < ThumbH then j := ThumbH;
  3692.                  XMin := FMin;
  3693.                  XMax := FMax - FPageSize + 1;
  3694.                  if XMax - XMin <= 0
  3695.                  then
  3696.                    kf := 0
  3697.                  else
  3698.                    kf := (FPosition - XMin) / (XMax - XMin);
  3699.                  Offset1 := NewTrackArea.Top + j div 2;
  3700.                  Offset2 := NewTrackArea.Bottom - j div 2;
  3701.                  BOffset := Round((Offset2 - Offset1) * kf);
  3702.                  Buttons[THUMB].R :=
  3703.                    Rect(NewTrackArea.Left + RectWidth(NewTrackArea) div 2 -
  3704.                         ThumbW div 2,
  3705.                         Offset1 + BOffset - j div 2,
  3706.                         NewTrackArea.Left + RectWidth(NewTrackArea) div 2 -
  3707.                         ThumbW div 2 + ThumbW,
  3708.                         Offset1 + BOffset + j div 2);
  3709.                end;
  3710.            end;
  3711.        end;
  3712.      end;
  3713. end;
  3714. procedure TbsSkinScrollBar.SetKind;
  3715. var
  3716.   S: Integer;
  3717. begin
  3718.   if AValue <> FKind
  3719.   then
  3720.     begin
  3721.       FKind := AValue;
  3722.       RePaint;
  3723.     end;
  3724.   if (csDesigning in ComponentState) and not
  3725.      (csLoading in ComponentState)
  3726.   then
  3727.     begin
  3728.       if FKind = sbVertical
  3729.       then
  3730.         begin
  3731.           FSkinDataName := 'vscrollbar';
  3732.           if Width > Height
  3733.           then
  3734.             begin
  3735.               S := Width;
  3736.               Width := Height;
  3737.               Height := S;
  3738.             end;
  3739.           FDefaultWidth := FDefaultHeight;
  3740.           FDefaultHeight := 0;
  3741.         end
  3742.       else
  3743.         begin
  3744.           FSkinDataName := 'hscrollbar';
  3745.           if Width < Height
  3746.           then
  3747.             begin
  3748.               S := Width;
  3749.               Width := Height;
  3750.               Height := S;
  3751.             end;
  3752.           FDefaultHeight := FDefaultWidth;
  3753.           FDefaultWidth := 0;
  3754.         end;
  3755.     end;
  3756. end;
  3757. procedure TbsSkinScrollBar.SimplySetPosition;
  3758. var
  3759.   TempValue: Integer;
  3760. begin
  3761.   if FPageSize = 0
  3762.   then
  3763.     begin
  3764.       if AValue < FMin then TempValue := FMin else
  3765.       if AValue > FMax then TempValue := FMax else
  3766.       TempValue := AValue;
  3767.     end
  3768.   else
  3769.     begin
  3770.       if AValue < FMin then TempValue := FMin else
  3771.       if AValue > FMax - FPageSize + 1 then
  3772.       TempValue := FMax - FPageSize + 1  else
  3773.       TempValue := AValue;
  3774.     end;
  3775.   if TempValue <> FPosition
  3776.   then
  3777.     begin
  3778.       FPosition := TempValue;
  3779.       RePaint;
  3780.    end;
  3781. end;
  3782. procedure TbsSkinScrollBar.SetPosition;
  3783. var
  3784.   TempValue: Integer;
  3785. begin
  3786.   if FPageSize = 0
  3787.   then
  3788.     begin
  3789.       if AValue < FMin then TempValue := FMin else
  3790.       if AValue > FMax then TempValue := FMax else
  3791.       TempValue := AValue;
  3792.     end
  3793.   else
  3794.     begin
  3795.       if AValue < FMin then TempValue := FMin else
  3796.       if AValue > FMax - FPageSize + 1 then
  3797.       TempValue := FMax - FPageSize + 1  else
  3798.       TempValue := AValue;
  3799.     end;
  3800.   if TempValue <> FPosition
  3801.   then
  3802.     begin
  3803.       FPosition := TempValue;
  3804.       RePaint;
  3805.       if Assigned(FOnChange) then FOnChange(Self);
  3806.     end;
  3807. end;
  3808. procedure TbsSkinScrollBar.SetRange;
  3809. begin
  3810.   FMin := AMin;
  3811.   FMax := AMax;
  3812.   FPageSize := APageSize;
  3813.   if FPageSize = 0
  3814.   then
  3815.     begin
  3816.       if APosition < FMin then FPosition := FMin else
  3817.       if APosition > FMax then FPosition := FMax else
  3818.       FPosition := APosition;
  3819.     end
  3820.   else
  3821.     begin
  3822.       if APosition < FMin then FPosition := FMin else
  3823.       if APosition > FMax - FPageSize + 1 then
  3824.       FPosition := FMax - FPageSize + 1  else
  3825.       FPosition := APosition;
  3826.     end;
  3827.   RePaint;
  3828. end;
  3829. procedure TbsSkinScrollBar.SetMax;
  3830. begin
  3831.   FMax := AValue;
  3832.   if FPageSize = 0
  3833.   then
  3834.     begin
  3835.       if FPosition > FMax then FPosition := FMax;
  3836.     end
  3837.   else
  3838.     begin
  3839.       if FPageSize + FPosition > FMax - FMin
  3840.       then
  3841.         FPosition := (FMax - FMin) - FPageSize + 1;
  3842.       if FPosition < FMin then FPosition := FMin;
  3843.     end;
  3844.   RePaint;
  3845. end;
  3846. procedure TbsSkinScrollBar.SetMin;
  3847. begin
  3848.   FMin := AValue;
  3849.   if FPosition < FMin then FPosition := FMin;
  3850.   RePaint;
  3851. end;
  3852. procedure TbsSkinScrollBar.SetSmallChange;
  3853. begin
  3854.   FSmallChange := AValue;
  3855.   RePaint;
  3856. end;
  3857. procedure TbsSkinScrollBar.SetLargeChange;
  3858. begin
  3859.   FLargeChange := AValue;
  3860.   RePaint;
  3861. end;
  3862. procedure TbsSkinScrollBar.CreateControlDefaultImage;
  3863. var
  3864.   R: TRect;
  3865.   i: Integer;
  3866.   j: Integer;
  3867. begin
  3868.   CalcRects;
  3869.   R := ClientRect;
  3870.   with B.Canvas do
  3871.   begin
  3872.     Brush.Color := clBtnFace;
  3873.     FillRect(R);
  3874.   end;
  3875.   if Enabled then j :=  0 else j := 1;
  3876.   for i := j to BUTCOUNT - 1 do DrawButton(B.Canvas, i);
  3877. end;
  3878. procedure TbsSkinScrollBar.MouseDown;
  3879. var
  3880.   i: Integer;
  3881.   j: Integer;
  3882. begin
  3883.   inherited;
  3884.   if Button <> mbLeft
  3885.   then
  3886.     begin
  3887.       inherited;
  3888.       Exit;
  3889.     end;
  3890.   MouseD := True;
  3891.   CalcRects;
  3892.   TimerMode := 0;
  3893.   WaitMode := True;
  3894.   j := -1;
  3895.   for i := 0 to BUTCOUNT - 1 do
  3896.   begin
  3897.     if PtInRect(Buttons[i].R, Point(X, Y))
  3898.     then
  3899.       begin
  3900.         j := i;
  3901.         Break;
  3902.       end;
  3903.   end;
  3904.   if j <> -1
  3905.   then
  3906.     begin
  3907.       CaptureButton := j;
  3908.       ButtonDown(j, X, Y);
  3909.     end
  3910.   else
  3911.     begin
  3912.       if PtInRect(NewTrackArea, Point(X, Y))
  3913.       then
  3914.         case Kind of
  3915.           sbHorizontal:
  3916.             begin
  3917.               if X < Buttons[THUMB].R.Left
  3918.               then
  3919.                 begin
  3920.                   Position := Position - LargeChange;
  3921.                   TimerMode := 3;
  3922.                   SetTimer(Handle, 1, 500, nil);
  3923.                   if Assigned(FOnPageUp) then FOnPageUp(Self);
  3924.                 end
  3925.               else
  3926.                 begin
  3927.                   Position := Position + LargeChange;
  3928.                   TimerMode := 4;
  3929.                   SetTimer(Handle, 1, 500, nil);
  3930.                   if Assigned(FOnPageDown) then FOnPageDown(Self);
  3931.                 end;
  3932.             end;
  3933.           sbVertical:
  3934.            begin
  3935.              if Y < Buttons[THUMB].R.Top
  3936.               then
  3937.                 begin
  3938.                   Position := Position - LargeChange;
  3939.                   TimerMode := 3;
  3940.                   SetTimer(Handle, 1, 500, nil);
  3941.                   if Assigned(FOnPageUp) then FOnPageUp(Self);
  3942.                 end
  3943.               else
  3944.                 begin
  3945.                   Position := Position + LargeChange;
  3946.                   TimerMode := 4;
  3947.                   SetTimer(Handle, 1, 500, nil);
  3948.                   if Assigned(FOnPageDown) then FOnPageDown(Self);
  3949.                 end;
  3950.            end;
  3951.         end;
  3952.     end;
  3953. end;
  3954. procedure TbsSkinScrollBar.MouseUp;
  3955. begin
  3956.   inherited;
  3957.   MouseD := False;
  3958.   if (TimerMode >= 3) then StopTimer;
  3959.   if CaptureButton <> -1
  3960.   then ButtonUp(CaptureButton, X, Y);
  3961.   if (Button = mbLeft) and (CaptureButton = 0) and Assigned(FOnLastChange)
  3962.   then
  3963.     FOnLastChange(Self);
  3964.   CaptureButton := -1;
  3965. end;
  3966. function TbsSkinScrollBar.CalcValue;
  3967. var
  3968.   kf: Double;
  3969.   TempPos: Integer;
  3970. begin
  3971.   if FPageSize = 0
  3972.   then
  3973.     begin
  3974.       if (Offset2 - Offset1) <= 0
  3975.       then kf := 0
  3976.       else kf := AOffset / (Offset2 - Offset1);
  3977.       if kf > 1 then kf := 1 else
  3978.       if kf < 0 then kf := 0;
  3979.       Result := FMin + Round((FMax - FMin) * kf);
  3980.     end
  3981.   else
  3982.     begin
  3983.       case Kind of
  3984.         sbVertical:
  3985.           begin
  3986.             Offset1 := NewTrackArea.Top + RectHeight(Buttons[THUMB].R) div 2;
  3987.             Offset2 := NewTrackArea.Bottom - RectHeight(Buttons[THUMB].R) div 2;
  3988.           end;
  3989.         sbHorizontal:
  3990.           begin
  3991.             Offset1 := NewTrackArea.Left + RectWidth(Buttons[THUMB].R) div 2;
  3992.             Offset2 := NewTrackArea.Right - RectWidth(Buttons[THUMB].R) div 2;
  3993.           end;
  3994.       end;
  3995.       TempPos := OldBOffset + AOffset;
  3996.       if (Offset2 - Offset1) <= 0
  3997.       then kf := 0
  3998.       else kf := TempPos / (Offset2 - Offset1);
  3999.       if kf > 1 then kf := 1 else
  4000.       if kf < 0 then kf := 0;
  4001.       Result := FMin + Round((FMax - FMin - FPageSize + 1) * kf);
  4002.     end;
  4003. end;
  4004. procedure TbsSkinScrollBar.MouseMove;
  4005. var
  4006.   Off: Integer;
  4007. begin
  4008.   MX := X; MY := Y;
  4009.   TestActive(X, Y);
  4010.   if FDown
  4011.   then
  4012.     case Kind of
  4013.       sbVertical:
  4014.         begin
  4015.           if PageSize = 0
  4016.           then
  4017.             begin
  4018.               Off := Y - OMPos;
  4019.               Off := OldBOffset + Off;
  4020.               Position := CalcValue(Off);
  4021.             end
  4022.           else
  4023.             Off := Y - OMPos;
  4024.           Position := CalcValue(Off);
  4025.         end;
  4026.       sbHorizontal:
  4027.         begin
  4028.           if PageSize = 0
  4029.           then
  4030.             begin
  4031.               Off := X - OMPos;
  4032.               Off := OldBOffset + Off;
  4033.               Position := CalcValue(Off);
  4034.             end
  4035.           else
  4036.             Off := X - OMPos;
  4037.           Position := CalcValue(Off);
  4038.         end;
  4039.     end;
  4040.   inherited;
  4041. end;
  4042. procedure TbsSkinScrollBar.ButtonDown;
  4043. begin
  4044.   Buttons[i].Down := True;
  4045.   RePaint;
  4046.   case i of
  4047.     THUMB:
  4048.       with Buttons[THUMB] do
  4049.       begin
  4050.         if Kind = sbVertical then OMPos := Y else OMPos := X;
  4051.         OldBOffset := BOffset;
  4052.         OldPosition := Position;
  4053.         case Kind of
  4054.          sbHorizontal:
  4055.            begin
  4056.              FScrollWidth := NewTrackArea.Right - R.Right;
  4057.              if FScrollWidth <= 0
  4058.              then FScrollWidth := R.Left - NewTrackArea.Left;
  4059.            end;
  4060.          sbVertical:
  4061.            begin
  4062.              FScrollWidth := NewTrackArea.Bottom - R.Bottom;
  4063.              if FScrollWidth <= 0
  4064.              then FScrollWidth := R.Top - NewTrackArea.Top;
  4065.            end;
  4066.         end;
  4067.         FDown := True;
  4068.         RePaint;
  4069.       end;
  4070.     DOWNBUTTON:
  4071.       with Buttons[UPBUTTON] do
  4072.       begin
  4073.         if Assigned(FOnDownButtonClick)
  4074.         then
  4075.           FOnDownButtonClick(Self)
  4076.         else
  4077.           Position := Position - SmallChange;
  4078.         TimerMode := 1;
  4079.         SetTimer(Handle, 1, 500, nil);
  4080.       end;
  4081.     UPBUTTON:
  4082.       with Buttons[DOWNBUTTON] do
  4083.       begin
  4084.         if Assigned(FOnUpButtonClick)
  4085.         then
  4086.           FOnUpButtonClick(Self)
  4087.         else
  4088.           Position := Position + SmallChange;
  4089.         TimerMode := 2;
  4090.         SetTimer(Handle, 1, 500, nil);
  4091.       end;
  4092.   end;
  4093. end;
  4094. procedure TbsSkinScrollBar.ButtonUp;
  4095. begin
  4096.   Buttons[i].Down := False;
  4097.   if ActiveButton <> i then Buttons[i].MouseIn := False;
  4098.   RePaint;
  4099.   case i of
  4100.     THUMB:
  4101.       begin
  4102.         FDown := False;
  4103.       end;
  4104.     UPBUTTON:
  4105.       with Buttons[UPBUTTON] do
  4106.       begin
  4107.         StopTimer;
  4108.       end;
  4109.     DOWNBUTTON:
  4110.       with Buttons[DOWNBUTTON] do
  4111.       begin
  4112.         StopTimer;
  4113.       end;
  4114.   end;
  4115. end;
  4116. procedure TbsSkinScrollBar.ButtonEnter(I: Integer);
  4117. begin
  4118.   Buttons[i].MouseIn := True;
  4119.   RePaint;
  4120.   case i of
  4121.     THUMB:
  4122.       with Buttons[THUMB] do
  4123.       begin
  4124.       end;
  4125.     UPBUTTON:
  4126.       with Buttons[UPBUTTON] do
  4127.       begin
  4128.         if Down then SetTimer(Handle, 1, 50, nil);
  4129.       end;
  4130.     DOWNBUTTON:
  4131.       with Buttons[DOWNBUTTON] do
  4132.       begin
  4133.         if Down then SetTimer(Handle, 1, 50, nil);
  4134.       end;
  4135.   end;
  4136. end;
  4137. procedure TbsSkinScrollBar.ButtonLeave(I: Integer);
  4138. begin
  4139.   Buttons[i].MouseIn := False;
  4140.   RePaint;
  4141.   case i of
  4142.     THUMB:
  4143.       with Buttons[THUMB] do
  4144.       begin
  4145.       end;
  4146.     UPBUTTON:
  4147.       with Buttons[UPBUTTON] do
  4148.       begin
  4149.         if Down then  KillTimer(Handle, 1);
  4150.       end;
  4151.     DOWNBUTTON:
  4152.       with Buttons[DOWNBUTTON] do
  4153.       begin
  4154.         if Down then  KillTimer(Handle, 1);
  4155.       end;
  4156.   end;
  4157. end;
  4158. procedure TbsSkinScrollBar.StartScroll;
  4159. begin
  4160.   KillTimer(Handle, 1);
  4161.   SetTimer(Handle, 1, 50, nil);
  4162. end;
  4163. procedure TbsSkinScrollBar.WMTimer;
  4164. var
  4165.   CanScroll: Boolean;
  4166. begin
  4167.   inherited;
  4168.   if WaitMode
  4169.   then
  4170.     begin
  4171.       WaitMode := False;
  4172.       StartScroll;
  4173.       Exit;
  4174.     end;
  4175.   case TimerMode of
  4176.     1:
  4177.       begin
  4178.         if Assigned(FOnDownButtonClick)
  4179.         then
  4180.           FOnDownButtonClick(Self)
  4181.         else
  4182.           Position := Position - SmallChange;
  4183.       end;
  4184.     2:
  4185.       begin
  4186.         if Assigned(FOnUpButtonClick)
  4187.         then
  4188.           FOnUpButtonClick(Self)
  4189.         else
  4190.           Position := Position + SmallChange;
  4191.       end;
  4192.     3:
  4193.       begin
  4194.         TestActive(MX, MY);
  4195.         case Kind of
  4196.           sbHorizontal: CanScroll := MX < Buttons[THUMB].R.Left;
  4197.           sbVertical: CanScroll := MY < Buttons[THUMB].R.Top;
  4198.         end;
  4199.         if CanScroll
  4200.         then
  4201.           begin
  4202.             Position := Position - LargeChange;
  4203.             if Assigned(FOnPageUp) then FOnPageUp(Self);
  4204.           end
  4205.         else
  4206.           StopTimer;
  4207.       end;
  4208.     4:
  4209.       begin
  4210.         TestActive(MX, MY);
  4211.         case Kind of
  4212.           sbHorizontal: CanScroll := MX > Buttons[THUMB].R.Right;
  4213.           sbVertical: CanScroll := MY > Buttons[THUMB].R.Bottom;
  4214.         end;
  4215.         if CanScroll
  4216.         then
  4217.           begin
  4218.             Position := Position + LargeChange;
  4219.             if Assigned(FOnPageDown) then FOnPageDown(Self);
  4220.           end
  4221.         else
  4222.           StopTimer;
  4223.       end;
  4224.   end;
  4225. end;
  4226. procedure TbsSkinScrollBar.CMMouseLeave;
  4227. begin
  4228.   inherited;
  4229.   if (csDesigning in ComponentState) then Exit;
  4230.   if (ActiveButton <> -1) and (CaptureButton = -1) and not FDown
  4231.   then
  4232.     begin
  4233.       Buttons[ActiveButton].MouseIn := False;
  4234.       RePaint;
  4235.       ActiveButton := -1;
  4236.     end;
  4237.   if MouseD and (TimerMode > 3) then StopTimer;
  4238. end;
  4239. procedure TbsSkinScrollBar.CMMouseEnter;
  4240. begin
  4241.   inherited;
  4242. end;
  4243. constructor TbsSkinSplitter.Create(AOwner: TComponent);
  4244. begin
  4245.   inherited;
  4246.   ControlStyle := ControlStyle + [csOpaque];
  4247.   FSkinPicture := nil;
  4248.   FIndex := -1;
  4249.   FDefaultSize := 10;
  4250.   FSkinDataName := 'vsplitter';
  4251. end;
  4252. destructor  TbsSkinSplitter.Destroy;
  4253. begin
  4254.   inherited;
  4255. end;
  4256. procedure TbsSkinSplitter.Paint;
  4257. var
  4258.   Buffer: TBitMap;
  4259. begin
  4260.   if (Width <= 0) or (Height <= 0) then Exit;
  4261.   GetSkinData;
  4262.   if (FIndex <> -1) and (Align <> alNone) and (Align <> alClient)
  4263.   then
  4264.     begin
  4265.       Buffer := TBitMap.Create;
  4266.       if (Align = alTop) or (Align = alBottom)
  4267.       then
  4268.         CreateHSkinImage(LTPt.X, RectWidth(SkinRect) - RtPt.X,
  4269.           Buffer, FSkinPicture, SkinRect, Width, RectHeight(SkinRect))
  4270.       else
  4271.         CreateVSkinImage(LTPt.Y, RectHeight(SkinRect) - LBPt.Y,
  4272.           Buffer, FSkinPicture, SkinRect, RectWidth(SkinRect), Height);
  4273.       Canvas.Draw(0, 0, Buffer);
  4274.       Buffer.Free;
  4275.     end
  4276.   else
  4277.     inherited;
  4278. end;
  4279. procedure TbsSkinSplitter.Notification;
  4280. begin
  4281.   inherited Notification(AComponent, Operation);
  4282.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  4283. end;
  4284. procedure TbsSkinSplitter.GetSkinData;
  4285. begin
  4286.   if (FSD = nil) or FSD.Empty
  4287.   then
  4288.     FIndex := -1
  4289.   else
  4290.     FIndex := FSD.GetControlIndex(FSkinDataName);
  4291.   FSkinPicture := nil;
  4292.   if FIndex <> -1
  4293.   then
  4294.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinSplitterControl
  4295.     then
  4296.       with TbsDataSkinSplitterControl(FSD.CtrlList.Items[FIndex]) do
  4297.       begin
  4298.         LTPt := LTPoint;
  4299.         RTPt := RTPoint;
  4300.         LBPt := LBPoint;
  4301.         Self.SkinRect := SkinRect;
  4302.         if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
  4303.         then
  4304.           FSkinPicture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
  4305.         else
  4306.           FSkinPicture := nil;
  4307.       end;
  4308. end;
  4309. procedure TbsSkinSplitter.ChangeSkinData;
  4310. begin
  4311.   GetSkinData;
  4312.   if (Align = alTop) or (Align = alBottom)
  4313.   then
  4314.     begin
  4315.       if FIndex = -1
  4316.       then
  4317.         MinSize := FDefaultSize
  4318.       else
  4319.         MinSize := RectHeight(SkinRect);
  4320.       Height := MinSize;
  4321.     end
  4322.   else
  4323.     begin
  4324.       if FIndex = -1
  4325.       then
  4326.         MinSize := FDefaultSize
  4327.       else
  4328.         MinSize := RectWidth(SkinRect);
  4329.      Width := MinSize;
  4330.     end;
  4331.   RePaint;  
  4332. end;
  4333. procedure TbsSkinSplitter.SetSkinData;
  4334. begin
  4335.   FSD := Value;
  4336.   ChangeSkinData;
  4337. end;
  4338. constructor TbsSkinControlBar.Create(AOwner: TComponent);
  4339. begin
  4340.   inherited;
  4341.   FSkinPicture := nil;
  4342.   FIndex := -1;
  4343.   if (csDesigning in ComponentState)
  4344.   then
  4345.     begin
  4346.       AutoSize := True;
  4347.       AutoDrag := False;
  4348.       RowSnap := False;
  4349.     end;
  4350.   FSkinDataName := 'controlbar';  
  4351. end;
  4352. destructor TbsSkinControlBar.Destroy;
  4353. begin
  4354.   inherited;
  4355. end;
  4356. procedure TbsSkinControlBar.Notification;
  4357. begin
  4358.   inherited Notification(AComponent, Operation);
  4359.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;