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

Delphi控件源码

开发平台:

Delphi

  1.     ActiveObject := -1;
  2.     MouseCaptureObject := -1;
  3.     TbsMenuBarObject(ObjectList.Items[0]).Free;
  4.     ObjectList.Delete(0);
  5.   end;
  6.   ButtonsCount := 0;
  7. end;
  8. procedure TbsSkinMainMenuBar.MDIChildMaximize;
  9. var
  10.   BS: TbsBusinessSkinForm;
  11. begin
  12.   if not FMDIChildMax
  13.   then
  14.     begin
  15.       FMDIChildMax := True;
  16.       OldActiveObject := -1;
  17.       ActiveObject := -1;
  18.       MouseCaptureObject := -1;
  19.       AddButtons;
  20.       BS := GetMDIChildBusinessSkinFormComponent;
  21.       if BS <> nil then CheckButtons(BS.BorderIcons); 
  22.       RePaint;
  23.     end;
  24. end;
  25. procedure TbsSkinMainMenuBar.MDIChildRestore;
  26. var
  27.   BS: TbsBusinessSkinForm;
  28. begin
  29.   BS := GetMDIChildBusinessSkinFormComponent;
  30.   if (BS = nil) and FMDIChildMax
  31.   then
  32.     begin
  33.       FMDIChildMax := False;
  34.       DeleteButtons;
  35.       RePaint;
  36.     end
  37.   else
  38.     if BS <> nil
  39.     then CheckButtons(BS.BorderIcons);
  40. end;
  41. function TbsSkinMainMenuBar.GetMarkerRect;
  42. begin
  43.   Result :=  Rect(NewItemsRect.Right - TRACKMARKEROFFSET, NewItemsRect.Top,
  44.                   NewItemsRect.Right, NewItemsRect.Bottom);
  45. end;
  46. procedure TbsSkinMainMenuBar.DrawMarker;
  47. var
  48.   C: TColor;
  49. begin
  50.   if FIndex <> -1
  51.   then
  52.     begin
  53.       if MarkerActive
  54.       then C := TrackMarkActiveColor
  55.       else C := TrackMarkColor;
  56.     end
  57.   else
  58.     begin
  59.       if MarkerActive
  60.       then C := clBtnText
  61.       else C := clBtnShadow;
  62.     end;
  63.   DrawArrowImage(Cnvs, GetMarkerRect, C, 2);
  64. end;
  65. procedure TbsSkinMainMenuBar.TrackScrollMenu;
  66. var
  67.   i, VisibleCount: Integer;
  68.   R: TRect;
  69.   P: TPoint;
  70.   ChildMainMenu: TMainMenu;
  71. begin
  72.   if BSF = nil then Exit;
  73.   VisibleCount := 0;
  74.   for i := 0 to ObjectList.Count - 1 do
  75.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  76.     then
  77.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  78.       begin
  79.         if Visible then Inc(VisibleCount);
  80.       end;
  81.   P := Point(NewItemsRect.Right, NewItemsRect.Top);
  82.   P := ClientToScreen(P);
  83.   R := Rect(P.X - TRACKMARKEROFFSET, P.Y,
  84.             P.X, P.Y + RectHeight(NewItemsRect));
  85.   if BSF.FForm.FormStyle = fsMDIForm
  86.   then
  87.     ChildMainMenu := GetChildMainMenu
  88.   else
  89.     ChildMainMenu := nil;
  90.   BSF.SkinMenuOpen;
  91.   if ChildMainMenu = nil
  92.   then
  93.     BSF.SkinMenu.Popup(nil, FSD, VisibleCount, R, FMainMenu.Items, False)
  94.   else
  95.     BSF.SkinMenu.Popup2(nil, FSD, VisibleCount, R, FMainMenu.Items, ChildMainMenu.Items, False);
  96. end;
  97. function TbsSkinMainMenuBar.FindHotKeyItem;
  98. var
  99.   i: Integer;
  100. begin
  101.   Result := False;
  102.   if (BSF <> nil) and (ObjectList <> nil) then 
  103.   for i := 0 to ObjectList.Count - 1 do
  104.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  105.     then
  106.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  107.       begin
  108.         if Enabled and Visible and
  109.            IsAccel(CharCode, MenuItem.Caption)
  110.         then
  111.           begin
  112.             MouseEnter;
  113.             if (not BSF.InMenu) or (MenuItem.Count = 0) then MouseDown(0, 0, mbLeft);
  114.             Result := True;
  115.             Break;
  116.           end;
  117.       end
  118. end;
  119. procedure TbsSkinMainMenuBar.NextMainMenuItem;
  120. function IsEndItem(Index: Integer): Boolean;
  121. var
  122.   i: Integer;
  123. begin
  124.   Result := True;
  125.   if Index + 1 > ObjectList.Count - 1
  126.   then
  127.     Result := True
  128.   else
  129.   for i := Index + 1 to ObjectList.Count - 1 do
  130.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  131.     then
  132.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  133.       begin
  134.         if Enabled and Visible then Result := False;
  135.       end
  136. end;
  137. var
  138.   i, j: Integer;
  139.   EndI: Boolean;
  140.   FirstItem: Integer;
  141. begin
  142.   EndI := False;
  143.   FirstItem := -1;
  144.   j := -1;
  145.   for i := 0 to ObjectList.Count - 1 do
  146.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  147.     then
  148.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  149.       begin
  150.         if Enabled and Visible
  151.         then
  152.           begin
  153.             if FirstItem = -1 then FirstItem := i;
  154.             if (Active or FDown)
  155.             then
  156.               begin
  157.                 j := i;
  158.                 MouseLeave;
  159.                 EndI := IsEndItem(j);
  160.                 Break;
  161.               end;
  162.           end;
  163.        end;   
  164.   if j = -1
  165.   then
  166.     begin
  167.       j := FirstItem;
  168.       if j <> -1 then
  169.         TbsSkinMainMenuBarItem(ObjectList.Items[j]).MouseEnter;
  170.     end
  171.   else
  172.     begin
  173.       if EndI then j := 0 else j := j + 1;
  174.       if j < ObjectList.Count then
  175.       for i := j to ObjectList.Count - 1 do
  176.       if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  177.       then
  178.         with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  179.         begin
  180.           if Enabled and Visible
  181.           then
  182.             begin
  183.               MouseEnter;
  184.               Break;
  185.             end;
  186.         end;    
  187.     end;
  188. end;
  189. procedure TbsSkinMainMenuBar.PriorMainMenuItem;
  190. function IsEndItem(Index: Integer): Boolean;
  191. var
  192.   i: Integer;
  193. begin
  194.   Result := True;
  195.   if Index - 1 < 0
  196.   then
  197.     Result := True
  198.   else
  199.   for i := Index - 1 downto 0 do
  200.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  201.     then
  202.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  203.       begin
  204.         if Enabled and Visible then Result := False;
  205.       end
  206. end;
  207. var
  208.   i, j: Integer;
  209.   EndI: Boolean;
  210.   LastItem: Integer;
  211. begin
  212.   EndI := False;
  213.   j := -1;
  214.   LastItem := -1;
  215.   for i := ObjectList.Count - 1 downto 0 do
  216.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  217.     then
  218.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  219.       begin
  220.         if Enabled and Visible
  221.         then
  222.           begin
  223.             if LastItem = -1 then LastItem := i;
  224.             if Active or FDown then
  225.             begin
  226.               j := i;
  227.               MouseLeave;
  228.               EndI := IsEndItem(j);
  229.               Break;
  230.             end;
  231.           end;
  232.       end;
  233.   if j = -1
  234.   then
  235.     begin
  236.       j := LastItem;
  237.       if j <> -1 then
  238.         TbsSkinMainMenuBarItem(ObjectList.Items[j]).MouseEnter;
  239.     end
  240.   else
  241.     begin
  242.       if EndI then j := ObjectList.Count - 1 else j := j - 1;
  243.       if j > -1 then
  244.       for i := j downto 0 do
  245.       if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  246.       then
  247.        with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  248.        begin
  249.          if Enabled and Visible
  250.          then
  251.            begin
  252.              MouseEnter;
  253.              Break;
  254.            end;
  255.        end;
  256.     end;
  257. end;
  258. function TbsSkinMainMenuBar.CheckReturnKey;
  259. var
  260.   i: Integer;
  261. begin
  262.   Result := False;
  263.   if BSF <> nil then 
  264.   for i := 0 to ObjectList.Count - 1 do
  265.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  266.     then
  267.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  268.       begin
  269.         if (FDown and (MenuItem.Count = 0)) or
  270.            (Active and not BSF.InMenu)
  271.         then
  272.           begin
  273.             Active := False;
  274.             MouseDown(0, 0, mbLeft);
  275.             Result := True;
  276.             Break;
  277.          end;
  278.       end;
  279. end;
  280. procedure TbsSkinMainMenuBar.MenuEnter;
  281. var
  282.   i: Integer;
  283.   FirstItem: Integer;
  284. begin
  285.   FirstItem := -1;
  286.   MenuActive := True;
  287.   for i := 0 to ObjectList.Count - 1 do
  288.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  289.     then
  290.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  291.       begin
  292.         if FirstItem = -1 then FirstItem := i;
  293.         if Active
  294.         then
  295.           begin
  296.             FirstItem := i;
  297.             Break;
  298.           end;
  299.       end;
  300.   if FirstItem <> -1
  301.   then
  302.     begin
  303.       TbsSkinMainMenuBarItem(ObjectList.Items[FirstItem]).MouseEnter;
  304.       if BSF <> nil then
  305.       with BSF do
  306.       begin
  307.         HookApp;
  308.         InMainMenu := True;
  309.         if Assigned(OnMainMenuEnter) then OnMainMenuEnter(Self);
  310.       end;
  311.     end;
  312. end;
  313. procedure TbsSkinMainMenuBar.MenuClose;
  314. var
  315.   i: Integer;
  316. begin
  317.   for i := 0 to ObjectList.Count - 1 do
  318.   if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem then
  319.   begin
  320.     with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  321.       if FDown then
  322.        begin
  323.          FDown := False;
  324.          Active := True;
  325.          DrawSkinObject(TbsSkinMainMenuBarItem(ObjectList.Items[i]));
  326.          Break;
  327.        end;
  328.   end;
  329. end;
  330. procedure TbsSkinMainMenuBar.MenuExit;
  331. var
  332.   i: Integer;
  333. begin
  334.   MenuActive := False;
  335.   for i := 0 to ObjectList.Count - 1 do
  336.     if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarItem then
  337.     begin
  338.       with TbsSkinMainMenuBarItem(ObjectList.Items[i]) do
  339.         if FDown or Active then
  340.         begin
  341.           Active := False;
  342.           FMouseIn := False;
  343.           FDown := False;
  344.           ReDraw;
  345.           Break;
  346.         end;
  347.     end;
  348.   ActiveObject := -1;
  349.   OldActiveObject := -1;
  350. end;
  351. procedure TbsSkinMainMenuBar.CalcRects;
  352. var
  353.   Off: Integer;
  354.   i: Integer;
  355. begin
  356.   if FSkinSupport
  357.   then
  358.     begin
  359.       Off := RectWidth(SkinRect) - ItemsRect.Right;
  360.       NewItemsRect := Rect(ItemsRect.Left, ItemsRect.Top, Width - Off, ItemsRect.Bottom);
  361.     end
  362.   else
  363.     NewItemsRect := Rect(2, 2, Width - 2, Height - 2);
  364.   if FMDIChildMax and (ButtonsCount = 4)
  365.   then
  366.     begin
  367.       if TbsMenuBarObject(ObjectList.Items[0]) is TbsSkinMainMenuBarButton
  368.       then
  369.         with TbsSkinMainMenuBarButton((ObjectList.Items[0])) do
  370.         begin
  371.           if FSkinSupport
  372.           then
  373.             begin
  374.               ObjectRect := Rect(NewItemsRect.Left,
  375.                 NewItemsRect.Top +
  376.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2,
  377.                 NewItemsRect.Left + RectWidth(SkinRect),
  378.                 NewItemsRect.Top +
  379.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2 +
  380.                 RectHeight(SkinRect));
  381.               Inc(NewItemsRect.Left, RectWidth(SkinRect) + 2);
  382.             end
  383.           else
  384.             begin
  385.               ObjectRect := Rect(NewItemsRect.Left,
  386.                                  NewItemsRect.Top,
  387.                                  NewItemsRect.Left + RectHeight(NewItemsRect),
  388.                                  NewItemsRect.Bottom);
  389.               Inc(NewItemsRect.Left, RectHeight(NewItemsRect) + 2);
  390.             end;
  391.         end;
  392.       for i := 1 to 3 do
  393.       if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarButton
  394.       then
  395.         with TbsSkinMainMenuBarButton((ObjectList.Items[i])) do
  396.         begin
  397.           if FSkinSupport
  398.           then
  399.             begin
  400.               ObjectRect := Rect(NewItemsRect.Right - RectWidth(SkinRect),
  401.                 NewItemsRect.Top +
  402.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2,
  403.                 NewItemsRect.Right,
  404.                 NewItemsRect.Top +
  405.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2 +
  406.                 RectHeight(SkinRect));
  407.               Dec(NewItemsRect.Right, RectWidth(SkinRect) + 2);
  408.             end
  409.           else
  410.             begin
  411.               ObjectRect := Rect(NewItemsRect.Right - RectHeight(NewItemsRect),
  412.                                  NewItemsRect.Top,
  413.                                  NewItemsRect.Right,
  414.                                  NewItemsRect.Bottom);
  415.               Dec(NewItemsRect.Right, RectHeight(NewItemsRect) + 2);
  416.             end;
  417.         end;
  418.     end;
  419. end;
  420. procedure TbsSkinMainMenuBar.DrawSkinObject;
  421. begin
  422.   if AObject.Visible then AObject.Draw(Canvas);
  423. end;
  424. procedure TbsSkinMainMenuBar.GetSkinData;
  425. begin
  426.   inherited;
  427.   if FIndex <> -1
  428.   then
  429.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinMainMenuBar
  430.     then
  431.       with TbsDataSkinMainMenuBar(FSD.CtrlList.Items[FIndex]) do
  432.       begin
  433.         Self.SkinRect := SkinRect;
  434.         Self.ItemsRect := ItemsRect;
  435.         Self.MenuBarItem := MenuBarItem;
  436.         Self.CloseButton := CloseButton;
  437.         Self.MaxButton := MaxButton;
  438.         Self.MinButton := MinButton;
  439.         Self.SysMenuButton := SysMenuButton;
  440.         Self.TrackMarkColor := TrackMarkColor;
  441.         Self.TrackMarkActiveColor := TrackMarkActiveColor;
  442.         if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
  443.         then
  444.           Picture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
  445.         else
  446.           Picture := nil;
  447.       end;
  448. end;
  449. procedure TbsSkinMainMenuBar.WMSize;
  450. begin
  451.   inherited;
  452.   CalcRects;
  453. end;
  454. function TbsSkinMainMenuBar.GetChildMainMenu: TMainMenu;
  455. var
  456.   i: Integer;
  457. begin
  458.   Result := nil;
  459.   if (Application.MainForm <> nil) and (Application.MainForm.ActiveMDIChild <> nil)
  460.   then
  461.     with Application.MainForm.ActiveMDIChild do
  462.     begin
  463.       for i := 0 to ComponentCount - 1 do
  464.       begin
  465.         if Components[i] is TMainMenu
  466.         then
  467.           begin
  468.             Result := TMainMenu(Components[i]);
  469.             Break;
  470.           end;
  471.       end;
  472.     end;
  473. end;
  474. procedure TbsSkinMainMenuBar.CreateMenu;
  475. function CompareValues(Item1, Item2: Pointer): Integer;
  476. begin
  477.   if TMenuItem(Item1).GroupIndex > TMenuItem(Item2).GroupIndex then Result := 1;
  478.   if TMenuItem(Item1).GroupIndex = TMenuItem(Item2).GroupIndex then Result := 0;
  479.   if TMenuItem(Item1).GroupIndex < TMenuItem(Item2).GroupIndex then Result := -1;
  480. end;
  481. var
  482.   i, j: Integer;
  483.   MMIData: TbsDataSkinMainMenuBarItem;
  484.   BS: TbsBusinessSkinForm;
  485.   ChildMainMenu: TMainMenu;
  486.   miL: TList;
  487.   HasExist: Boolean;
  488. begin
  489.   ClearObjects;
  490.   if FMainMenu = nil then Exit;
  491.   if (BSF <> nil) and (BSF.FForm.FormStyle = fsMDIForm)
  492.   then
  493.     ChildMainMenu := GetChildMainMenu
  494.   else
  495.     ChildMainMenu := nil;
  496.   if (FSD = nil) or (FSD.Empty)
  497.   then
  498.     MMIData := nil
  499.   else
  500.     begin
  501.       j := FSD.GetIndex(MenuBarItem);
  502.       if j <> -1
  503.       then MMIData := TbsDataSkinMainMenuBarItem(FSD.ObjectList.Items[j])
  504.       else MMIData := nil;
  505.     end;
  506.   ChildMenuIn := ChildMainMenu <> nil;
  507.   if ChildMenuIn and ScrollMenu then ScrollMenu := False;
  508.   if ChildMainMenu = nil
  509.   then
  510.     begin
  511.       for i := 0 to FMainMenu.Items.Count - 1 do
  512.       if FMainMenu.Items[i].Visible
  513.       then
  514.         begin
  515.           ObjectList.Add(TbsSkinMainMenuBarItem.Create(Self, MMIData));
  516.           with TbsSkinMainMenuBarItem(ObjectList.Items[ObjectList.Count - 1]) do
  517.           begin
  518.             IDName := FMainMenu.Items[i].Name;
  519.             Enabled := FMainMenu.Items[i].Enabled;
  520.             MenuItem := FMainMenu.Items[i];
  521.           end;
  522.         end;
  523.      end
  524.    else
  525.      begin
  526.        miL := TList.Create;
  527.        for i := 0 to FMainMenu.Items.Count - 1 do
  528.        begin
  529.          HasExist := False;
  530.          for j := 0 to ChildMainMenu.Items.Count - 1 do
  531.          begin
  532.            if ChildMainMenu.Items[j].GroupIndex = FMainMenu.Items[i].GroupIndex
  533.            then
  534.              begin
  535.                HasExist := True;
  536.                Break;
  537.              end;
  538.          end;
  539.          if not HasExist then miL.Add(FMainMenu.Items[i]);
  540.        end;
  541.        for i := 0 to ChildMainMenu.Items.Count - 1 do
  542.          miL.Add(ChildMainMenu.Items[I]);
  543.        miL.Sort(@CompareValues);
  544.        for i := 0 to miL.Count - 1 do
  545.          if TMenuItem(miL.Items[i]).Visible
  546.          then
  547.            begin
  548.              ObjectList.Add(TbsSkinMainMenuBarItem.Create(Self, MMIData));
  549.              with TbsSkinMainMenuBarItem(ObjectList.Items[ObjectList.Count - 1]) do
  550.              begin
  551.                IDName := TMenuItem(miL.Items[i]).Name;
  552.                Enabled := TMenuItem(miL.Items[i]).Enabled;
  553.                MenuItem := TMenuItem(miL.Items[i]);
  554.              end;
  555.            end;
  556.         miL.Free;
  557.      end;
  558.   if Self.FMDIChildMax
  559.   then
  560.     begin
  561.       AddButtons;
  562.       BS := GetMDIChildBusinessSkinFormComponent;
  563.       if BS <> nil then CheckButtons(BS.BorderIcons);
  564.     end;
  565. end;
  566. procedure TbsSkinMainMenuBar.SetMainMenu;
  567. begin
  568.   FMainMenu := Value;
  569.   CreateMenu;
  570.   RePaint;
  571. end;
  572. procedure TbsSkinMainMenuBar.UpDateItems;
  573. begin
  574.   CreateMenu;
  575.   RePaint;
  576.   ActiveObject := -1;
  577.   OldActiveObject := -1;
  578.   MouseTimer.Enabled := True;
  579. end;
  580. procedure  TbsSkinMainMenuBar.ClearObjects;
  581. var
  582.   i: Integer;
  583. begin
  584.   for i := 0 to ObjectList.Count - 1 do
  585.     TbsMenuBarObject(ObjectList.Items[i]).Free;
  586.   ObjectList.Clear;
  587.   ButtonsCount := 0;
  588. end;
  589. procedure TbsSkinMainMenuBar.CMMouseEnter;
  590. begin
  591.   inherited;
  592.   if (csDesigning in ComponentState) then Exit;
  593.   if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
  594.   MouseTimer.Enabled := True;
  595. end;
  596. procedure TbsSkinMainMenuBar.CMMouseLeave;
  597. begin
  598.   inherited;
  599.   if (csDesigning in ComponentState) then Exit;
  600.   if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
  601.   MouseTimer.Enabled := False;
  602.   TestActive(-1, -1);
  603. end;
  604. procedure TbsSkinMainMenuBar.MouseDown;
  605. begin
  606.   inherited;
  607.   TestActive(X, Y);
  608.   if (ActiveObject <> - 1)
  609.   then
  610.     with TbsMenuBarObject(ObjectList.Items[ActiveObject]) do
  611.     begin
  612.       MouseCaptureObject := ActiveObject;
  613.       MouseDown(X, Y, Button);
  614.       if ssDouble in Shift then DblCLick;
  615.     end
  616.   else
  617.     if Scroll and FScrollMenu
  618.     then
  619.       begin
  620.         if PtInRect(GetMarkerRect, Point(X, Y)) then TrackScrollMenu;
  621.       end;
  622. end;
  623. procedure TbsSkinMainMenuBar.MouseUp;
  624. begin
  625.   if (MouseCaptureObject <> -1)
  626.   then
  627.     begin
  628.       TbsMenuBarObject(ObjectList.Items[MouseCaptureObject]).MouseUp(X, Y, Button);
  629.       MouseCaptureObject := -1;
  630.     end;
  631.   inherited;
  632. end;
  633. procedure TbsSkinMainMenuBar.MouseMove;
  634. begin
  635.   if not MouseTimer.Enabled
  636.   then MouseTimer.Enabled := True;
  637.   inherited;
  638. end;
  639. procedure TbsSkinMainMenuBar.BeforeChangeSkinData;
  640. begin
  641.   FSkinSupport := False;
  642.   inherited;
  643.   ClearObjects;
  644. end;
  645. procedure TbsSkinMainMenuBar.ChangeSkinData;
  646. begin
  647.   GetSkinData;
  648.   FSkinSupport := FIndex <> -1;
  649.   CreateMenu;
  650.   if FSkinSupport
  651.   then
  652.     Height := RectHeight(SkinRect)
  653.   else
  654.     if FDefaultHeight > 0 then Height := FDefaultHeight;
  655.   RePaint;
  656. end;
  657. procedure TbsSkinMainMenuBar.TestActive;
  658. var
  659.   i: Integer;
  660.   B: Boolean;
  661. begin
  662.   if (ObjectList.Count = 0) then Exit;
  663.   OldActiveObject := ActiveObject;
  664.   i := -1;
  665.   B := False;
  666.   repeat
  667.     Inc(i);
  668.     with TbsMenuBarObject(ObjectList.Items[i]) do
  669.     begin
  670.       if Enabled then B := PtInRect(ObjectRect, Point(X, Y));
  671.     end;
  672.   until B or (i = ObjectList.Count - 1);
  673.   if not B and (OldActiveObject <> -1) and MenuActive and
  674.      (TbsMenuBarObject(ObjectList.Items[OldActiveObject]) is
  675.       TbsSkinMainMenuBarItem)
  676.   then
  677.     ActiveObject := OldActiveObject
  678.   else
  679.     if B then ActiveObject := i else ActiveObject := -1;
  680.   if (MouseCaptureObject <> -1) and
  681.      (ActiveObject <> MouseCaptureObject) and (ActiveObject <> -1)
  682.   then
  683.     ActiveObject := -1;
  684.   if OldActiveObject >= ObjectList.Count then OldActiveObject := -1;
  685.   if ActiveObject >= ObjectList.Count then ActiveObject := -1;
  686.   if (OldActiveObject <> ActiveObject)
  687.   then
  688.     begin
  689.       if OldActiveObject <> - 1
  690.       then
  691.         if TbsMenuBarObject(ObjectList.Items[OldActiveObject]).Enabled
  692.         then TbsMenuBarObject(ObjectList.Items[OldActiveObject]).MouseLeave;
  693.       if ActiveObject <> -1
  694.       then
  695.         if TbsMenuBarObject(ObjectList.Items[ActiveObject]).Enabled
  696.         then TbsMenuBarObject(ObjectList.Items[ActiveObject]).MouseEnter;
  697.     end;
  698.   if Scroll and FScrollMenu
  699.   then
  700.     begin
  701.       if PtInRect(GetMarkerRect, Point(X, Y)) and not MarkerActive
  702.       then
  703.         begin
  704.           MarkerActive := True;
  705.           DrawMarker(Canvas);
  706.         end
  707.       else
  708.         if MarkerActive and not PtInRect(GetMarkerRect, Point(X, Y))
  709.         then
  710.           begin
  711.             MarkerActive := False;
  712.             DrawMarker(Canvas);
  713.           end;  
  714.     end;
  715. end;
  716. procedure TbsSkinMainMenuBar.TestMouse;
  717. var
  718.   P: TPoint;
  719. begin
  720.   GetCursorPos(P);
  721.   P := ScreenToClient(P);
  722.   if (P.X >= 0) and (P.Y >= 0) and (P.X <= Width) and (P.Y <= Height)
  723.   then
  724.     TestActive(P.X, P.Y)
  725.   else
  726.     if MouseTimer.Enabled
  727.     then
  728.       begin
  729.         MouseTimer.Enabled := False;
  730.         TestActive(-1, -1);
  731.       end;
  732. end;
  733. procedure TbsSkinMainMenuBar.SetBounds;
  734. begin
  735.   GetSkinData;
  736.   if FIndex <> -1 then AHeight := RectHeight(SkinRect);
  737.   inherited;
  738.   RePaint;
  739. end;
  740. procedure TbsSkinMainMenuBar.PaintMenuBar(Cnvs: TCanvas);
  741. var
  742.   Buffer: TBitMap;
  743.   R: TRect;
  744.   i: Integer;
  745. begin
  746.   GetSkinData;
  747.   Buffer := TBitMap.Create;
  748.   R := Rect(0, 0, Width, Height);
  749.   if FIndex <> -1
  750.   then
  751.     begin
  752.       CreateHSkinImage(ItemsRect.Left, RectWidth(SkinRect) - ItemsRect.Right,
  753.         Buffer, Picture, SkinRect, Width, Height);
  754.     end
  755.   else
  756.     begin
  757.       Buffer.Width := Width;
  758.       Buffer.Height := Height;
  759.       with Buffer.Canvas do
  760.       begin
  761.         Brush.Color := clBtnFace;
  762.         FillRect(R);
  763.       end;
  764.     end;
  765.   CalcRects;
  766.   Scroll := False;
  767.   for i := 0 to ObjectList.Count - 1 do
  768.   with TbsMenuBarObject(ObjectList.Items[i]) do
  769.     begin
  770.       if Visible then Draw(Buffer.Canvas);
  771.     end;
  772.   if Scroll and FScrollMenu then DrawMarker(Buffer.Canvas);
  773.   Cnvs.Draw(0, 0, Buffer);
  774.   Buffer.Free;
  775. end;
  776. procedure TbsSkinMainMenuBar.Paint;
  777. begin
  778. end;
  779. procedure TbsSkinMainMenuBar.WMEraseBkgnd;
  780. var
  781.   Cnvs: TCanvas;
  782. begin
  783.   Cnvs := TCanvas.Create;
  784.   Cnvs.Handle := TWMEraseBkgnd(Message).DC;
  785.   PaintMenuBar(Cnvs);
  786.   Cnvs.Free;
  787.   Message.Result := 1;
  788. end;
  789. procedure TbsSkinMainMenuBar.Notification(AComponent: TComponent;
  790.                                           Operation: TOperation);
  791. begin
  792.   inherited Notification(AComponent, Operation);
  793.   if (Operation = opRemove) and (AComponent = FMainMenu)
  794.   then FMainMenu := nil;
  795.     if (Operation = opRemove) and (AComponent = BSF)
  796.   then BSF := nil;
  797. end;
  798. //============= TbsBusinessSkinForm  =============//
  799. type
  800.   TParentForm = class(TForm);
  801. constructor TbsBusinessSkinForm.Create(AOwner: TComponent);
  802. begin
  803.   inherited Create(AOwner);
  804.   FClientWidth := 0;
  805.   FClientHeight := 0;
  806.   PreviewMode := False;
  807.   FHideCaptionButtons := False;
  808.   FAlwaysShowInTray := False;
  809.   FLogoBitMap := TBitMap.Create;
  810.   FLogoBitMapTransparent := False;
  811.   FAlwaysMinimizeToTray := False;
  812.   FIcon := nil;
  813.   FShowIcon := False;
  814.   FMaximizeOnFullScreen := False;
  815.   FAlphaBlendAnimation := False;
  816.   FAlphaBlend := False;
  817.   FAlphaBlendValue := 200;
  818.   FSkinHint := nil;
  819.   FShowObjectHint := False;
  820.   FUseDefaultObjectHint := True;
  821.   FSkinSupport := False;
  822.   FDefCaptionFont := TFont.Create;
  823.   FDefInActiveCaptionFont := TFont.Create;
  824.   FMenusAlphaBlend := False;
  825.   FMenusAlphaBlendValue := 200;
  826.   FMenusAlphaBlendAnimation := False;
  827.   with FDefCaptionFont do
  828.   begin
  829.     Name := 'Arial';
  830.     Style := [fsBold];
  831.     Height := 14;
  832.     Color := clBtnText;
  833.   end;
  834.   with FDefInActiveCaptionFont do
  835.   begin
  836.     Name := 'Arial';
  837.     Style := [fsBold];
  838.     Height := 14;
  839.     Color := clBtnShadow;
  840.   end;
  841.   InMenu := False;
  842.   InMainMenu := False;
  843.   RMTop := TBitMap.Create;
  844.   RMLeft := TBitMap.Create;
  845.   RMBottom := TBitMap.Create;
  846.   RMRight := TBitMap.Create;
  847.   BlackColor := RGB(0, 0, 0);
  848.   ObjectList := TList.Create;
  849.   FSD := nil;
  850.   FMainMenu := nil;
  851.   FSystemMenu := nil;
  852.   FInChangeSkinData := False;
  853.   MouseTimer := TTimer.Create(Self);
  854.   MouseTimer.Enabled := False;
  855.   MouseTimer.OnTimer := TestMouse;
  856.   MouseTimer.Interval := MouseTimerInterval;
  857.   MorphTimer := TTimer.Create(Self);
  858.   MorphTimer.Enabled := False;
  859.   MorphTimer.OnTimer := TestMorph;
  860.   MorphTimer.Interval := MorphTimerInterval;
  861.   AnimateTimer := TTimer.Create(Self);
  862.   AnimateTimer.Enabled := False;
  863.   AnimateTimer.OnTimer := TestAnimate;
  864.   AnimateTimer.Interval := AnimateTimerInterval;
  865.   OldBoundsRect := NulLRect;
  866.   OldActiveObject := -1;
  867.   ActiveObject := -1;
  868.   MouseCaptureObject := -1;
  869.   MouseIn := False;
  870.   FMinWidth := 0;
  871.   FMinHeight := 0;
  872.   FRGN := 0;
  873.   FClientInstance := nil;
  874.   FPrevClientProc := nil;
  875.   FForm := TForm(Owner);
  876.   FForm.BorderIcons := [];
  877.   FForm.OnShortCut := FormShortCut;
  878.   FForm.AutoSize := False;
  879.   FForm.AutoScroll := False;
  880.   FSysMenu := TPopupMenu.Create(Self);
  881.   FUseDefaultSysMenu := True;
  882.   FSysTrayMenu := TbsSkinPopupMenu.Create(Self);
  883.   FSysTrayMenu.ComponentForm := FForm;
  884.   CreateSysTrayMenu;
  885.   SkinMenu := TbsSkinMenu.CreateEx(Self, FForm);
  886.   FMagneticSize := 5;
  887.   FBorderIcons := [biSystemMenu, biMinimize, biMaximize, biRollUp];
  888.   FFullDrag := False;
  889.   FSizeMove := False;
  890.   FFormWidth := 0;
  891.   FFormHeight := 0;
  892.   FMainMenuBar := nil;
  893.   FMDITabsBar := nil;
  894.   FInShortCut := False;
  895.   if not (csDesigning in ComponentState)
  896.   then
  897.     begin
  898.       OldWindowProc := FForm.WindowProc;
  899.       FForm.WindowProc := NewWndProc;
  900.       TParentForm(FForm).ReCreateWnd;
  901.       SetWindowLong(FForm.Handle, GWL_STYLE,
  902.       GETWINDOWLONG(FForm.Handle, GWL_STYLE) and not WS_CAPTION);
  903.     end;
  904. end;
  905. destructor TbsBusinessSkinForm.Destroy;
  906. begin
  907.   if not (csDesigning in ComponentState) and (FForm <> nil)
  908.   then
  909.     FForm.WindowProc := OldWindowProc;
  910.   FDefCaptionFont.Free;
  911.   FDefInActiveCaptionFont.Free;
  912.   FLogoBitMap.Free;
  913.   FSysMenu.Free;
  914.   FSysTrayMenu.Free;
  915.   ClearObjects;
  916.   RMTop.Free;
  917.   RMLeft.Free;
  918.   RMBottom.Free;
  919.   RMRight.Free;
  920.   MouseTimer.Free;
  921.   MorphTimer.Free;
  922.   AnimateTimer.Free;
  923.   ObjectList.Free;
  924.   SkinMenu.Free;
  925.   if FRgn <> 0 then DeleteObject(FRgn);
  926.   if FIcon <> nil then FIcon.Free;
  927.   inherited Destroy;
  928. end;
  929. function TbsBusinessSkinForm.GetRealHeight;
  930. begin
  931.   if Self.RollUpState
  932.   then
  933.     Result := OldHeight
  934.   else
  935.     Result := FFormHeight;
  936. end;
  937. procedure TbsBusinessSkinForm.SetLogoBitMap;
  938. begin
  939.   FLogoBitMap.Assign(Value);
  940. end;
  941. procedure TbsBusinessSkinForm.DrawLogoBitMap(C: TCanvas);
  942. var
  943.   X, Y: Integer;
  944. begin
  945.   X := FForm.ClientWidth div 2 - FLogoBitMap.Width div 2;
  946.   Y := FForm.ClientHeight div 2 - FLogoBitMap.Height div 2;
  947.   if X < 0 then X := 0;
  948.   if Y < 0 then Y := 0;
  949.   if FLogoBitMap.Transparent <> FLogoBitmapTransparent
  950.   then
  951.     FLogoBitmap.Transparent := FLogoBitmapTransparent;
  952.   C.Draw(X, Y, FLogoBitMap);
  953. end;
  954. function TbsBusinessSkinForm.GetUseSkinFontInMenu: Boolean;
  955. begin
  956.   Result := SkinMenu.UseSkinFont;
  957. end;
  958. procedure TbsBusinessSkinForm.SetUseSkinFontInMenu(Value: Boolean);
  959. begin
  960.   SkinMenu.UseSkinFont := Value;
  961. end;
  962. procedure TbsBusinessSkinForm.SetShowIcon(Value: Boolean);
  963. begin
  964.   FShowIcon := Value;
  965.   if not (csDesigning in ComponentState) and
  966.      not (csLoading in ComponentState)
  967.   then
  968.     SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);   
  969. end;
  970. procedure TbsBusinessSkinForm.GetIcon;
  971. var
  972.   IH: HICON;
  973.   IX, IY: Integer;
  974.   B: Boolean;
  975. begin
  976.   if FIcon = nil
  977.   then
  978.     begin
  979.       FIcon := TIcon.Create;
  980.       B := False;
  981.       IH := 0;
  982.       if FForm.Icon.Handle <> 0
  983.       then
  984.         IH := FForm.Icon.Handle
  985.       else
  986.       if Application.Icon.Handle <> 0
  987.       then
  988.         IH := Application.Icon.Handle
  989.       else
  990.         begin
  991.           IH := LoadIcon(0, IDI_APPLICATION);
  992.           B := True;
  993.         end;
  994.       GetIconSize(IX, IY);
  995.       FIcon.Handle := CopyImage(IH, IMAGE_ICON, IX, IY, LR_COPYFROMRESOURCE);
  996.       if B then DestroyIcon(IH);
  997.     end;
  998. end;
  999. procedure TbsBusinessSkinForm.DrawFormIcon(Cnvs: TCanvas; X, Y: Integer);
  1000. begin
  1001.   GetIcon;
  1002.   if FIcon <> nil then
  1003.     DrawIconEx(Cnvs.Handle, X, Y, FIcon.Handle, 0, 0, 0, 0, DI_NORMAL);
  1004. end;
  1005. procedure TbsBusinessSkinForm.GetIconSize(var X, Y: Integer);
  1006. begin
  1007.   X := GetSystemMetrics(SM_CXSMICON);
  1008.   if X = 0 then X := GetSystemMetrics(SM_CXSIZE);
  1009.   Y := GetSystemMetrics(SM_CYSMICON);
  1010.   if Y = 0 then Y := GetSystemMetrics(SM_CYSIZE);
  1011. end;
  1012. procedure TbsBusinessSkinForm.MDIItemClick(Sender: TObject);
  1013. var
  1014.   I: Integer;
  1015.   S1, S2: String;
  1016.   MainBSF, ChildBSF: TbsBusinessSkinForm;
  1017. begin
  1018.   MainBSF := GetBusinessSkinFormComponent(Application.MainForm);
  1019.   if MainBSF = nil then Exit;
  1020.   S1 := TMenuItem(Sender).Name;
  1021.   S2 := MI_CHILDITEM;
  1022.   Delete(S1, Pos(S2, S1), Length(S2));
  1023.   for I := 0 to MainBSF.FForm.MDIChildCount - 1 do
  1024.     if MainBSF.FForm.MDIChildren[I].Name = S1
  1025.     then
  1026.       begin
  1027.         ChildBSF := GetBusinessSkinFormComponent(MainBSF.FForm.MDIChildren[I]);
  1028.         if (ChildBSF <> nil) and (ChildBSF.WindowState = wsMinimized)
  1029.         then
  1030.           ChildBSF.WindowState := wsNormal;
  1031.         MainBSF.FForm.MDIChildren[I].Show;
  1032.       end;
  1033. end;
  1034. procedure TbsBusinessSkinForm.UpDateChildCaptionInMenu(Child: TCustomForm);
  1035. var
  1036.   WM: TMenuItem;
  1037.   MainBSF: TbsBusinessSkinForm;
  1038.   I: Integer;
  1039.   S1, S2: String;
  1040. begin
  1041.   MainBSF := BusinessSkinForm.GetBusinessSkinFormComponent(Application.MainForm);
  1042.   if MainBSF = nil then Exit;
  1043.   WM := MainBSF.FForm.WindowMenu;
  1044.   if WM = nil then Exit;
  1045.   for I := 0 to WM.Count - 1 do
  1046.   if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1047.   then
  1048.     begin
  1049.       S1 := WM.Items[I].Name;
  1050.       S2 := MI_CHILDITEM;
  1051.       Delete(S1, Pos(S2, S1), Length(S2));
  1052.       if Child.Name = S1
  1053.       then
  1054.         begin
  1055.           WM.Items[I].Caption := Child.Caption;
  1056.           Break;
  1057.         end;
  1058.     end;
  1059. end;
  1060. procedure TbsBusinessSkinForm.UpDateChildActiveInMenu;
  1061. var
  1062.   WM: TMenuItem;
  1063.   MainBSF: TbsBusinessSkinForm;
  1064.   I: Integer;
  1065.   S1, S2: String;
  1066. begin
  1067.   MainBSF := BusinessSkinForm.GetBusinessSkinFormComponent(Application.MainForm);
  1068.   if MainBSF = nil then Exit;
  1069.   WM := MainBSF.FForm.WindowMenu;
  1070.   if WM = nil then Exit;
  1071.   for I := 0 to WM.Count - 1 do
  1072.   if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1073.   then
  1074.     begin
  1075.       S1 := WM.Items[I].Name;
  1076.       S2 := MI_CHILDITEM;
  1077.       Delete(S1, Pos(S2, S1), Length(S2));
  1078.       if MainBSF.FForm.ActiveMDIChild.Name = S1
  1079.       then
  1080.         WM.Items[I].Checked := True
  1081.       else
  1082.         WM.Items[I].Checked := False;
  1083.     end;
  1084. end;
  1085. procedure TbsBusinessSkinForm.RefreshMDIBarTab(Child: TCustomForm);
  1086. var
  1087.   MainBSF: TbsBusinessSkinForm;
  1088.   I: Integer;
  1089. begin
  1090.   MainBSF := BusinessSkinForm.GetBusinessSkinFormComponent(Application.MainForm);
  1091.   if (MainBSF = nil) or (MainBSF.MDITabsBar = nil) then Exit;
  1092.   with MainBSF.MDITabsBar do
  1093.    for I := 0 to ObjectList.Count - 1 do
  1094.     if TbsMDITab(ObjectList.Items[I]).Child = Child
  1095.     then
  1096.       TbsMDITab(ObjectList.Items[I]).Draw(MainBSF.MDITabsBar.Canvas);
  1097. end;
  1098. procedure TbsBusinessSkinForm.AddChildToMenu;
  1099. var
  1100.   WM: TMenuItem;
  1101.   NewItem: TMenuItem;
  1102.   MainBSF: TbsBusinessSkinForm;
  1103. begin
  1104.   MainBSF := BusinessSkinForm.GetBusinessSkinFormComponent(Application.MainForm);
  1105.   if MainBSF = nil then Exit;
  1106.   WM := MainBSF.FForm.WindowMenu;
  1107.   if WM = nil then Exit;
  1108.   NewItem := TMenuItem.Create(Self);
  1109.   NewItem.Name := Child.Name + MI_CHILDITEM;
  1110.   NewItem.Caption := Child.Caption;
  1111.   NewItem.OnClick := MDIItemClick;
  1112.   WM.Add(NewItem);
  1113. end;
  1114. procedure TbsBusinessSkinForm.AddChildToBar;
  1115. var
  1116.   MainBSF: TbsBusinessSkinForm;
  1117. begin
  1118.   MainBSF := BusinessSkinForm.GetBusinessSkinFormComponent(Application.MainForm);
  1119.   if (MainBSF = nil) or (MainBSF.MDITabsBar = nil) then Exit;
  1120.   MainBSF.MDITabsBar.AddTab(Child);
  1121. end;
  1122. procedure TbsBusinessSkinForm.DeleteChildFromMenu;
  1123. var
  1124.   WM, MI: TMenuItem;
  1125.   MainBSF: TbsBusinessSkinForm;
  1126.   I: Integer;
  1127.   S1, S2: String;
  1128. begin
  1129.   MainBSF := BusinessSkinForm.GetBusinessSkinFormComponent(Application.MainForm);
  1130.   if MainBSF = nil then Exit;
  1131.   WM := MainBSF.FForm.WindowMenu;
  1132.   if WM = nil then Exit;
  1133.   for I := 0 to WM.Count - 1 do
  1134.   if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1135.   then
  1136.     begin
  1137.       S1 := WM.Items[I].Name;
  1138.       S2 := MI_CHILDITEM;
  1139.       Delete(S1, Pos(S2, S1), Length(S2));
  1140.       if Child.Name = S1
  1141.       then
  1142.         begin
  1143.           MI := WM.Items[I];
  1144.           WM.Delete(I);
  1145.           MI.Free;
  1146.           Break;
  1147.         end;
  1148.     end;
  1149.   if MainBSF.FForm.MDIChildCount = 0
  1150.   then
  1151.     for I := 0 to WM.Count - 1 do
  1152.     if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1153.     then
  1154.       begin
  1155.         MI := WM.Items[I];
  1156.         WM.Delete(I);
  1157.         MI.Free;
  1158.         Break;
  1159.       end;
  1160. end;
  1161. procedure TbsBusinessSkinForm.DeleteChildFromBar;
  1162. var
  1163.   MainBSF: TbsBusinessSkinForm;
  1164. begin
  1165.   MainBSF := BusinessSkinForm.GetBusinessSkinFormComponent(Application.MainForm);
  1166.   if (MainBSF = nil) or (MainBSF.MDITabsBar = nil) then Exit;
  1167.   MainBSF.MDITabsBar.DeleteTab(Child);
  1168. end;
  1169. procedure TbsBusinessSkinForm.SetAlphaBlend(Value: Boolean);
  1170. begin
  1171.   if FAlphaBlend <> Value
  1172.   then
  1173.     begin
  1174.       FAlphaBlend := Value;
  1175.       if (ComponentState = []) and CheckW2KWXP
  1176.       then
  1177.         begin
  1178.           if FAlphaBlend
  1179.           then
  1180.             begin
  1181.               SetWindowLong(FForm.Handle, GWL_EXSTYLE,
  1182.                             GetWindowLong(FForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  1183.               SetAlphaBlendTransparent(FForm.Handle, FAlphaBlendValue);
  1184.             end
  1185.            else
  1186.              SetWindowLong(FForm.Handle, GWL_EXSTYLE,
  1187.                            GetWindowLong(FForm.Handle, GWL_EXSTYLE) and not WS_EX_LAYERED);
  1188.         end;
  1189.     end;
  1190. end;
  1191. procedure TbsBusinessSkinForm.SetAlphaBlendValue(Value: Byte);
  1192. begin
  1193.   if FAlphaBlendValue <> Value
  1194.   then
  1195.     begin
  1196.       FAlphaBlendValue := Value;
  1197.       if FAlphaBlend and (ComponentState = []) and CheckW2KWXP
  1198.       then
  1199.         SetAlphaBlendTransparent(FForm.Handle, FAlphaBlendValue);
  1200.     end;
  1201. end;
  1202. procedure TbsBusinessSkinForm.TrackSystemMenu(X, Y: Integer);
  1203. var
  1204.   MenuItem: TMenuItem;
  1205. begin
  1206.   MenuItem := GetSystemMenu;
  1207.   SkinMenuOpen;
  1208.   if MenusSkinData = nil
  1209.   then
  1210.     SkinMenu.Popup(nil, SkinData, 0, Rect(X, Y, X, Y), MenuItem, False)
  1211.   else
  1212.     SkinMenu.Popup(nil, MenusSkinData, 0, Rect(X, Y, X, Y), MenuItem, False);
  1213. end;
  1214. function TbsBusinessSkinForm.GetAutoRenderingInActiveImage: Boolean;
  1215. begin
  1216.   if (FSD <> nil) and not (FSD.Empty)
  1217.   then Result := FSD.AutoRenderingInActiveImage
  1218.   else Result := False;
  1219. end;
  1220. procedure TbsBusinessSkinForm.UpDateActiveObjects;
  1221. var
  1222.   i: Integer;
  1223. begin
  1224.   if ObjectList <> nil
  1225.   then 
  1226.   for i := 0 to ObjectList.Count  - 1 do
  1227.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinAnimateObject
  1228.     then
  1229.       begin
  1230.         with TbsSkinAnimateObject(ObjectList.Items[i]) do
  1231.         begin
  1232.           FMouseIn := False;
  1233.           Active := False;
  1234.           FFrame := 1
  1235.         end;
  1236.       end
  1237.     else
  1238.     if not (TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinCaptionObject)
  1239.     then
  1240.       with TbsActiveSkinObject(ObjectList.Items[i]) do
  1241.       begin
  1242.         Active := False;
  1243.         FMouseIn := False;
  1244.         FMorphkf := 0;
  1245.       end;
  1246. end;
  1247. procedure TbsBusinessSkinForm.TestAnimate;
  1248. var
  1249.   i: Integer;
  1250.   StopAnimate: Boolean;
  1251. begin
  1252.   StopAnimate := True;
  1253.   for i := 0 to ObjectList.Count  - 1 do
  1254.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinAnimateObject
  1255.     then
  1256.       with TbsSkinAnimateObject(ObjectList.Items[i]) do
  1257.       if Active
  1258.       then
  1259.         begin
  1260.           ChangeFrame;
  1261.           StopAnimate := False;
  1262.         end;
  1263.   if StopAnimate
  1264.   then AnimateTimer.Enabled := False;
  1265. end;
  1266. procedure TbsBusinessSkinForm.TestMorph;
  1267. var
  1268.   i: Integer;
  1269.   StopMorph: Boolean;
  1270. begin
  1271.   StopMorph := True;
  1272.   for i := 0 to ObjectList.Count  - 1 do
  1273.     with TbsActiveSkinObject(ObjectList.Items[i]) do
  1274.     begin
  1275.       if Morphing and CanMorphing
  1276.         then
  1277.           begin
  1278.             DoMorphing;
  1279.             StopMorph := False;
  1280.           end;
  1281.     end;
  1282.   if StopMorph then MorphTimer.Enabled := False;
  1283. end;
  1284. procedure TbsBusinessSkinForm.SetMenusAlphaBlend(Value: Boolean);
  1285. begin
  1286.   FMenusAlphaBlend := Value;
  1287.   if SkinMenu <> nil then SkinMenu.AlphaBlend := Value;
  1288. end;
  1289. procedure TbsBusinessSkinForm.SetMenusAlphaBlendAnimation(Value: Boolean);
  1290. begin
  1291.   FMenusAlphaBlendAnimation := Value;
  1292.   if SkinMenu <> nil then SkinMenu.AlphaBlendAnimation := Value;
  1293. end;
  1294. procedure TbsBusinessSkinForm.SetMenusAlphaBlendValue(Value: Byte);
  1295. begin
  1296.   FMenusAlphaBlendValue := Value;
  1297.   if SkinMenu <> nil then SkinMenu.AlphaBlendValue := Value;
  1298. end;
  1299. function TbsBusinessSkinForm.IsSizeAble;
  1300. begin
  1301.   Result := (FForm.BorderStyle = bsSizeAble) or
  1302.             (FForm.BorderStyle = bsSizeToolWin);
  1303. end;
  1304. function TbsBusinessSkinForm.GetDefCaptionHeight: Integer;
  1305. begin
  1306.   if (FForm.BorderStyle = bsToolWindow) or
  1307.      (FForm.BorderStyle = bsSizeToolWin)
  1308.   then
  1309.     Result := DEFTOOLCAPTIONHEIGHT
  1310.   else
  1311.     Result := DEFCAPTIONHEIGHT;
  1312. end;
  1313. function TbsBusinessSkinForm.GetDefButtonSize: Integer;
  1314. begin
  1315.   if (FForm.BorderStyle = bsToolWindow) or
  1316.      (FForm.BorderStyle = bsSizeToolWin)
  1317.   then
  1318.     Result := DEFTOOLBUTTONSIZE
  1319.   else
  1320.     Result := DEFBUTTONSIZE;
  1321. end;
  1322. procedure TbsBusinessSkinForm.ArangeMinimizedChilds;
  1323. var
  1324.   I: Integer;
  1325.   BS: TbsBusinessSkinForm;
  1326.   P: TPoint;
  1327. begin
  1328.   for i := 0 to FForm.MDIChildCount - 1 do
  1329.   begin
  1330.     BS := GetBusinessSkinFormComponent(FForm.MDIChildren[i]);
  1331.     if BS <> nil
  1332.     then
  1333.       begin
  1334.         if BS.WindowState = wsMinimized
  1335.         then
  1336.           begin
  1337.             P := BS.GetMinimizeCoord;
  1338.             FForm.MDIChildren[i].Left := P.X;
  1339.             FForm.MDIChildren[i].Top := P.Y;
  1340.           end;
  1341.       end;
  1342.   end;
  1343. end;
  1344. procedure TbsBusinessSkinForm.SetDefaultMenuItemHeight(Value: Integer);
  1345. begin
  1346.   if Value > 0 then
  1347.     SkinMenu.DefaultMenuItemHeight := Value;
  1348. end;
  1349. function TbsBusinessSkinForm.GetDefaultMenuItemHeight: Integer;
  1350. begin
  1351.   Result := SkinMenu.DefaultMenuItemHeight;
  1352. end;
  1353. procedure TbsBusinessSkinForm.SetDefaultMenuItemFont(Value: TFont);
  1354. begin
  1355.   SkinMenu.DefaultMenuItemFont.Assign(Value);
  1356. end;
  1357. function TbsBusinessSkinForm.GetDefaultMenuItemFont: TFont;
  1358. begin
  1359.   Result := SkinMenu.DefaultMenuItemFont;
  1360. end;
  1361. procedure TbsBusinessSkinForm.SetBorderIcons;
  1362. begin
  1363.   FBorderIcons := Value;
  1364.   LoadDefObjects;
  1365.   CheckObjects;
  1366. end;
  1367. procedure TbsBusinessSkinForm.SetDefCaptionFont;
  1368. begin
  1369.   FDefCaptionFont.Assign(Value);
  1370.   if not (csDesigning in ComponentState) and
  1371.      not (csLoading in ComponentState) and not FSkinSupport
  1372.   then SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  1373. end;
  1374. procedure TbsBusinessSkinForm.SetDefInActiveCaptionFont;
  1375. begin
  1376.   FDefInActiveCaptionFont.Assign(Value);
  1377.   if not (csDesigning in ComponentState) and
  1378.      not (csLoading in ComponentState) and not FSkinSupport
  1379.   then SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  1380. end;
  1381. procedure TbsBusinessSkinForm.CorrectCaptionText;
  1382. var
  1383.   j: Integer;
  1384. begin
  1385.   j := Length(S);
  1386.   with C do
  1387.   begin
  1388.     if TextWidth(S) > w
  1389.     then
  1390.       begin
  1391.         repeat
  1392.           Delete(S, j, 1);
  1393.           Dec(j);
  1394.         until (TextWidth(S + '...') <= w) or (S = '');
  1395.         S := S + '...';
  1396.       end;
  1397.   end;
  1398. end;
  1399. procedure TbsBusinessSkinForm.CalcDefRects;
  1400. var
  1401.   i: Integer;
  1402.   BSize: Integer;
  1403.   OffsetX, OffsetY: Integer;
  1404.   Button: TbsSkinStdButtonObject;
  1405. procedure SetStdButtonRect(B: TbsSkinStdButtonObject);
  1406. begin
  1407.   if B <> nil
  1408.   then
  1409.     with B do
  1410.     begin
  1411.       ObjectRect := Rect(OffsetX - BSize, OffsetY, OffsetX, OffsetY + BSize);
  1412.       OffsetX := OffsetX - BSize;
  1413.     end;
  1414. end;
  1415. procedure SetStdButtonRect2(B: TbsSkinStdButtonObject);
  1416. var
  1417.   IX, IY: Integer;
  1418. begin
  1419.   if B <> nil
  1420.   then
  1421.     with B do
  1422.     begin
  1423.       if (Command = cmSysMenu) and Parent.ShowIcon
  1424.       then
  1425.         begin
  1426.           GetIconSize(IX, IY);
  1427.           ObjectRect := Rect(OffsetX, OffsetY, OffsetX + IX, OffsetY + IY);
  1428.           OffsetX := OffsetX + IX;
  1429.         end
  1430.       else
  1431.         begin
  1432.           ObjectRect := Rect(OffsetX, OffsetY, OffsetX + BSize, OffsetY + BSize);
  1433.           OffsetX := OffsetX + BSize;
  1434.         end;
  1435.     end;
  1436. end;
  1437. function GetStdButton(C: TbsStdCommand): TbsSkinStdButtonObject;
  1438. var
  1439.   I: Integer;
  1440. begin
  1441.   Result := nil;
  1442.   for I := 0 to ObjectList.Count - 1 do
  1443.     if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinStdButtonObject
  1444.     then
  1445.       begin
  1446.         with TbsSkinStdButtonObject(ObjectList.Items[I]) do
  1447.         if Visible and SkinRectInAPicture and (Command = C)
  1448.         then
  1449.           begin
  1450.             Result := TbsSkinStdButtonObject(ObjectList.Items[I]);
  1451.             Break;
  1452.           end;
  1453.       end;
  1454. end;
  1455. begin
  1456.   if (ObjectList = nil) or (ObjectList.Count = 0) then Exit;
  1457.   i := 0;
  1458.   OffsetX := FFormWidth - 3;
  1459.   OffsetY := 4;
  1460.   NewDefCaptionRect := Rect(3, 3, OffsetX, GetDefCaptionHeight);
  1461.   BSize := GetDefButtonSize;
  1462.   Button := GetStdButton(cmClose);
  1463.   SetStdButtonRect(Button);
  1464.   Button := GetStdButton(cmMaximize);
  1465.   SetStdButtonRect(Button);
  1466.   Button := GetStdButton(cmMinimize);
  1467.   SetStdButtonRect(Button);
  1468.   Button := GetStdButton(cmRollUp);
  1469.   SetStdButtonRect(Button);
  1470.   Button := GetStdButton(cmMinimizeToTray);
  1471.   SetStdButtonRect(Button);
  1472.   NewDefCaptionRect.Right := OffsetX;
  1473.   OffsetX := NewDefCaptionRect.Left;
  1474.   Button := GetStdButton(cmSysMenu);
  1475.   if Button <> nil
  1476.   then
  1477.     begin
  1478.       SetStdButtonRect2(Button);
  1479.       NewDefCaptionRect.Left := OffsetX;
  1480.     end;
  1481. end;
  1482. procedure TbsBusinessSkinForm.PaintNCDefault;
  1483. var
  1484.   PaintRect, R: TRect;
  1485.   CB: TBitMap;
  1486.   i: Integer;
  1487.   TX, TY: Integer;
  1488.   C: TColor;
  1489.   LeftOffset, RightOffset: Integer;
  1490.   S: String;
  1491.   DC: HDC;
  1492.   Cnvs: TControlCanvas;
  1493.   F: TForm;
  1494.   FA: Boolean;
  1495. begin
  1496.   if FFormWidth = 0 then FFormWidth := FForm.Width;
  1497.   if FFormHeight = 0 then FFormHeight := FForm.Height;
  1498.   CalcDefRects;
  1499.   DC := GetWindowDC(FForm.Handle);
  1500.   Cnvs := TControlCanvas.Create;
  1501.   Cnvs.Handle := DC;
  1502.   CB := TBitMap.Create;
  1503.   CB.Width := FFormWidth - 6;
  1504.   CB.Height := GetDefCaptionHeight;
  1505.   LeftOffset := NewDefCaptionRect.Left - 3;
  1506.   RightOffset := CB.Width - NewDefCaptionRect.Right;
  1507.   // create caption
  1508.   with CB.Canvas do
  1509.   begin
  1510.     Brush.Color := clBtnFace;
  1511.     FillRect(Rect(0, 0, CB.Width, CB.Height));
  1512.     C := clBtnShadow;
  1513.     for i := 2 to GetDefCaptionHeight - 4 do
  1514.     begin
  1515.       if C = clBtnShadow then C := clBtnHighLight else C := clBtnShadow;
  1516.       Pen.Color := C;
  1517.       MoveTo(LeftOffset + 2, i); LineTo(CB.Width - RightOffset - 6, i);
  1518.     end;
  1519.     FA := GetFormActive;
  1520.     if FA
  1521.     then
  1522.       begin
  1523.         CB.Canvas.Font.Assign(FDefCaptionFont);
  1524.         Font := DefCaptionFont;
  1525.       end
  1526.     else
  1527.       begin
  1528.         CB.Canvas.Font.Assign(FDefInActiveCaptionFont);
  1529.         Font := DefInActiveCaptionFont;
  1530.       end;
  1531.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1532.     then
  1533.       begin
  1534.         CB.Canvas.Font.Charset := SkinData.ResourceStrData.CharSet;
  1535.         Font.Charset := SkinData.ResourceStrData.CharSet;
  1536.       end;
  1537.     // paint caption text
  1538.     S := FForm.Caption;
  1539.     if (FForm.FormStyle = fsMDIForm) and FMDIChildMaximized
  1540.     then
  1541.       begin
  1542.         F := GetMaximizeMDIChild;
  1543.         if F <> nil
  1544.         then
  1545.           S := S + ' - [' + F.Caption + ']';
  1546.       end;
  1547.     if S <> ''
  1548.     then
  1549.       begin
  1550.         CorrectCaptionText(CB.Canvas, S, CB.Width - LeftOffset - RightOffset);
  1551.         TX := LeftOffset + (CB.Width - LeftOffset - RightOffset) div 2 -
  1552.                           (TextWidth(S) + 5) div 2;
  1553.         TY := GetDefCaptionHeight div 2 - TextHeight(S) div 2;
  1554.         R := Rect(TX, 0, TX + TextWidth(S) + 5, CB.Height);
  1555.         TextRect(R, TX + 3, TY, S);
  1556.      end;
  1557.   end;
  1558.   if (ObjectList.Count = 0) and not FSkinSupport then LoadDefObjects;
  1559.   if (ObjectList <> nil) and (ObjectList.Count > 0)
  1560.   then
  1561.     begin
  1562.       CalcDefRects;
  1563.       for i := 0 to ObjectList.Count - 1 do
  1564.       with TbsActiveSkinObject(ObjectList.Items[i]) do
  1565.       if Visible then 
  1566.       begin
  1567.         OffsetRect(ObjectRect, -3, -3);
  1568.         Draw(CB.Canvas, True);
  1569.         OffsetRect(ObjectRect, 3, 3);
  1570.       end;
  1571.     end;
  1572.   //paint border + caption
  1573.   with Cnvs do
  1574.   begin
  1575.     ExcludeClipRect(Cnvs.Handle, 3, GetDefCaptionHeight + 3, FFormWidth - 3, FFormHeight - 3);
  1576.     PaintRect := Rect(0, 0, FFormWidth, FFormHeight);
  1577.     Draw(3, 3, CB);
  1578.     Frame3D(Cnvs, PaintRect, cl3DLight, cl3DDKShadow, 1);
  1579.     Frame3D(Cnvs, PaintRect, clBtnHighLight, clBtnShadow, 1);
  1580.     Frame3D(Cnvs, PaintRect, clBtnFace, clBtnFace, 1);
  1581.     CB.Free;
  1582.   end;
  1583.   Cnvs.Free;
  1584.   ReleaseDC(FForm.Handle, DC);
  1585. end;
  1586. procedure TbsBusinessSkinForm.PaintBGDefault;
  1587. var
  1588.   C: TCanvas;
  1589. begin
  1590.   C := TCanvas.Create;
  1591.   C.Handle := DC;
  1592.   with C do
  1593.   begin
  1594.     Brush.Color := clBtnFace;
  1595.     FillRect(FForm.ClientRect);
  1596.     if not FLogoBitMap.Empty then DrawLogoBitMap(C);
  1597.   end;
  1598.   C.Free;
  1599. end;
  1600. procedure TbsBusinessSkinForm.PaintMDIBGDefault(DC: HDC);
  1601. var
  1602.   C: TCanvas;
  1603. begin
  1604.   C := TCanvas.Create;
  1605.   C.Handle := DC;
  1606.   with C do
  1607.   begin
  1608.     Brush.Color := clAppWorkSpace;
  1609.     FillRect(FForm.ClientRect);
  1610.     if not FLogoBitMap.Empty then DrawLogoBitMap(C);
  1611.   end;
  1612.   C.Free;
  1613. end;
  1614. procedure TbsBusinessSkinForm.HookApp;
  1615. begin
  1616.   OldAppMessage := Application.OnMessage;
  1617.   Application.OnMessage := NewAppMessage;
  1618. end;
  1619. procedure TbsBusinessSkinForm.UnHookApp;
  1620. begin
  1621.   Application.OnMessage := OldAppMessage;
  1622. end;
  1623. function TbsBusinessSkinForm.GetMaximizeMDIChild: TForm;
  1624. var
  1625.   i: Integer;
  1626.   BS: TbsBusinessSkinForm;
  1627. begin
  1628.   Result := nil;
  1629.   BS := nil;
  1630.   if Application.MainForm.ActiveMDIChild <> nil
  1631.   then
  1632.     BS := GetBusinessSkinFormComponent(Application.MainForm.ActiveMDIChild);
  1633.   if (BS <> nil) and (BS.WindowState = wsMaximized)
  1634.   then
  1635.     Result := Application.MainForm.ActiveMDIChild
  1636.   else
  1637.   for i := 0 to Application.MainForm.MDIChildCount - 1 do
  1638.   begin
  1639.     BS := GetBusinessSkinFormComponent(Application.MainForm.MDIChildren[i]);
  1640.     if (BS <> nil) and (BS.WindowState = wsMaximized)
  1641.     then
  1642.       begin
  1643.         Result := Application.MainForm.MDIChildren[i];
  1644.         Break;
  1645.       end;
  1646.   end;
  1647. end;
  1648. function TbsBusinessSkinForm.IsMDIChildMaximized;
  1649. begin
  1650.   Result := FMDIChildMaximized;
  1651. end;
  1652. procedure TbsBusinessSkinForm.Tile;
  1653. var
  1654.   ColumnCount: Integer;
  1655.   FInColumnCount: Integer;
  1656.   R: TRect;
  1657.   W, H: Integer;
  1658.   i, j, X, Y, FW, FH, L, T: Integer;
  1659. begin
  1660.   if FForm.FormStyle <> fsMDIForm then Exit;
  1661.   RestoreAll;
  1662.   ColumnCount := Trunc(Sqrt(FForm.MDIChildCount));
  1663.   if ColumnCount <= 0 then Exit;
  1664.   FInColumnCount := FForm.MDIChildCount div ColumnCount;
  1665.   if FInColumnCount * ColumnCount < FForm.MDIChildCount
  1666.   then Inc(FInColumnCount, 1);
  1667.   R := GetMDIWorkArea;
  1668.   W := RectWidth(R);
  1669.   H := RectHeight(R);
  1670.   FW := W div ColumnCount;
  1671.   FH := H div FInColumnCount;
  1672.   X := W;
  1673.   Y := H;
  1674.   j := ColumnCount;
  1675.   for i := FForm.MDIChildCount downto 1 do
  1676.   begin
  1677.     L := X - FW;
  1678.     T := Y - FH;
  1679.     if L < 0 then L := 0;
  1680.     if T < 0 then T := 0;
  1681.     FForm.MDIChildren[i - 1].SetBounds(L, T, FW, FH);
  1682.     Y := Y - FH;
  1683.     if (Y - FH < 0) and (i <> 0)
  1684.     then
  1685.       begin
  1686.         Y := H;
  1687.         X := X - FW;
  1688.         Dec(j);
  1689.         if j = 0 then j := 1;
  1690.         FInColumnCount := (i - 1) div j;
  1691.         if FInColumnCount * j < (i - 1)
  1692.         then Inc(FInColumnCount, 1);
  1693.         if FInColumnCount = 0
  1694.         then FInColumnCount := 1;
  1695.         FH := H div FInColumnCount;
  1696.       end;
  1697.   end;
  1698. end;
  1699. procedure TbsBusinessSkinForm.Cascade;
  1700. var
  1701.   i, j, k, FW, FH, FW1, FH1, W, H, Offset1, Offset2: Integer;
  1702.   R: TRect;
  1703. begin
  1704.   if FForm.FormStyle <> fsMDIForm then Exit;
  1705.   RestoreAll;
  1706.   R := GetMDIWorkArea;
  1707.   W := RectWidth(R);
  1708.   H := RectHeight(R);
  1709.   if FSkinSupport
  1710.   then
  1711.     Offset1 := NewClRect.Top
  1712.   else
  1713.     Offset1 := GetDefCaptionHeight + 3;
  1714.   Offset2 := W - Round(W * 0.8);
  1715.   j := Offset2 div Offset1;
  1716.   if FForm.MDIChildCount < j
  1717.   then
  1718.     begin
  1719.       FW := W - (FForm.MDIChildCount - 1) * Offset1;
  1720.       FH := H - (FForm.MDIChildCount - 1) * Offset1;
  1721.     end
  1722.   else
  1723.    begin
  1724.      FW := W - j * Offset1;
  1725.      FH := H - j * Offset1;
  1726.    end;
  1727.   if FW < GetMinWidth then  FW := GetMinWidth;
  1728.   if FH < GetMinHeight then FH := GetMinHeight;
  1729.   k := 0;
  1730.   for i := FForm.MDIChildCount - 1 downto 0 do
  1731.   begin
  1732.     FW1 := FW;
  1733.     FH1 := FH;
  1734.     if (FForm.MDIChildren[i].BorderStyle = bsSingle)
  1735.     then
  1736.       begin
  1737.         FW1 := FForm.MDIChildren[i].Width;
  1738.         FH1 := FForm.MDIChildren[i].Height;
  1739.       end;
  1740.     if (k + FW1 > W) or (k + FH1 > H) then k := 0;
  1741.     FForm.MDIChildren[i].SetBounds(k, k, FW1, FH1);
  1742.     k := k + Offset1;
  1743.   end;
  1744. end;
  1745. procedure TbsBusinessSkinForm.MinimizeAll;
  1746. var
  1747.   i: Integer;
  1748.   BS: TbsBusinessSkinForm;
  1749. begin
  1750.   if FForm.FormStyle <> fsMDIForm then Exit;
  1751.   for i := 0 to FForm.MDIChildCount - 1 do
  1752.   begin
  1753.     BS := GetBusinessSkinFormComponent(FForm.MDIChildren[i]);
  1754.     if BS <> nil then BS.WindowState := wsMinimized;
  1755.   end;
  1756. end;
  1757. procedure TbsBusinessSkinForm.MaximizeAll;
  1758. var
  1759.   i: Integer;
  1760.   BS: TbsBusinessSkinForm;
  1761. begin
  1762.   if FForm.FormStyle <> fsMDIForm then Exit;
  1763.   for i := 0 to FForm.MDIChildCount - 1 do
  1764.   begin
  1765.     BS := GetBusinessSkinFormComponent(FForm.MDIChildren[i]);
  1766.     if BS <> nil then BS.WindowState := wsMaximized;
  1767.   end;
  1768. end;
  1769. procedure TbsBusinessSkinForm.CloseAll;
  1770. var
  1771.   i: Integer;
  1772. begin
  1773.   if FForm.FormStyle = fsMDIForm
  1774.   then
  1775.     for i := FForm.MDIChildCount - 1 downto 0 do
  1776.       FForm.MDIChildren[i].Close;
  1777. end;
  1778. procedure TbsBusinessSkinForm.RestoreAll;
  1779. var
  1780.   i: Integer;
  1781.   BS: TbsBusinessSkinForm;
  1782. begin
  1783.   if FForm.FormStyle <> fsMDIForm then Exit;
  1784.   for i := 0 to FForm.MDIChildCount - 1 do
  1785.   begin
  1786.     BS := GetBusinessSkinFormComponent(FForm.MDIChildren[i]);
  1787.     if (BS <> nil) and (BS.WindowState <> wsNormal) then BS.WindowState := wsNormal;
  1788.     if BS.RollUpState and (BS.WindowState = wsNormal) then BS.RollUpState := False;
  1789.   end;
  1790. end;
  1791. procedure TbsBusinessSkinForm.ResizeMDIChilds;
  1792. var
  1793.   i: Integer;
  1794. begin
  1795.   for i := 0 to FForm.MDIChildCount - 1 do
  1796.     SendMessage(FForm.MDIChildren[i].Handle, WM_MDICHANGESIZE, 0, 0);
  1797.   ArangeMinimizedChilds;
  1798. end;
  1799. function TbsBusinessSkinForm.GetMDIWorkArea;
  1800. function GetTop: Integer;
  1801. var
  1802.   i, j: Integer;
  1803. begin
  1804.   with Application.MainForm do
  1805.   begin
  1806.     j := 0;
  1807.     for i := 0 to ControlCount - 1 do
  1808.       if Controls[i].Visible and (Controls[i].Align = alTop) and
  1809.          (Controls[i].Top + Controls[i].Height > j)
  1810.       then
  1811.         j := Controls[i].Top + Controls[i].Height;
  1812.   end;
  1813.   Result := j;
  1814. end;
  1815. function GetBottom: Integer;
  1816. var
  1817.   i, j: Integer;
  1818. begin
  1819.   with Application.MainForm do
  1820.   begin
  1821.     j := ClientHeight;
  1822.     for i := 0 to ControlCount - 1 do
  1823.       if Controls[i].Visible and (Controls[i].Align = alBottom) and
  1824.          (Controls[i].Top < j)
  1825.       then
  1826.         j := Controls[i].Top;
  1827.   end;
  1828.   Result := j;
  1829. end;
  1830. function GetLeft: Integer;
  1831. var
  1832.   i, j: Integer;
  1833. begin
  1834.   with Application.MainForm do
  1835.   begin
  1836.     j := 0;
  1837.     for i := 0 to ControlCount - 1 do
  1838.       if Controls[i].Visible and (Controls[i].Align = alLeft) and
  1839.          (Controls[i].Left + Controls[i].Width > j)
  1840.       then
  1841.         j := Controls[i].Left + Controls[i].Width;
  1842.   end;
  1843.   Result := j;
  1844. end;
  1845. function GetRight: Integer;
  1846. var
  1847.   i, j: Integer;
  1848. begin
  1849.   with Application.MainForm do
  1850.   begin
  1851.     j := ClientWidth;
  1852.     for i := 0 to ControlCount - 1 do
  1853.       if Controls[i].Visible and (Controls[i].Align = alRight) and
  1854.          (Controls[i].Left < j)
  1855.       then
  1856.         j := Controls[i].Left;
  1857.   end;
  1858.   Result := j;
  1859. end;
  1860. begin
  1861.   if Application.MainForm <> nil then
  1862.   Result := Rect(GetLeft, GetTop, GetRight, GetBottom);
  1863. end;
  1864. procedure TbsBusinessSkinForm.TrayIconDBLCLK;
  1865. begin
  1866.   RestoreFromTray;
  1867. end;
  1868. procedure TbsBusinessSkinForm.MinimizeToTray;
  1869. begin
  1870.   if FTrayIcon <> nil
  1871.   then
  1872.     with FTrayIcon do
  1873.     begin
  1874.       FTrayIcon.MinimizeToTray := True;
  1875.       Application.Minimize;
  1876.       if Assigned(FOnMinimizeToTray) then FOnMinimizeToTray(Self);
  1877.     end;
  1878. end;
  1879. procedure TbsBusinessSkinForm.RestoreFromTray;
  1880. begin
  1881.   if FTrayIcon <> nil
  1882.   then
  1883.     with FTrayIcon do
  1884.     begin
  1885.       FTrayIcon.MinimizeToTray := False;
  1886.       FTrayIcon.ShowMainForm;
  1887.       Application.Restore;
  1888.       if not FAlwaysShowInTray then FTrayIcon.IconVisible := False;
  1889.       if Assigned(FOnRestoreFromTray) then FOnRestoreFromTray(Self);
  1890.     end;
  1891. end;
  1892. procedure TbsBusinessSkinForm.SetTrayIcon;
  1893. begin
  1894.   FTrayIcon := Value;
  1895.   if TrayIcon <> nil
  1896.   then
  1897.     with TrayIcon do
  1898.     begin
  1899.       if not FAlwaysShowInTray then IconVisible := False;
  1900.       MinimizeToTray := False;
  1901.       if (csDesigning in ComponentState) and not
  1902.          (csLoading in ComponentState)
  1903.       then
  1904.         Self.BorderIcons := Self.BorderIcons + [biMinimizeToTray];
  1905.       if not (csDesigning in ComponentState)
  1906.       then
  1907.         begin
  1908.           if PopupMenu = nil
  1909.           then
  1910.             begin
  1911.               PopupMenu := FSysTrayMenu;
  1912.               OnDblClick := TrayIconDBLCLK;
  1913.             end;
  1914.         end;
  1915.     end
  1916.   else
  1917.     if (csDesigning in ComponentState) and not
  1918.          (csLoading in ComponentState)
  1919.     then
  1920.       Self.BorderIcons := Self.BorderIcons - [biMinimizeToTray];
  1921. end;
  1922. procedure TbsBusinessSkinForm.TSM_Restore(Sender: TObject);
  1923. begin
  1924.   RestoreFromTray;
  1925. end;
  1926. procedure TbsBusinessSkinForm.TSM_Close(Sender: TObject);
  1927. begin
  1928.   FForm.Close;
  1929. end;
  1930. procedure TbsBusinessSkinForm.SM_Restore(Sender: TObject);
  1931. begin
  1932.   if MaxRollUpState or (FRollUpState and (WindowState = wsNormal))
  1933.   then
  1934.     RollUpState := False
  1935.   else
  1936.     WindowState := wsNormal;
  1937. end;
  1938. procedure TbsBusinessSkinForm.SM_Max(Sender: TObject);
  1939. begin
  1940.   WindowState := wsMaximized;
  1941. end;
  1942. procedure TbsBusinessSkinForm.SM_Min(Sender: TObject);
  1943. begin
  1944.   if FAlwaysMinimizeToTray
  1945.   then
  1946.     MinimizeToTray
  1947.   else
  1948.     WindowState := wsMinimized;
  1949. end;
  1950. procedure TbsBusinessSkinForm.SM_RollUp(Sender: TObject);
  1951. begin
  1952.   RollUpState := True;
  1953. end;
  1954. procedure TbsBusinessSkinForm.SM_Close(Sender: TObject);
  1955. begin
  1956.   FForm.Close;
  1957. end;
  1958. procedure TbsBusinessSkinForm.SM_MinToTray(Sender: TObject);
  1959. begin
  1960.   MinimizeToTray;
  1961. end;
  1962. procedure TbsBusinessSkinForm.CreateUserSysMenu;
  1963. procedure AddMaxItem;
  1964. var
  1965.   MI: TMenuItem;
  1966. begin
  1967.   if not (biMaximize in FBorderIcons) then Exit;
  1968.   MI := TMenuItem.Create(Self);
  1969.   with MI do
  1970.   begin
  1971.     Name := MI_MAXName;
  1972.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1973.     then
  1974.       Caption := SkinData.ResourceStrData.GetResStr('MI_MAXCAPTION')
  1975.     else
  1976.       Caption := BS_MI_MAXCAPTION;
  1977.     OnClick := SM_Max;
  1978.   end;
  1979.   FSystemMenu.Items.Insert(0, MI);
  1980. end;
  1981. procedure AddMinItem;
  1982. var
  1983.   MI: TMenuItem;
  1984. begin
  1985.   if not (biMinimize in FBorderIcons) then Exit;
  1986.   MI := TMenuItem.Create(Self);
  1987.   with MI do
  1988.   begin
  1989.     Name := MI_MINName;
  1990.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1991.     then
  1992.       Caption := SkinData.ResourceStrData.GetResStr('MI_MINCAPTION')
  1993.     else
  1994.       Caption := BS_MI_MINCAPTION;
  1995.     OnClick := SM_Min;
  1996.   end;
  1997.   FSystemMenu.Items.Insert(0, MI);
  1998. end;
  1999. procedure AddRestoreItem;
  2000. var
  2001.   MI: TMenuItem;
  2002. begin
  2003.   MI := TMenuItem.Create(Self);
  2004.   with MI do
  2005.   begin
  2006.     Name := MI_RESTOREName;
  2007.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2008.     then
  2009.       Caption := SkinData.ResourceStrData.GetResStr('MI_RESTORECAPTION')
  2010.     else
  2011.       Caption := BS_MI_RESTORECAPTION;
  2012.     OnClick := SM_Restore;
  2013.   end;
  2014.   FSystemMenu.Items.Insert(0, MI);
  2015. end;
  2016. procedure AddRollUpItem;
  2017. var
  2018.   MI: TMenuItem;
  2019. begin
  2020.   if not (biRollUp in FBorderIcons) then Exit;
  2021.   MI := TMenuItem.Create(Self);
  2022.   with MI do
  2023.   begin
  2024.     Name := MI_ROLLUPName;
  2025.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2026.     then
  2027.       Caption := SkinData.ResourceStrData.GetResStr('MI_ROLLUPCAPTION')
  2028.     else
  2029.       Caption := BS_MI_ROLLUPCAPTION;
  2030.     OnClick := SM_RollUp;
  2031.   end;
  2032.   FSystemMenu.Items.Insert(0, MI);
  2033. end;
  2034. procedure AddCloseItem;
  2035. var
  2036.   MI: TMenuItem;
  2037. begin
  2038.   MI := TMenuItem.Create(Self);
  2039.   with MI do
  2040.   begin
  2041.     Name := MI_CLOSEName;
  2042.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2043.     then
  2044.       Caption := SkinData.ResourceStrData.GetResStr('MI_CLOSECAPTION')
  2045.     else
  2046.       Caption := BS_MI_CLOSECAPTION;
  2047.     OnClick := SM_Close;
  2048.     if FForm.FormStyle = fsMDIChild
  2049.     then
  2050.       ShortCut := TextToShortCut('Ctrl+F4')
  2051.     else
  2052.       ShortCut := TextToShortCut('Alt+F4');
  2053.   end;
  2054.   FSystemMenu.Items.Add(MI);
  2055. end;
  2056. procedure AddMinToTrayItem;
  2057. var
  2058.   MI: TMenuItem;
  2059. begin
  2060.   if not (biMinimizeToTray in FBorderIcons) then Exit;
  2061.   MI := TMenuItem.Create(Self);
  2062.   with MI do
  2063.   begin
  2064.     Name := MI_MINTOTRAYName;
  2065.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2066.     then
  2067.       Caption := SkinData.ResourceStrData.GetResStr('MI_MINTOTRAYCAPTION')
  2068.     else
  2069.       Caption := BS_MI_MINTOTRAYCAPTION;
  2070.     OnClick := SM_MinToTray;
  2071.   end;
  2072.   FSystemMenu.Items.Insert(0, MI);
  2073. end;
  2074. var
  2075.   B: Boolean;
  2076.   i: Integer;
  2077. begin
  2078.   if not FUseDefaultSysMenu then Exit;
  2079.   // delete old items
  2080.   repeat
  2081.     B := True;
  2082.     for i := 0 to FSystemMenu.Items.Count - 1 do
  2083.       if (FSystemMenu.Items[i].Name = MI_MINName) or
  2084.          (FSystemMenu.Items[i].Name = MI_MAXName) or
  2085.          (FSystemMenu.Items[i].Name = MI_CLOSEName) or
  2086.          (FSystemMenu.Items[i].Name = MI_MINTOTRAYName) or
  2087.          (FSystemMenu.Items[i].Name = MI_ROLLUPName) or
  2088.          (FSystemMenu.Items[i].Name = MI_RESTOREName)
  2089.       then
  2090.         begin
  2091.           FSystemMenu.Items[i].Free;
  2092.           B := False;
  2093.           Break;
  2094.         end;
  2095.   until B;
  2096.   //
  2097.   AddMinToTrayItem;
  2098.   if not ((FForm.FormStyle = fsMDIChild) and (FWindowState = wsMaximized))
  2099.   then
  2100.     if not FRollUpState and (FWindowState <> wsMinimized)
  2101.     then AddRollUpItem;
  2102.   if FWindowState <> wsMaximized then AddMaxItem;
  2103.   if (FWindowState <> wsNormal) or FRollUpState then AddRestoreItem;
  2104.   if FWindowState <> wsMinimized then AddMinItem;
  2105.   AddCloseItem;
  2106. end;
  2107. function TbsBusinessSkinForm.GetSystemMenu;
  2108. begin
  2109.   if FSystemMenu <> nil
  2110.   then
  2111.     begin
  2112.       CreateUserSysMenu;
  2113.       Result := FSystemMenu.Items;
  2114.     end
  2115.   else
  2116.     begin
  2117.       CreateSysMenu;
  2118.       Result := FSysMenu.Items;
  2119.     end;
  2120. end;
  2121. procedure TbsBusinessSkinForm.CreateSysTrayMenu;
  2122. procedure AddRestoreItem;
  2123. var
  2124.   MI: TMenuItem;
  2125. begin
  2126.   MI := TMenuItem.Create(Self);
  2127.   with MI do
  2128.   begin
  2129.     Name := TMI_RESTOREName;
  2130.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2131.     then
  2132.       Caption := SkinData.ResourceStrData.GetResStr('MI_RESTORECAPTION')
  2133.     else
  2134.       Caption := BS_MI_RESTORECAPTION;
  2135.     OnClick := TSM_Restore;
  2136.   end;
  2137.   FSysTrayMenu.Items.Add(MI);
  2138. end;
  2139. procedure AddCloseItem;
  2140. var
  2141.   MI: TMenuItem;
  2142. begin
  2143.   MI := TMenuItem.Create(Self);
  2144.   with MI do
  2145.   begin
  2146.     Name := TMI_CLOSEName;
  2147.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2148.     then
  2149.       Caption := SkinData.ResourceStrData.GetResStr('MI_CLOSECAPTION')
  2150.     else
  2151.       Caption := BS_MI_CLOSECAPTION;
  2152.     OnClick := TSM_Close;
  2153.     if FForm.FormStyle = fsMDIChild
  2154.     then
  2155.       ShortCut := TextToShortCut('Ctrl+F4')
  2156.     else
  2157.       ShortCut := TextToShortCut('Alt+F4');
  2158.   end;
  2159.   FSysTrayMenu.Items.Add(MI);
  2160. end;
  2161. procedure AddDevItem;
  2162. var
  2163.   MI: TMenuItem;
  2164. begin
  2165.   MI := TMenuItem.Create(Self);
  2166.   MI.Caption := '-';
  2167.   FSysTrayMenu.Items.Add(MI);
  2168. end;
  2169. begin
  2170.   AddRestoreItem;
  2171.   AddDevItem;
  2172.   AddCloseItem;
  2173. end;
  2174. procedure TbsBusinessSkinForm.CreateSysMenu;
  2175. procedure AddMaxItem;
  2176. var
  2177.   MI: TMenuItem;
  2178. begin
  2179.   if not (biMaximize in FBorderIcons) then Exit;
  2180.   MI := TMenuItem.Create(Self);
  2181.   with MI do
  2182.   begin
  2183.     Name := MI_MAXName;
  2184.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2185.     then
  2186.       Caption := SkinData.ResourceStrData.GetResStr('MI_MAXCAPTION')
  2187.     else
  2188.       Caption := BS_MI_MAXCAPTION;
  2189.     OnClick := SM_Max;
  2190.   end;
  2191.   FSysMenu.Items.Add(MI);
  2192. end;
  2193. procedure AddMinItem;
  2194. var
  2195.   MI: TMenuItem;
  2196. begin
  2197.   if not (biMinimize in FBorderIcons) then Exit;
  2198.   MI := TMenuItem.Create(Self);
  2199.   with MI do
  2200.   begin
  2201.     Name := MI_MINName;
  2202.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2203.     then
  2204.       Caption := SkinData.ResourceStrData.GetResStr('MI_MINCAPTION')
  2205.     else
  2206.       Caption := BS_MI_MINCAPTION;
  2207.     OnClick := SM_Min;
  2208.   end;
  2209.   FSysMenu.Items.Add(MI);
  2210. end;
  2211. procedure AddRestoreItem;
  2212. var
  2213.   MI: TMenuItem;
  2214. begin
  2215.   MI := TMenuItem.Create(Self);
  2216.   with MI do
  2217.   begin
  2218.     Name := MI_RESTOREName;
  2219.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2220.     then
  2221.       Caption := SkinData.ResourceStrData.GetResStr('MI_RESTORECAPTION')
  2222.     else
  2223.       Caption := BS_MI_RESTORECAPTION;
  2224.     OnClick := SM_Restore;
  2225.   end;
  2226.   FSysMenu.Items.Add(MI);
  2227. end;
  2228. procedure AddRollUpItem;
  2229. var
  2230.   MI: TMenuItem;
  2231. begin
  2232.   if not (biRollUp in FBorderIcons) then Exit;
  2233.   MI := TMenuItem.Create(Self);
  2234.   with MI do
  2235.   begin
  2236.     Name := MI_ROLLUPName;
  2237.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2238.     then
  2239.       Caption := SkinData.ResourceStrData.GetResStr('MI_ROLLUPCAPTION')
  2240.     else
  2241.       Caption := BS_MI_ROLLUPCAPTION;
  2242.     OnClick := SM_RollUp;
  2243.   end;
  2244.   FSysMenu.Items.Add(MI);
  2245. end;
  2246. procedure AddCloseItem;
  2247. var
  2248.   MI: TMenuItem;
  2249. begin
  2250.   MI := TMenuItem.Create(Self);
  2251.   with MI do
  2252.   begin
  2253.     Name := MI_CLOSEName;
  2254.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2255.     then
  2256.       Caption := SkinData.ResourceStrData.GetResStr('MI_CLOSECAPTION')
  2257.     else
  2258.       Caption := BS_MI_CLOSECAPTION;
  2259.     OnClick := SM_Close;
  2260.     if FForm.FormStyle = fsMDIChild
  2261.     then
  2262.       ShortCut := TextToShortCut('Ctrl+F4')
  2263.     else
  2264.       ShortCut := TextToShortCut('Alt+F4');
  2265.   end;
  2266.   FSysMenu.Items.Add(MI);
  2267. end;
  2268. procedure AddMinToTrayItem;
  2269. var
  2270.   MI: TMenuItem;
  2271. begin
  2272.   if not (biMinimizeToTray in FBorderIcons) then Exit;
  2273.   MI := TMenuItem.Create(Self);
  2274.   with MI do
  2275.   begin
  2276.     Name := MI_MINTOTRAYName;
  2277.     if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2278.     then
  2279.       Caption := SkinData.ResourceStrData.GetResStr('MI_MINTOTRAYCAPTION')
  2280.     else
  2281.       Caption := BS_MI_MINTOTRAYCAPTION;
  2282.     OnClick := SM_MinToTray;
  2283.   end;
  2284.   FSysMenu.Items.Add(MI);
  2285. end;
  2286. procedure AddDevItem;
  2287. var
  2288.   MI: TMenuItem;
  2289. begin
  2290.   MI := TMenuItem.Create(Self);
  2291.   MI.Caption := '-';
  2292.   FSysMenu.Items.Add(MI);
  2293. end;
  2294. var
  2295.   i: Integer;
  2296. begin
  2297.   for i := FSysMenu.Items.Count - 1 downto 0 do
  2298.     TMenuItem(FSysMenu.Items[i]).Free;
  2299.   if FWindowState <> wsMinimized then AddMinItem;
  2300.   if FWindowState <> wsMaximized then AddMaxItem;
  2301.   if (FWindowState <> wsNormal) or FRollUpState then AddRestoreItem;
  2302.   if not ((FForm.FormStyle = fsMDIChild) and (FWindowState = wsMaximized))
  2303.   then
  2304.     if not FRollUpState and (FWindowState <> wsMinimized)
  2305.     then AddRollUpItem;
  2306.   AddMinToTrayItem;
  2307.   if FSysMenu.Items.Count > 0 then AddDevItem;
  2308.   AddCloseItem;
  2309. end;
  2310. function TbsBusinessSkinForm.GetFullDragg: Boolean;
  2311. var
  2312.   B: Boolean;
  2313. begin
  2314.   SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @B, 0);
  2315.   Result := B;
  2316. end;
  2317. function TbsBusinessSkinForm.GetMinimizeCoord;
  2318. function GetMDIEqualCoord(P: TPoint): Boolean;
  2319. var
  2320.   BS: TbsBusinessSkinForm;
  2321.   MF: TForm;
  2322.   i: Integer;
  2323. begin
  2324.   Result := True;
  2325.   MF := Application.MainForm;
  2326.   for i := 0 to MF.MDIChildCount - 1 do
  2327.   if (MF.MDIChildren[i] <> FForm) and MF.MDIChildren[i].Visible 
  2328.   then
  2329.     begin
  2330.       BS := GetBusinessSkinFormComponent(MF.MDIChildren[i]);
  2331.       if (BS <> nil) and (BS.WindowState = wsMinimized) and
  2332.          (MF.MDIChildren[i].Left = P.X) and (MF.MDIChildren[i].Top = P.Y)
  2333.       then
  2334.         begin
  2335.           Result := False;
  2336.           Break;
  2337.         end;
  2338.     end;
  2339. end;
  2340. function GetSDIEqualCoord(P: TPoint): Boolean;
  2341. var
  2342.   BS: TbsBusinessSkinForm;
  2343.   i: Integer;
  2344. begin
  2345.   Result := True;
  2346.   for i := 0 to Screen.FormCount - 1 do
  2347.   if (Screen.Forms[i] <> FForm) and (Screen.Forms[i] <> Application.MainForm) and
  2348.      (Screen.Forms[i].Visible)
  2349.   then
  2350.     begin
  2351.       BS := GetBusinessSkinFormComponent(Screen.Forms[i]);
  2352.       if (BS <> nil) and (BS.WindowState = wsMinimized) and
  2353.          (Screen.Forms[i].Left = P.X) and (Screen.Forms[i].Top = P.Y)
  2354.       then
  2355.         begin
  2356.           Result := False;
  2357.           Break;
  2358.         end;
  2359.     end;
  2360. end;
  2361. var
  2362.   R: TRect;
  2363.   P: TPoint;
  2364.   MW, MH, W, H: Integer;
  2365.   B: Boolean;
  2366. begin
  2367.   P := Point(0, 0);
  2368.   MW := GetMinWidth;
  2369.   MH := GetMinHeight;
  2370.   if FForm.FormStyle = fsMDIChild
  2371.   then
  2372.     begin
  2373.       R := GetMDIWorkArea;
  2374.       W := RectWidth(R);
  2375.       H := RectHeight(R);
  2376.       P.Y := H - MH;
  2377.       P.X := 0;
  2378.       repeat
  2379.         B := GetMDIEqualCoord(P);
  2380.         if not B
  2381.         then
  2382.           begin
  2383.             P.X := P.X + MW;
  2384.             if P.X + MW > W
  2385.             then
  2386.               begin
  2387.                 P.X := 0;
  2388.                 P.Y := P.Y - MH;
  2389.                 if P.Y < 0
  2390.                 then
  2391.                   begin
  2392.                     P.Y := H - MH;
  2393.                     B := True;
  2394.                   end;
  2395.               end;
  2396.           end;
  2397.       until B;
  2398.     end
  2399.   else
  2400.     begin
  2401.       R := GetMonitorWorkArea(FForm.Handle, True);
  2402.       P.Y := R.Bottom - MH;
  2403.       P.X := R.Left;
  2404.       repeat
  2405.         B := GetSDIEqualCoord(P);
  2406.         if not B
  2407.         then
  2408.           begin
  2409.             P.X := P.X + MW;
  2410.             if P.X + MW > R.Bottom
  2411.             then
  2412.               begin
  2413.                 P.X := R.Left;
  2414.                 P.Y  := P.Y - MH;
  2415.                 if P.Y < R.Top
  2416.                 then
  2417.                    begin
  2418.                      P.Y := R.Bottom - MH;
  2419.                      B := True;
  2420.                    end;
  2421.               end;
  2422.           end;
  2423.       until B;
  2424.     end;   
  2425.   Result := P;
  2426. end;
  2427. function TbsBusinessSkinForm.GetMinWidth: Integer;
  2428. begin
  2429.   if FSkinSupport
  2430.   then
  2431.     begin
  2432.       if (FMinWidth > FSD.FPicture.Width) and
  2433.       not (FWindowState = wsMinimized)
  2434.       then Result := FMinWidth
  2435.       else Result := FSD.FPicture.Width;
  2436.     end
  2437.   else
  2438.     begin
  2439.       if FMinWidth > 0
  2440.       then Result := FMinWidth
  2441.       else Result := DEFFORMMINWIDTH;
  2442.     end;
  2443. end;
  2444. function TbsBusinessSkinForm.GetMinHeight: Integer;
  2445. begin
  2446.   if FSkinSupport
  2447.   then
  2448.     begin
  2449.       if (FMinHeight > FSD.FPicture.Height - RectHeight(FSD.ClRect))
  2450.       and not FRollUpState
  2451.       and not (FWindowState = wsMinimized)
  2452.       then Result := FMinHeight
  2453.       else Result := FSD.FPicture.Height - RectHeight(FSD.ClRect);
  2454.     end
  2455.   else
  2456.     begin
  2457.       if (FMinHeight > GetDefCaptionHeight + 6)
  2458.       and not FRollUpState
  2459.       and not (FWindowState = wsMinimized)
  2460.       then Result := FMinHeight
  2461.       else Result := GetDefCaptionHeight + 6;
  2462.      end;
  2463. end;
  2464. function TbsBusinessSkinForm.GetMaxWidth: Integer;
  2465. var
  2466.   R: TRect;
  2467. begin
  2468.   R := GetMonitorWorkArea(FForm.Handle, not FMaximizeOnFullScreen);
  2469.   Result := RectWidth(R);
  2470. end;
  2471. function TbsBusinessSkinForm.GetMaxHeight: Integer;
  2472. var
  2473.   R: TRect;
  2474. begin
  2475.   R := GetMonitorWorkArea(FForm.Handle, not FMaximizeOnFullScreen);
  2476.   Result := RectHeight(R);
  2477. end;
  2478. procedure TbsBusinessSkinForm.DrawSkinObject;
  2479. var
  2480.   DC: HDC;
  2481.   Cnvs: TControlCanvas;
  2482. begin
  2483.   if not(((WindowState = wsMaximized) and (FForm.FormStyle = fsMDIChild))
  2484.          or (FForm.BorderStyle = bsNone))
  2485.   then
  2486.     begin
  2487.       DC := GetWindowDC(FForm.Handle);
  2488.       Cnvs := TControlCanvas.Create;
  2489.       Cnvs.Handle := DC;
  2490.       //
  2491.       AObject.Draw(Cnvs, True);
  2492.       //
  2493.       Cnvs.Handle := 0;
  2494.       ReleaseDC(FForm.Handle, DC);
  2495.       Cnvs.Free;
  2496.     end;
  2497. end;
  2498. procedure TbsBusinessSkinForm.PointToNCPoint(var P: TPoint);
  2499. begin
  2500.   if FForm.FormStyle = fsMDIChild
  2501.   then
  2502.     begin
  2503.       P := FForm.ScreenToClient(P);
  2504.       if FSkinSupport
  2505.       then
  2506.         begin
  2507.           P.X := P.X + NewClRect.Left;
  2508.           P.Y := P.Y + NewClRect.Top;
  2509.         end
  2510.       else
  2511.         begin
  2512.           P.X := P.X + 3;
  2513.           P.Y := P.Y + GetDefCaptionHeight + 3;
  2514.         end;
  2515.     end
  2516.   else
  2517.     begin
  2518.       P.X := P.X - FForm.Left;
  2519.       P.Y := P.Y - FForm.Top;
  2520.     end;
  2521. end;
  2522. procedure TbsBusinessSkinForm.PaintNCSkin;
  2523. var
  2524.   CaptionBitMap, LeftBitMap, RightBitMap, BottomBitMap: TBitMap;
  2525.   DC: HDC;
  2526.   Cnvs: TCanvas;
  2527.   TempRect: TRect;
  2528.   i: Integer;
  2529.   P: TBitMap;
  2530.   CEB, LEB, REB, BEB: TbsEffectBmp;
  2531. begin
  2532.   if FFormWidth = 0 then FFormWidth := FForm.Width;
  2533.   if FFormheight = 0 then FFormHeight := FForm.Height;
  2534.   if (FFormWidth < GetMinWidth) or (FFormHeight < GetMinHeight) then Exit;
  2535.   CalcRects;
  2536.   CalcAllRealObjectRect;
  2537.   DC := GetWindowDC(FForm.Handle);
  2538.   Cnvs := TCanvas.Create;
  2539.   Cnvs.Handle := DC;
  2540.   CaptionBitMap := TBitMap.Create;
  2541.   LeftBitMap := TBitMap.Create;
  2542.   RightBitMap := TBitMap.Create;
  2543.   BottomBitMap := TBitMap.Create;
  2544.   if not GetFormActive and not FSD.FInActivePicture.Empty
  2545.   then
  2546.     P := FSD.FInActivePicture
  2547.   else
  2548.     P := FSD.FPicture;
  2549.   // create borderbitmap
  2550.   with FSD do
  2551.     CreateSkinBorderImages(LTPoint, RTPoint, LBPoint, RBPoint, ClRect,
  2552.       NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  2553.       LeftBitMap, CaptionBitMap, RightBitMap, BottomBitMap,
  2554.       P, Rect(0, 0, P.Width, P.Height), FFormWidth, FFormHeight,
  2555.       LeftStretch, TopStretch, RightStretch, BottomStretch);
  2556.   // draw skin objects
  2557.   for i := 0 to ObjectList.Count - 1 do
  2558.      with TbsActiveSkinObject(ObjectList.Items[i]) do
  2559.      if Visible then 
  2560.        begin
  2561.          if (ObjectRect.Bottom <= NewClRect.Top)
  2562.          then
  2563.            Draw(CaptionBitMap.Canvas, False)
  2564.          else
  2565.            begin
  2566.              TempRect := ObjectRect;
  2567.              OffsetRect(ObjectRect, 0, -NewClRect.Bottom);
  2568.              Draw(BottomBitMap.Canvas, False);
  2569.              ObjectRect := TempRect;
  2570.            end;
  2571.        end;
  2572.   //
  2573.   if NewClRect.Bottom > NewClRect.Top
  2574.   then
  2575.     ExcludeClipRect(Cnvs.Handle,
  2576.       NewClRect.Left, NewClRect.Top, NewClRect.Right, NewClRect.Bottom);
  2577.   // paint nc
  2578.   if GetFormActive or not GetAutoRenderingInActiveImage
  2579.   then
  2580.     begin
  2581.       Cnvs.Draw(0, 0, CaptionBitMap);
  2582.       Cnvs.Draw(0, CaptionBitMap.Height, LeftBitMap);
  2583.       Cnvs.Draw(FFormWidth - RightBitMap.Width, CaptionBitMap.Height, RightBitMap);
  2584.       Cnvs.Draw(0, FFormHeight - BottomBitMap.Height, BottomBitMap);
  2585.     end
  2586.   else
  2587.     begin
  2588.       CEB := TbsEffectBmp.CreateFromhWnd(CaptionBitMap.Handle);
  2589.       LEB := TbsEffectBmp.CreateFromhWnd(LeftBitMap.Handle);
  2590.       REB := TbsEffectBmp.CreateFromhWnd(RightBitMap.Handle);
  2591.       BEB := TbsEffectBmp.CreateFromhWnd(BottomBitMap.Handle);
  2592.       case FSD.InActiveEffect of
  2593.         ieBrightness:
  2594.           begin
  2595.             CEB.ChangeBrightness(InActiveBrightnessKf);
  2596.             LEB.ChangeBrightness(InActiveBrightnessKf);
  2597.             REB.ChangeBrightness(InActiveBrightnessKf);
  2598.             BEB.ChangeBrightness(InActiveBrightnessKf);
  2599.           end;
  2600.         ieDarkness:
  2601.           begin
  2602.             CEB.ChangeDarkness(InActiveDarknessKf);
  2603.             LEB.ChangeDarkness(InActiveDarknessKf);
  2604.             REB.ChangeDarkness(InActiveDarknessKf);
  2605.             BEB.ChangeDarkness(InActiveDarknessKf);
  2606.           end;
  2607.         ieGrayScale:
  2608.           begin
  2609.             CEB.GrayScale;
  2610.             LEB.GrayScale;
  2611.             REB.GrayScale;
  2612.             BEB.GrayScale;
  2613.           end;
  2614.         ieNoise:
  2615.           begin
  2616.             CEB.AddMonoNoise(InActiveNoiseAmount);
  2617.             LEB.AddMonoNoise(InActiveNoiseAmount);
  2618.             REB.AddMonoNoise(InActiveNoiseAmount);
  2619.             BEB.AddMonoNoise(InActiveNoiseAmount);
  2620.           end;
  2621.         ieSplitBlur:
  2622.           begin
  2623.             CEB.SplitBlur(1);
  2624.             LEB.SplitBlur(1);
  2625.             REB.SplitBlur(1);
  2626.             BEB.SplitBlur(1);
  2627.           end;
  2628.         ieInvert:
  2629.           begin
  2630.             CEB.Invert;
  2631.             LEB.Invert;
  2632.             REB.Invert;
  2633.             BEB.Invert;
  2634.           end;
  2635.       end;
  2636.       CEB.Draw(Cnvs.Handle, 0, 0);
  2637.       LEB.Draw(Cnvs.Handle, 0, CaptionBitMap.Height);
  2638.       REB.Draw(Cnvs.Handle, FFormWidth - RightBitMap.Width, CaptionBitMap.Height);
  2639.       BEB.Draw(Cnvs.Handle, 0, FFormHeight - BottomBitMap.Height);
  2640.       CEB.Free;
  2641.       LEB.Free;
  2642.       REB.Free;
  2643.       BEB.Free;
  2644.     end;
  2645.   //
  2646.   BottomBitMap.Free;
  2647.   RightBitMap.Free;
  2648.   LeftBitMap.Free;
  2649.   CaptionBitMap.Free;
  2650.   ReleaseDC(FForm.Handle, DC);
  2651.   Cnvs.Handle := 0;
  2652.   Cnvs.Free;
  2653. end;
  2654. procedure TbsBusinessSkinForm.FormShortCut;
  2655. var
  2656.   MM: TMainMenu;
  2657. begin
  2658.   if FInShortCut
  2659.   then
  2660.     begin
  2661.       FInShortCut := False;
  2662.       Handled := False;
  2663.       Exit;
  2664.     end;
  2665.   if (FMainMenuBar <> nil) and (FMainMenuBar.MainMenu <> nil)
  2666.   then
  2667.     MM := FMainMenuBar.MainMenu
  2668.   else
  2669.     MM := FMainMenu;
  2670.   if MM <> nil
  2671.   then
  2672.   if (KeyDataToShiftState(Msg.KeyData) = [ssAlt]) and FindHotKeyItem(Msg.CharCode)
  2673.   then
  2674.     Handled := True
  2675.   else
  2676.     begin
  2677.       FInShortCut := MM.IsShortCut(Msg);
  2678.       if FInShortCut then Handled := True else Handled := False;
  2679.     end;
  2680. end;
  2681. procedure TbsBusinessSkinForm.SetFormStyle;
  2682. begin
  2683.   if (FS = fsNormal) or (FS = fsStayOnTop)
  2684.   then
  2685.     begin
  2686.       FForm.FormStyle := FS;
  2687.       UpDateSkinControls(0, FForm);
  2688.     end;
  2689. end;
  2690. procedure TbsBusinessSkinForm.CreateRollUpForm;
  2691. begin
  2692.   FForm.Height := GetMinHeight;
  2693. end;
  2694. procedure TbsBusinessSkinForm.RestoreRollUpForm;
  2695. begin
  2696.   FForm.Height := OldHeight;
  2697. end;
  2698. procedure TbsBusinessSkinForm.SetRollUpState;
  2699. begin
  2700.   if not (biRollUp in FBorderIcons) or
  2701.      (FRollUpState and (FWindowState = wsMaximized) and not MaxRollUpState) or
  2702.      (FWindowState = wsMinimized)
  2703.   then Exit;
  2704.   if WindowState = wsMaximized then MaxRollUpState := Value;
  2705.   FRollUpState := Value;
  2706.   if FRollUpState
  2707.   then
  2708.     begin
  2709.       OldHeight := FForm.Height;
  2710.       CreateRollUpForm;
  2711.     end
  2712.   else
  2713.     RestoreRollUpForm;
  2714.   if Assigned(FOnChangeRollUpState) then FOnChangeRollUpState(Self);
  2715. end;
  2716. procedure TbsBusinessSkinForm.BeforeUpDateSkinControls;
  2717. procedure CheckControl(C: TControl);
  2718. begin
  2719.   if C is TbsSkinControl
  2720.   then
  2721.     begin
  2722.       with TbsSkinControl(C) do
  2723.         if (Integer(SkinData) = AFSD) or (AFSD = 0)
  2724.         then BeforeChangeSkinData;
  2725.     end;
  2726. end;
  2727. var
  2728.   i: Integer;
  2729. begin
  2730.   CheckControl(WC);
  2731.   for i := 0 to WC.ControlCount - 1 do
  2732.   begin
  2733.     if WC.Controls[i] is TWinControl
  2734.     then
  2735.       BeforeUpDateSkinControls(AFSD, TWinControl(WC.Controls[i]))
  2736.     else
  2737.       CheckControl(WC.Controls[i]);
  2738.   end;
  2739. end;
  2740. procedure TbsBusinessSkinForm.UpDateSkinControls;
  2741. procedure CheckControl(C: TControl);
  2742. begin
  2743.   if C is TbsSkinControl
  2744.   then
  2745.     begin
  2746.       with TbsSkinControl(C) do
  2747.         if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  2748.     end
  2749.   else
  2750.   if C is TbsGraphicSkinControl
  2751.   then
  2752.     begin
  2753.       with TbsGraphicSkinControl(C) do
  2754.         if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  2755.     end
  2756.   else
  2757.   if C is TbsSkinPageControl
  2758.     then
  2759.       begin
  2760.         with TbsSkinPageControl(C) do
  2761.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  2762.       end
  2763.     else
  2764.     if C is TbsSkinTabControl
  2765.     then
  2766.       begin
  2767.         with TbsSkinTabControl(C) do
  2768.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  2769.       end    
  2770.     else
  2771.     if C is TbsSkinCustomEdit
  2772.     then
  2773.       begin
  2774.         with TbsSkinEdit(C) do
  2775.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2776.       end
  2777.     else
  2778.     if C is TbsSkinMemo
  2779.     then
  2780.       begin
  2781.         with TbsSkinMemo(C) do
  2782.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2783.       end
  2784.     else
  2785.     if C is TbsSkinMemo2
  2786.     then
  2787.       begin
  2788.         with TbsSkinMemo2(C) do
  2789.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2790.       end
  2791.     else
  2792.     if C is TbsSkinStdLabel
  2793.     then
  2794.       begin
  2795.         with TbsSkinStdLabel(C) do
  2796.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2797.       end
  2798.     else
  2799.     if C is TbsSkinLinkLabel
  2800.     then
  2801.       begin
  2802.         with TbsSkinLinkLabel(C) do
  2803.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2804.       end
  2805.     else
  2806.     if C is TbsSkinButtonLabel
  2807.     then
  2808.       begin
  2809.         with TbsSkinButtonLabel(C) do
  2810.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2811.       end
  2812.     else
  2813.     if C is TbsSkinTextLabel
  2814.     then
  2815.       begin
  2816.         with TbsSkinTextLabel(C) do
  2817.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2818.       end
  2819.     else
  2820.     if C is TbsSkinCustomTreeView
  2821.     then
  2822.       begin
  2823.         with TbsSkinTreeView(C) do
  2824.           if (Integer(SkinData) = AFSD) or (AFSD = 0)
  2825.           then ChangeSkinData;
  2826.       end
  2827.     else
  2828.     if C is TbsSkinBevel
  2829.     then
  2830.       begin
  2831.         with TbsSkinBevel(C) do
  2832.           if (Integer(SkinData) = AFSD) or (AFSD = 0)
  2833.           then ChangeSkinData;
  2834.       end
  2835.     else
  2836.     if C is TbsSkinCustomListView
  2837.     then
  2838.       begin
  2839.         with TbsSkinListView(C) do
  2840.           if (Integer(SkinData) = AFSD) or (AFSD = 0)
  2841.           then ChangeSkinData;
  2842.       end
  2843.      else
  2844.     if C is TbsSkinHeaderControl
  2845.     then
  2846.       begin
  2847.         with TbsSkinHeaderControl(C) do
  2848.           if (Integer(SkinData) = AFSD) or (AFSD = 0)
  2849.           then ChangeSkinData;
  2850.       end
  2851.     else
  2852.     if C is TbsSkinRichEdit
  2853.     then
  2854.       begin
  2855.         with TbsSkinRichEdit(C) do
  2856.           if (Integer(SkinData) = AFSD) or (AFSD = 0)
  2857.           then ChangeSkinData;
  2858.       end
  2859.     else
  2860.     if C is TbsSkinControlBar
  2861.     then
  2862.       begin
  2863.         with TbsSkinControlBar(C) do
  2864.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2865.       end
  2866.     else
  2867.     if C is TbsSkinSplitter
  2868.     then
  2869.       begin
  2870.         with TbsSkinSplitter(C) do
  2871.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  2872.       end;
  2873. end;
  2874. var
  2875.   i: Integer;
  2876. begin
  2877.   CheckControl(WC);
  2878.   for i := 0 to WC.ControlCount - 1 do
  2879.   begin
  2880.     if WC.Controls[i] is TWinControl
  2881.     then
  2882.       UpDateSkinControls(AFSD, TWinControl(WC.Controls[i]))
  2883.     else
  2884.       CheckControl(WC.Controls[i]);
  2885.   end;
  2886. end;
  2887. procedure TbsBusinessSkinForm.PopupSkinMenu;
  2888. var
  2889.   R: TRect;
  2890. begin
  2891.   SkinMenuOpen;
  2892.   R := Rect(P.X, P.Y, P.X, P.Y);
  2893.   if MenusSkinData = nil
  2894.   then
  2895.     SkinMenu.Popup(nil, SkinData, 0, R, Menu.Items, False)
  2896.   else
  2897.     SkinMenu.Popup(nil, MenusSkinData, 0, R, Menu.Items, False);
  2898. end;
  2899. procedure TbsBusinessSkinForm.PopupSkinMenu1;
  2900. begin
  2901.   SkinMenuOpen;
  2902.   if MenusSkinData = nil
  2903.   then
  2904.     SkinMenu.Popup(nil, SkinData, 0, R, Menu.Items, PopupUp)
  2905.   else
  2906.     SkinMenu.Popup(nil, MenusSkinData, 0, R, Menu.Items, PopupUp);
  2907. end;
  2908. procedure TbsBusinessSkinForm.SkinMenuOpen;
  2909. begin
  2910.   if not InMainMenu
  2911.   then
  2912.     begin
  2913.       HookApp;
  2914.     end;
  2915.   if not InMenu
  2916.   then
  2917.     begin
  2918.       InMenu := True;
  2919.       if Assigned(FOnSkinMenuOpen) then FOnSkinMenuOpen(Self);
  2920.     end;
  2921. end;
  2922. procedure TbsBusinessSkinForm.SkinMainMenuClose;
  2923. begin
  2924.   InMainMenu := False;
  2925.   if SkinMenu.Visible then SkinMenu.Hide;
  2926.   if FMainMenuBar <> nil
  2927.   then
  2928.     FMainMenuBar.MenuExit;
  2929.   UnHookApp;
  2930.   if Assigned(FOnMainMenuExit) then FOnMainMenuExit(Self);  
  2931. end;
  2932. procedure TbsBusinessSkinForm.SkinMenuClose2;
  2933. begin
  2934.   InMenu := False;
  2935.   if FMainMenuBar <> nil
  2936.   then
  2937.     FMainMenuBar.MenuClose;
  2938.   if Assigned(FOnSkinMenuClose) then FOnSkinMenuClose(Self);
  2939. end;
  2940. procedure TbsBusinessSkinForm.SkinMenuClose;
  2941. var
  2942.   i: Integer;
  2943. begin
  2944.   InMenu := False;
  2945.   for i := 0 to ObjectList.Count - 1 do
  2946.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinButtonObject then
  2947.     begin
  2948.       with TbsSkinButtonObject (ObjectList.Items[i]) do
  2949.         if (MenuItem <> nil) and FDown then
  2950.         begin
  2951.           SetDown(False);
  2952.           Break;
  2953.         end;
  2954.     end;