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

Delphi控件源码

开发平台:

Delphi

  1.       Parent.DSF.SkinMenu.Hide;
  2.       Parent.DSF.SkinMenuClose;
  3.       DS.FForm.Close;
  4.     end;
  5. end;
  6. procedure TspSkinMainMenuBarButton.DoCommand;
  7. var
  8.   DS: TspDynamicSkinForm;
  9.   MI: TMenuItem;
  10.   R: TRect;
  11.   P: TPoint;
  12. begin
  13.   DS := GetMDIChildDynamicSkinFormComponent;
  14.   if DS <> nil
  15.   then
  16.     case Command of
  17.       cmClose: DS.FForm.Close;
  18.       cmMinimize: DS.WindowState := wsMinimized;
  19.       cmMaximize: DS.WindowState := wsNormal;
  20.       cmSysMenu:
  21.         begin
  22.           Parent.RePaint;
  23.           P := Point(ObjectRect.Left, ObjectRect.Top);
  24.           P := Parent.ClientToScreen(P);
  25.           R := Rect(P.X, P.Y, P.X + RectWidth(ObjectRect), P.Y + RectHeight(ObjectRect));
  26.           MI := DS.GetSystemMenu;
  27.           Parent.DSF.SkinMenuOpen;
  28.           if Parent.DSF.MenusSkinData = nil
  29.           then
  30.             Parent.DSF.SkinMenu.Popup(Parent, Parent.DSF.SkinData, 0, R, MI, Parent.PopupToUp)
  31.           else
  32.             Parent.DSF.SkinMenu.Popup(Parent, Parent.DSF.MenusSkinData, 0, R, MI, Parent.PopupToUp);
  33.         end;
  34.    end;
  35. end;
  36. procedure TspSkinMainMenuBarButton.MouseDown;
  37. begin
  38.   if not Enabled then Exit;
  39.   if (Button <> mbLeft)
  40.   then
  41.     begin
  42.       inherited MouseDown(X, Y, Button);
  43.       Exit;
  44.     end;
  45.   if not FDown
  46.   then
  47.     begin
  48.       FDown := True;
  49.       if Morphing and not IsNullRect(DownRect) then MorphKf := 1;
  50.       Parent.DrawSkinObject(Self);
  51.       if Command = cmSysMenu then DoCommand;
  52.     end;
  53. end;
  54. procedure TspSkinMainMenuBarButton.MouseUp;
  55. begin
  56.   if not Enabled then Exit;
  57.   if (Button <> mbLeft)
  58.   then
  59.     begin
  60.       inherited MouseUp(X, Y, Button);
  61.       Exit;
  62.     end;
  63.   inherited MouseUp(X, Y, Button);
  64.   if (Command <> cmSysMenu)
  65.   then
  66.     begin
  67.       FDown := False;
  68.       ReDraw;
  69.     end;
  70.   if Active and (Command <> cmSysMenu) then DoCommand;
  71. end;
  72. // ==============TspSkinMainMenuBar =============//
  73. constructor TspSkinMainMenuBarItem.Create;
  74. begin
  75.   inherited Create(AParent, AData);
  76.   if AData <> nil
  77.   then
  78.     begin
  79.       FSkinSupport := True;
  80.       with TspDataSkinMainMenuBarItem(AData) do
  81.       begin
  82.         Self.FontName := FontName;
  83.         Self.FontHeight := FontHeight;
  84.         Self.FontStyle := FontStyle;
  85.         Self.FontColor := FontColor;
  86.         Self.ActiveFontColor := ActiveFontColor;
  87.         Self.DownFontColor := DownFontColor;
  88.         Self.TextRct := TextRct;
  89.         Self.DownRect := DownRect;
  90.         Self.LO := ItemLO;
  91.         Self.RO := ItemRO;
  92.         Self.UnEnabledFontColor := UnEnabledFontColor;
  93.       end;
  94.       if IsNullRect(DownRect) then
  95.       if IsNullRect(ActiveSkinRect)
  96.       then DownRect := SkinRect else DownRect := ActiveSkinRect;
  97.       if IsNullRect(ActiveSkinRect) then Morphing := False;
  98.     end
  99.   else
  100.     FSkinSupport := False;
  101.   OldEnabled := Enabled;
  102.   Visible := True;
  103. end;
  104. procedure TspSkinMainMenuBarItem.SearchActive;
  105. var
  106.   i: Integer;
  107. begin
  108.   for i := 0 to Parent.ObjectList.Count - 1 do
  109.    if (TspMenuBarObject(Parent.ObjectList.Items[i]) is TspSkinMainMenuBarItem)
  110.       and (TspSkinMainMenuBarItem(Parent.ObjectList.Items[i]).IDName <> IDName)
  111.       and (TspSkinMainMenuBarItem(Parent.ObjectList.Items[i]).Active)
  112.    then
  113.      begin
  114.        TspSkinMainMenuBarItem(Parent.ObjectList.Items[i]).MouseLeave;
  115.        Break;
  116.      end;
  117. end;
  118. function TspSkinMainMenuBarItem.SearchDown;
  119. var
  120.   i: Integer;
  121. begin
  122.   Result := False;
  123.   for i := 0 to Parent.ObjectList.Count - 1 do
  124.    if (TspMenuBarObject(Parent.ObjectList.Items[i]) is TspSkinMainMenuBarItem)
  125.       and (TspSkinMainMenuBarItem(Parent.ObjectList.Items[i]).IDName <> IDName)
  126.       and (TspSkinMainMenuBarItem(Parent.ObjectList.Items[i]).FDown)
  127.    then
  128.      begin
  129.        TspSkinMainMenuBarItem(Parent.ObjectList.Items[i]).SetDown(False);
  130.        Result := True;
  131.        Break;
  132.      end;
  133. end;
  134. procedure TspSkinMainMenuBarItem.DefaultDraw;
  135. function CalcObjectRect(Cnvs: TCanvas): TRect;
  136. var
  137.   w, i, j: Integer;
  138.   R, TR: TRect;
  139. begin
  140.   w := 2;
  141.   Cnvs.Font.Assign(Parent.DefItemFont);
  142.   TR := Rect(0, 0, 0, 0);
  143.   DrawText(Cnvs.Handle, PChar(MenuItem.Caption),
  144.     Length(MenuItem.Caption), TR, DT_CALCRECT or DT_CENTER);
  145.   w := w + RectWidth(TR) + 10;
  146.   R := Rect(0, 0, 0, 0);
  147.   j := Parent.ObjectList.IndexOf(Self);
  148.   for i := j - 1  downto 0 do
  149.     if TspMenuBarObject(Parent.ObjectList.Items[i]) is TspSkinMainMenuBarItem
  150.     then
  151.       begin
  152.         R.Left := TspMenuBarObject(Parent.ObjectList.Items[i]).ObjectRect.Right;
  153.         Break;
  154.       end;
  155.   if R.Left = 0 then R.Left := Parent.NewItemsRect.Left;
  156.   R.Top := Parent.NewItemsRect.Top;
  157.   R.Right := R.Left + w;
  158.   R.Bottom := Parent.NewItemsRect.Bottom;
  159.   Result := R;
  160. end;
  161. var
  162.   Buffer: TBitMap;
  163.   R, R1: TRect;
  164.   TMO: Integer;
  165. begin
  166.   Buffer := TBitMap.Create;
  167.   ObjectRect := CalcObjectRect(Buffer.Canvas);
  168.   if Parent.ScrollMenu
  169.   then
  170.     TMO := TRACKMARKEROFFSET
  171.   else
  172.     TMO := 0;
  173.   if ObjectRect.Right > Parent.NewItemsRect.Right - TMO
  174.   then
  175.     begin
  176.       Parent.Scroll := True;
  177.       if Visible
  178.       then
  179.         begin
  180.           OldEnabled := Enabled;
  181.           Enabled := False;
  182.           Visible := False;
  183.         end;
  184.       Buffer.Free;
  185.       Exit;
  186.     end
  187.   else
  188.     if not Visible
  189.     then
  190.       begin
  191.         Visible := True;
  192.         Enabled := OldEnabled;
  193.       end;
  194.   Buffer.Width := RectWidth(ObjectRect);
  195.   Buffer.Height := RectHeight(ObjectRect);
  196.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  197.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  198.   with Buffer.Canvas do
  199.   begin
  200.     if FDown 
  201.     then
  202.       begin
  203.         Frame3D(Buffer.Canvas, R, SP_XP_BTNFRAMECOLOR, SP_XP_BTNFRAMECOLOR, 1);
  204.         Brush.Color := SP_XP_BTNDOWNCOLOR;
  205.         FillRect(R);
  206.       end
  207.     else
  208.       if FMouseIn
  209.       then
  210.         begin
  211.           Frame3D(Buffer.Canvas, R, SP_XP_BTNFRAMECOLOR, SP_XP_BTNFRAMECOLOR, 1);
  212.           Brush.Color := SP_XP_BTNACTIVECOLOR;
  213.           FillRect(R);
  214.         end
  215.       else
  216.         begin
  217.           Brush.Color := clBtnFace;
  218.           FillRect(R);
  219.         end;
  220.   end;
  221.   //
  222.   R1 := Rect(0, 0, 0, 0);
  223.   Buffer.Canvas.Font.Assign(Parent.DefItemFont);
  224.   DrawText(Buffer.Canvas.Handle, PChar(MenuItem.Caption),
  225.      Length(MenuItem.Caption), R1, DT_CALCRECT);
  226.   R.Top := R.Top + RectHeight(R) div 2 - R1.Bottom div 2;
  227.   R.Bottom := R.Top + R1.Bottom;
  228.   if FDown
  229.   then
  230.     begin
  231.       Inc(R.Left);
  232.       Inc(R.Top);
  233.     end;  
  234.   DrawText(Buffer.Canvas.Handle, PChar(MenuItem.Caption),
  235.     Length(MenuItem.Caption), R, DT_CENTER or DT_VCENTER);
  236.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  237.   Buffer.Free;
  238. end;
  239. procedure TspSkinMainMenuBarItem.Draw;
  240. function CalcObjectRect(Cnvs: TCanvas): TRect;
  241. var
  242.   w, i, j: Integer;
  243.   R, TR: TRect;
  244. begin
  245.   w := TextRct.Left + RectWidth(SkinRect) - TextRct.Right;
  246.   with Cnvs do
  247.   begin
  248.     Font.Name := FontName;
  249.     Font.Style := FontStyle;
  250.     Font.Height := FontHeight;
  251.     Font.CharSet := Parent.DefItemFont.Charset;
  252.   end;
  253.   TR := Rect(0, 0, 0, 0);
  254.   DrawText(Cnvs.Handle, PChar(MenuItem.Caption),
  255.     Length(MenuItem.Caption), TR, DT_CALCRECT or DT_CENTER);
  256.   w := w + RectWidth(TR) + 2;
  257.   R := Rect(0, 0, 0, 0);
  258.   j := Parent.ObjectList.IndexOf(Self);
  259.   for i := j - 1  downto 0 do
  260.     if TspMenuBarObject(Parent.ObjectList.Items[i]) is TspSkinMainMenuBarItem
  261.     then
  262.       begin
  263.         R.Left := TspMenuBarObject(Parent.ObjectList.Items[i]).ObjectRect.Right;
  264.         Break;
  265.       end;
  266.   if R.Left = 0 then R.Left := Parent.NewItemsRect.Left;
  267.   R.Top := Parent.NewItemsRect.Top;
  268.   R.Right := R.Left + w;
  269.   R.Bottom := R.Top + RectHeight(SkinRect);
  270.   Result := R;
  271. end;
  272. procedure CreateItemImage(B: TBitMap; Rct: TRect; AActive: Boolean);
  273. var
  274.   XO, w, XCnt: Integer;
  275.   TR: TRect;
  276.   X: Integer;
  277. begin
  278.   if Picture = nil then Exit;
  279.   B.Width := RectWidth(ObjectRect);
  280.   B.Height := RectHeight(ObjectRect);
  281.   with B.Canvas do
  282.   begin
  283.     if LO <> 0 then
  284.        CopyRect(Rect(0, 0, LO, B.Height), Picture.Canvas,
  285.                 Rect(Rct.Left, Rct.Top, Rct.Left + LO, Rct.Bottom));
  286.     if RO <> 0 then
  287.        CopyRect(Rect(B.Width - RO, 0, B.Width, B.Height),
  288.                 Picture.Canvas,
  289.                 Rect(Rct.Right - RO, Rct.Top, Rct.Right, Rct.Bottom));
  290.     Inc(Rct.Left, LO);
  291.     Dec(Rct.Right, RO);
  292.     w := RectWidth(Rct);
  293.     XCnt := (B.Width - LO - RO) div w;
  294.     for X := 0 to XCnt do
  295.     begin
  296.       if LO + X * w + w > B.Width - RO
  297.       then XO := LO + X * w + w - (B.Width - RO)
  298.       else XO := 0;
  299.       B.Canvas.CopyRect(Rect(LO + X * w, 0, LO + X * w + w - XO,
  300.                         B.Height),
  301.                         Picture.Canvas,
  302.                         Rect(Rct.Left, Rct.Top, Rct.Right - XO, Rct.Bottom));
  303.     end;
  304.     Brush.Style := bsClear;
  305.     if FDown
  306.     then
  307.       Font.Color := DownFontColor
  308.     else
  309.       if AActive
  310.       then
  311.         Font.Color := ActiveFontColor
  312.       else
  313.         if Self.MenuItem.Enabled
  314.         then Font.Color := FontColor
  315.         else Font.Color := UnEnabledFontColor;
  316.     Font.Name := FontName;
  317.     Font.Style := FontStyle;
  318.     Font.Height := FontHeight;
  319.     Font.CharSet := Parent.DefItemFont.Charset;
  320.     TR := TextRct;
  321.     DrawText(B.Canvas.Handle, PChar(MenuItem.Caption),
  322.       Length(MenuItem.Caption), TR, DT_CALCRECT);
  323.     Inc(TR.Right, 2);
  324.     DrawText(B.Canvas.Handle, PChar(MenuItem.Caption),
  325.       Length(MenuItem.Caption), TR, DT_CENTER or DT_VCENTER);
  326.   end;
  327. end;
  328. var
  329.   Buffer, ABuffer: TBitMap;
  330.   PBuffer, APBuffer: TspEffectBmp;
  331.   TMO: Integer;
  332. begin
  333.   if not FSkinSupport
  334.   then
  335.     begin
  336.       DefaultDraw(Cnvs);
  337.       Exit;
  338.     end;
  339.   if IsNullRect(SkinRect) or IsNullRect(TextRct) then Exit;
  340.   Buffer := TBitMap.Create;
  341.   ObjectRect := CalcObjectRect(Buffer.Canvas);
  342.   if Parent.ScrollMenu
  343.   then
  344.     TMO := TRACKMARKEROFFSET
  345.   else
  346.     TMO := 0;
  347.   if ObjectRect.Right > Parent.NewItemsRect.Right - TMO
  348.   then
  349.     begin
  350.       Parent.Scroll := True;
  351.       if Visible
  352.       then
  353.         begin
  354.           OldEnabled := Enabled;
  355.           Enabled := False;
  356.           Visible := False;
  357.         end;
  358.       Buffer.Free;
  359.       Exit;
  360.     end
  361.   else
  362.     if not Visible
  363.     then
  364.       begin
  365.         Visible := True;
  366.         Enabled := OldEnabled;
  367.       end;
  368.   if FDown
  369.   then
  370.     begin
  371.       CreateItemImage(Buffer, DownRect, True);
  372.       Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  373.     end
  374.   else
  375.     if not Morphing or
  376.        ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  377.     then
  378.       begin
  379.         if Active
  380.         then
  381.           begin
  382.             if isNullRect(ActiveSkinRect)
  383.             then
  384.               CreateItemImage(Buffer, SkinRect, True)
  385.             else
  386.               CreateItemImage(Buffer, ActiveSkinRect, True);
  387.           end
  388.         else CreateItemImage(Buffer, SkinRect, False);
  389.         Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  390.       end
  391.     else
  392.       begin
  393.         CreateItemImage(Buffer, SkinRect, False);
  394.         ABuffer := TBitMap.Create;
  395.         CreateItemImage(ABuffer, ActiveSkinRect, True);
  396.         PBuffer := TspEffectBmp.CreateFromhWnd(Buffer.Handle);
  397.         APBuffer := TspEffectBmp.CreateFromhWnd(ABuffer.Handle);
  398.         case MorphKind of
  399.           mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  400.           mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  401.           mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  402.           mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  403.           mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  404.           mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  405.          mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  406.         end;
  407.         PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  408.         PBuffer.Free;
  409.         APBuffer.Free;
  410.         ABuffer.Free;
  411.       end;
  412.   Buffer.Free;
  413. end;
  414. procedure TspSkinMainMenuBarItem.MouseEnter;
  415. begin
  416.   if SearchDown
  417.   then
  418.     begin
  419.       Active := True;
  420.       FMouseIn := True;
  421.       if Morphing then MorphKf := 1;
  422.       SetDown(True);
  423.     end
  424.   else
  425.     begin
  426.       SearchActive;
  427.       FMouseIn := True;
  428.       Active := True;
  429.       ReDraw;
  430.       if Assigned(Parent.OnItemMouseEnter)
  431.       then
  432.         Parent.OnItemMouseEnter(Self.MenuItem);
  433.     end;
  434. end;
  435. procedure TspSkinMainMenuBarItem.MouseLeave;
  436. begin
  437.   Active := False;
  438.   FMouseIn := False;
  439.   if Morphing and FDown then MorphKf := 0;
  440.   Redraw;
  441.   if Assigned(Parent.OnItemMouseLeave)
  442.   then
  443.     Parent.OnItemMouseLeave(Self.MenuItem);
  444. end;
  445. procedure TspSkinMainMenuBarItem.SetDown;
  446. begin
  447.   FDown := Value;
  448.   if FDown
  449.   then
  450.     begin
  451.       Parent.DrawSkinObject(Self);
  452.       if Parent.DSF <> nil
  453.       then
  454.         with Parent.DSF do
  455.         begin
  456.           if not InMainMenu
  457.           then
  458.             begin
  459.               if Assigned(OnMainMenuEnter) then OnMainMenuEnter(Parent);
  460.             end;
  461.         end;
  462.       TrackMenu;
  463.     end
  464.   else
  465.     begin
  466.       Active := False;
  467.       if Morphing
  468.       then
  469.         begin
  470.           FMorphKf := 1;
  471.           ReDraw;
  472.         end
  473.       else
  474.         Parent.DrawSkinObject(Self);
  475.     end;
  476. end;
  477. procedure TspSkinMainMenuBarItem.TrackMenu;
  478. var
  479.   R: TRect;
  480.   P: TPoint;
  481. begin
  482.   P := Point(ObjectRect.Left, ObjectRect.Top);
  483.   P := Parent.ClientToScreen(P);
  484.   R := Rect(P.X, P.Y, P.X + RectWidth(ObjectRect), P.Y + RectHeight(ObjectRect));
  485.   if Parent.DSF <> nil
  486.   then
  487.     with Parent.DSF do
  488.     begin
  489.       SkinMenuOpen;
  490.       if not InMainMenu then InMainMenu := True;
  491.       SkinMenu.Popup(nil, Parent.SkinData, 0, R, MenuItem, Parent.PopupToUp);
  492.     end;
  493. end;
  494. procedure TspSkinMainMenuBarItem.MouseDown;
  495. var
  496.   Menu: TMenu;
  497. begin
  498.   if not Enabled then Exit;
  499.   if Button = mbLeft
  500.   then
  501.     begin
  502.       if Assigned(Parent.OnMainMenuItemClick)
  503.       then
  504.         Parent.OnMainMenuItemClick(IDName);
  505.       if MenuItem.Count <> 0
  506.       then
  507.         begin
  508.           Parent.MenuActive := True;
  509.           SetDown(True);
  510.         end
  511.       else
  512.         begin
  513.           if Parent.DSF.InMainMenu
  514.           then
  515.             Parent.DSF.SkinMainMenuClose;
  516.           Parent.DSF.InMenu := False;
  517.           if Morphing then ReDraw else Parent.DrawSkinObject(Self);
  518.           Menu := MenuItem.GetParentMenu;
  519.           Menu.DispatchCommand(MenuItem.Command);
  520.         end;
  521.      end;
  522. end;
  523. constructor TspSkinMainMenuBar.Create(AOwner: TComponent);
  524. begin
  525.   inherited;
  526.   FScrollMenu := True;
  527.   FSkinDataName := 'mainmenubar';
  528.   FSkinSupport := False;
  529.   Align := alTop;
  530.   FDefaultHeight := 22;
  531.   Height := 22;
  532.   MouseTimer := TTimer.Create(Self);
  533.   MouseTimer.Enabled := False;
  534.   MouseTimer.OnTimer := TestMouse;
  535.   MouseTimer.Interval := MouseTimerInterval;
  536.   MorphTimer := TTimer.Create(Self);
  537.   MorphTimer.Enabled := False;
  538.   MorphTimer.OnTimer := TestMorph;
  539.   MorphTimer.Interval := MorphTimerInterval;
  540.   ObjectList := TList.Create;
  541.   OldActiveObject := -1;
  542.   ActiveObject := -1;
  543.   MouseCaptureObject := -1;
  544.   DSF := nil;
  545.   MarkerActive := False;
  546.   MenuActive := False;
  547.   FPopupToUp := False;
  548.   FMDIChildMax := False;
  549.   ButtonsCount := 0;
  550.   FDefItemFont := TFont.Create;
  551.   with FDefItemFont do
  552.   begin
  553.     Name := 'Arial';
  554.     Style := [];
  555.     Height := 14;
  556.     Color := clBtnText;
  557.   end;
  558. end;
  559. destructor TspSkinMainMenuBar.Destroy;
  560. begin
  561.   FDefItemFont.Free;
  562.   ClearObjects;
  563.   ObjectList.Free;
  564.   MouseTimer.Free;
  565.   MorphTimer.Free;
  566.   inherited;
  567. end;
  568. function TspSkinMainMenuBar.GetChildMainMenu: TMainMenu;
  569. var
  570.   i: Integer;
  571. begin
  572.   Result := nil;
  573.   if (Application.MainForm <> nil) and (Application.MainForm.ActiveMDIChild <> nil)
  574.   then
  575.     with Application.MainForm.ActiveMDIChild do
  576.     begin
  577.       for i := 0 to ComponentCount - 1 do
  578.       begin
  579.         if Components[i] is TMainMenu
  580.         then
  581.           begin
  582.             Result := TMainMenu(Components[i]);
  583.             Break;
  584.           end;
  585.       end;
  586.     end;
  587. end;
  588. procedure TspSkinMainMenuBar.SetDefaultWidth;
  589. begin
  590.   FDefaultWidth := Value;
  591.   if (FIndex = -1) and (FDefaultWidth > 0) then Width := FDefaultWidth;
  592. end;
  593. procedure TspSkinMainMenuBar.SetDefaultHeight;
  594. begin
  595.   FDefaultHeight := Value;
  596.   if (FIndex = -1) and (FDefaultHeight > 0) then Height := FDefaultHeight;
  597. end;
  598. procedure TspSkinMainMenuBar.SetDefItemFont;
  599. begin
  600.   FDefItemFont.Assign(Value);
  601.   if FIndex = -1 then RePaint; 
  602. end;
  603. procedure TspSkinMainMenuBar.WMCloseSkinMenu;
  604. begin
  605.   CloseSysMenu;
  606. end;
  607. procedure TspSkinMainMenuBar.CloseSysMenu;
  608. var
  609.   i: Integer;
  610. begin
  611.   for i := 0 to ObjectList.Count - 1 do
  612.   if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarButton then
  613.   with TspSkinMainMenuBarButton(ObjectList.Items[i]) do
  614.     if (Command = cmSysMenu) and FDown
  615.     then
  616.       begin
  617.         if ActiveObject <> i
  618.         then
  619.           begin
  620.             Active := False;
  621.             FMouseIn := False;
  622.           end;
  623.         FDown := False;
  624.         ReDraw;
  625.       end;
  626. end;
  627. procedure TspSkinMainMenuBar.CheckButtons;
  628. var
  629.   i: Integer;
  630. begin
  631.   for i := 0 to ButtonsCount - 1 do
  632.   with TspSkinMainMenuBarButton(ObjectList.Items[i]) do
  633.   begin
  634.     Enabled := True;
  635.     case Command of
  636.       cmMinimize: if not (biMinimize in BI) then Enabled := False;
  637.       cmSysMenu: if not (biSystemMenu in BI) then Enabled := False;
  638.     end;
  639.   end;
  640. end;
  641. procedure TspSkinMainMenuBar.AddButtons;
  642. procedure AddButton(ButtonName: String);
  643. var
  644.   ButtonData: TspDataSkinMainMenuBarButton;
  645.   Index: Integer;
  646. begin
  647.   if (FSD = nil) or (FSD.Empty)
  648.   then
  649.     Index := -1
  650.   else
  651.     Index := FSD.GetIndex(ButtonName);
  652.   if Index <> -1
  653.   then
  654.     ButtonData := TspDataSkinMainMenuBarButton(FSD.ObjectList.Items[Index])
  655.   else
  656.     ButtonData := nil;
  657.   ObjectList.Insert(0, TspSkinMainMenuBarButton.Create(Self, ButtonData));
  658.   with TspSkinMainMenuBarButton(ObjectList.Items[0]) do
  659.   begin
  660.     IDName := ButtonName;
  661.   end;
  662.   Inc(ButtonsCount);
  663. end;
  664. begin
  665.   ButtonsCount := 0;
  666.   if FIndex <> -1
  667.   then
  668.     begin
  669.       AddButton(MinButton);
  670.       AddButton(MaxButton);
  671.       AddButton(CloseButton);
  672.       AddButton(SysMenuButton);
  673.     end
  674.   else
  675.     begin
  676.       AddButton('MinButton');
  677.       TspSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmMinimize;
  678.       AddButton('MaxButton');
  679.       TspSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmMaximize;
  680.       AddButton('CloseButton');
  681.       TspSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmClose;
  682.       AddButton('SysMenuButton');
  683.       TspSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmSysMenu;
  684.     end;
  685. end;
  686. procedure TspSkinMainMenuBar.DeleteButtons;
  687. var
  688.   i: Integer;
  689. begin
  690.   for i := 0 to ButtonsCount - 1 do
  691.   begin
  692.     ActiveObject := -1;
  693.     MouseCaptureObject := -1;
  694.     TspMenuBarObject(ObjectList.Items[0]).Free;
  695.     ObjectList.Delete(0);
  696.   end;
  697.   ButtonsCount := 0;
  698. end;
  699. procedure TspSkinMainMenuBar.MDIChildMaximize;
  700. var
  701.   DS: TspDynamicSkinForm;
  702. begin
  703.   if not FMDIChildMax
  704.   then
  705.     begin
  706.       FMDIChildMax := True;
  707.       OldActiveObject := -1;
  708.       ActiveObject := -1;
  709.       MouseCaptureObject := -1;
  710.       AddButtons;
  711.       DS := GetMDIChildDynamicSkinFormComponent;
  712.       if DS <> nil then CheckButtons(DS.BorderIcons); 
  713.       RePaint;
  714.     end;
  715. end;
  716. procedure TspSkinMainMenuBar.MDIChildRestore;
  717. var
  718.   DS: TspDynamicSkinForm;
  719. begin
  720.   DS := GetMDIChildDynamicSkinFormComponent;
  721.   if (DS = nil) and FMDIChildMax
  722.   then
  723.     begin
  724.       FMDIChildMax := False;
  725.       DeleteButtons;
  726.       RePaint;
  727.     end
  728.   else
  729.     if DS <> nil
  730.     then CheckButtons(DS.BorderIcons);
  731. end;
  732. function TspSkinMainMenuBar.GetMarkerRect;
  733. begin
  734.   Result :=  Rect(NewItemsRect.Right - TRACKMARKEROFFSET, NewItemsRect.Top,
  735.                   NewItemsRect.Right, NewItemsRect.Bottom);
  736. end;
  737. procedure TspSkinMainMenuBar.DrawMarker;
  738. var
  739.   C: TColor;
  740. begin
  741.   if FIndex <> -1
  742.   then
  743.     begin
  744.       if MarkerActive
  745.       then C := TrackMarkActiveColor
  746.       else C := TrackMarkColor;
  747.     end
  748.   else
  749.     begin
  750.       if MarkerActive
  751.       then C := clBtnText
  752.       else C := clBtnShadow;
  753.     end;
  754.   DrawArrowImage(Cnvs, GetMarkerRect, C, 2);
  755. end;
  756. procedure TspSkinMainMenuBar.TrackScrollMenu;
  757. var
  758.   i, VisibleCount: Integer;
  759.   R: TRect;
  760.   P: TPoint;
  761.   ChildMainMenu: TMainMenu;
  762. begin
  763.   if DSF = nil then Exit;
  764.   VisibleCount := 0;
  765.   for i := 0 to ObjectList.Count - 1 do
  766.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  767.     then
  768.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  769.       begin
  770.         if Visible then Inc(VisibleCount);
  771.       end;
  772.   P := Point(NewItemsRect.Right, NewItemsRect.Top);
  773.   P := ClientToScreen(P);
  774.   R := Rect(P.X - TRACKMARKEROFFSET, P.Y,
  775.             P.X, P.Y + RectHeight(NewItemsRect));
  776.   if DSF.FForm.FormStyle = fsMDIForm
  777.   then
  778.     ChildMainMenu := GetChildMainMenu
  779.   else
  780.     ChildMainMenu := nil;
  781.   DSF.SkinMenuOpen;
  782.   if ChildMainMenu = nil
  783.   then
  784.     DSF.SkinMenu.Popup(nil, FSD, VisibleCount, R, FMainMenu.Items, False)
  785.   else
  786.     DSF.SkinMenu.Popup2(nil, FSD, VisibleCount, R, FMainMenu.Items, ChildMainMenu.Items, False);
  787. end;
  788. function TspSkinMainMenuBar.FindHotKeyItem;
  789. var
  790.   i: Integer;
  791. begin
  792.   Result := False;
  793.   if (DSF <> nil) and (ObjectList <> nil) then 
  794.   for i := 0 to ObjectList.Count - 1 do
  795.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  796.     then
  797.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  798.       begin
  799.         if Enabled and Visible and
  800.            IsAccel(CharCode, MenuItem.Caption)
  801.         then
  802.           begin
  803.             MouseEnter;
  804.             if (not DSF.InMenu) or (MenuItem.Count = 0) then MouseDown(0, 0, mbLeft);
  805.             Result := True;
  806.             Break;
  807.           end;
  808.       end
  809. end;
  810. procedure TspSkinMainMenuBar.NextMainMenuItem;
  811. function IsEndItem(Index: Integer): Boolean;
  812. var
  813.   i: Integer;
  814. begin
  815.   Result := True;
  816.   if Index + 1 > ObjectList.Count - 1
  817.   then
  818.     Result := True
  819.   else
  820.   for i := Index + 1 to ObjectList.Count - 1 do
  821.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  822.     then
  823.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  824.       begin
  825.         if Enabled and Visible then Result := False;
  826.       end
  827. end;
  828. var
  829.   i, j: Integer;
  830.   EndI: Boolean;
  831.   FirstItem: Integer;
  832. begin
  833.   EndI := False;
  834.   FirstItem := -1;
  835.   j := -1;
  836.   for i := 0 to ObjectList.Count - 1 do
  837.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  838.     then
  839.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  840.       begin
  841.         if Enabled and Visible
  842.         then
  843.           begin
  844.             if FirstItem = -1 then FirstItem := i;
  845.             if (Active or FDown)
  846.             then
  847.               begin
  848.                 j := i;
  849.                 MouseLeave;
  850.                 EndI := IsEndItem(j);
  851.                 Break;
  852.               end;
  853.           end;
  854.        end;   
  855.   if j = -1
  856.   then
  857.     begin
  858.       j := FirstItem;
  859.       if j <> -1 then
  860.         TspSkinMainMenuBarItem(ObjectList.Items[j]).MouseEnter;
  861.     end
  862.   else
  863.     begin
  864.       if EndI then j := 0 else j := j + 1;
  865.       if j < ObjectList.Count then
  866.       for i := j to ObjectList.Count - 1 do
  867.       if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  868.       then
  869.         with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  870.         begin
  871.           if Enabled and Visible
  872.           then
  873.             begin
  874.               MouseEnter;
  875.               Break;
  876.             end;
  877.         end;    
  878.     end;
  879. end;
  880. procedure TspSkinMainMenuBar.PriorMainMenuItem;
  881. function IsEndItem(Index: Integer): Boolean;
  882. var
  883.   i: Integer;
  884. begin
  885.   Result := True;
  886.   if Index - 1 < 0
  887.   then
  888.     Result := True
  889.   else
  890.   for i := Index - 1 downto 0 do
  891.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  892.     then
  893.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  894.       begin
  895.         if Enabled and Visible then Result := False;
  896.       end
  897. end;
  898. var
  899.   i, j: Integer;
  900.   EndI: Boolean;
  901.   LastItem: Integer;
  902. begin
  903.   EndI := False;
  904.   j := -1;
  905.   LastItem := -1;
  906.   for i := ObjectList.Count - 1 downto 0 do
  907.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  908.     then
  909.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  910.       begin
  911.         if Enabled and Visible
  912.         then
  913.           begin
  914.             if LastItem = -1 then LastItem := i;
  915.             if Active or FDown then
  916.             begin
  917.               j := i;
  918.               MouseLeave;
  919.               EndI := IsEndItem(j);
  920.               Break;
  921.             end;
  922.           end;
  923.       end;
  924.   if j = -1
  925.   then
  926.     begin
  927.       j := LastItem;
  928.       if j <> -1 then
  929.         TspSkinMainMenuBarItem(ObjectList.Items[j]).MouseEnter;
  930.     end
  931.   else
  932.     begin
  933.       if EndI then j := ObjectList.Count - 1 else j := j - 1;
  934.       if j > -1 then
  935.       for i := j downto 0 do
  936.       if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  937.       then
  938.        with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  939.        begin
  940.          if Enabled and Visible
  941.          then
  942.            begin
  943.              MouseEnter;
  944.              Break;
  945.            end;
  946.        end;
  947.     end;
  948. end;
  949. function TspSkinMainMenuBar.CheckReturnKey;
  950. var
  951.   i: Integer;
  952. begin
  953.   Result := False;
  954.   if DSF <> nil then 
  955.   for i := 0 to ObjectList.Count - 1 do
  956.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  957.     then
  958.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  959.       begin
  960.         if (FDown and (MenuItem.Count = 0)) or
  961.            (Active and not DSF.InMenu)
  962.         then
  963.           begin
  964.             Active := False;
  965.             MouseDown(0, 0, mbLeft);
  966.             Result := True;
  967.             Break;
  968.          end;
  969.       end;
  970. end;
  971. procedure TspSkinMainMenuBar.MenuEnter;
  972. var
  973.   i: Integer;
  974.   FirstItem: Integer;
  975. begin
  976.   FirstItem := -1;
  977.   MenuActive := True;
  978.   for i := 0 to ObjectList.Count - 1 do
  979.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem
  980.     then
  981.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  982.       begin
  983.         if FirstItem = -1 then FirstItem := i;
  984.         if Active
  985.         then
  986.           begin
  987.             FirstItem := i;
  988.             Break;
  989.           end;
  990.       end;
  991.   if FirstItem <> -1
  992.   then
  993.     begin
  994.       TspSkinMainMenuBarItem(ObjectList.Items[FirstItem]).MouseEnter;
  995.       if DSF <> nil then
  996.       with DSF do
  997.       begin
  998.         HookApp;
  999.         InMainMenu := True;
  1000.         if Assigned(OnMainMenuEnter) then OnMainMenuEnter(Self);
  1001.       end;
  1002.     end;
  1003. end;
  1004. procedure TspSkinMainMenuBar.MenuClose;
  1005. var
  1006.   i: Integer;
  1007. begin
  1008.   for i := 0 to ObjectList.Count - 1 do
  1009.   if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem then
  1010.   begin
  1011.     with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  1012.       if FDown then
  1013.        begin
  1014.          FDown := False;
  1015.          Active := True;
  1016.          if Morphing then MorphKf := 1;
  1017.          DrawSkinObject(TspSkinMainMenuBarItem(ObjectList.Items[i]));
  1018.          Break;
  1019.        end;
  1020.   end;
  1021. end;
  1022. procedure TspSkinMainMenuBar.MenuExit;
  1023. var
  1024.   i: Integer;
  1025. begin
  1026.   MenuActive := False;
  1027.   for i := 0 to ObjectList.Count - 1 do
  1028.     if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarItem then
  1029.     begin
  1030.       with TspSkinMainMenuBarItem(ObjectList.Items[i]) do
  1031.         if FDown or Active then
  1032.         begin
  1033.           Active := False;
  1034.           FMouseIn := False;
  1035.           FDown := False;
  1036.           if Morphing then MorphKf := 1;
  1037.           ReDraw;
  1038.           Break;
  1039.         end;
  1040.     end;
  1041.   ActiveObject := -1;
  1042.   OldActiveObject := -1;
  1043. end;
  1044. procedure TspSkinMainMenuBar.CalcRects;
  1045. var
  1046.   Off: Integer;
  1047.   i: Integer;
  1048. begin
  1049.   if FSkinSupport
  1050.   then
  1051.     begin
  1052.       Off := RectWidth(SkinRect) - ItemsRect.Right;
  1053.       NewItemsRect := Rect(ItemsRect.Left, ItemsRect.Top, Width - Off, ItemsRect.Bottom);
  1054.     end
  1055.   else
  1056.     NewItemsRect := Rect(2, 2, Width - 2, Height - 2);
  1057.   if FMDIChildMax and (ButtonsCount = 4)
  1058.   then
  1059.     begin
  1060.       if TspMenuBarObject(ObjectList.Items[0]) is TspSkinMainMenuBarButton
  1061.       then
  1062.         with TspSkinMainMenuBarButton((ObjectList.Items[0])) do
  1063.         begin
  1064.           if FSkinSupport
  1065.           then
  1066.             begin
  1067.               ObjectRect := Rect(NewItemsRect.Left,
  1068.                 NewItemsRect.Top +
  1069.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2,
  1070.                 NewItemsRect.Left + RectWidth(SkinRect),
  1071.                 NewItemsRect.Top +
  1072.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2 +
  1073.                 RectHeight(SkinRect));
  1074.               Inc(NewItemsRect.Left, RectWidth(SkinRect) + 2);
  1075.             end
  1076.           else
  1077.             begin
  1078.               ObjectRect := Rect(NewItemsRect.Left,
  1079.                                  NewItemsRect.Top,
  1080.                                  NewItemsRect.Left + RectHeight(NewItemsRect),
  1081.                                  NewItemsRect.Bottom);
  1082.               Inc(NewItemsRect.Left, RectHeight(NewItemsRect) + 2);
  1083.             end;
  1084.         end;
  1085.       for i := 1 to 3 do
  1086.       if TspMenuBarObject(ObjectList.Items[i]) is TspSkinMainMenuBarButton
  1087.       then
  1088.         with TspSkinMainMenuBarButton((ObjectList.Items[i])) do
  1089.         begin
  1090.           if FSkinSupport
  1091.           then
  1092.             begin
  1093.               ObjectRect := Rect(NewItemsRect.Right - RectWidth(SkinRect),
  1094.                 NewItemsRect.Top +
  1095.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2,
  1096.                 NewItemsRect.Right,
  1097.                 NewItemsRect.Top +
  1098.                 RectHeight(NewItemsRect) div 2 - RectHeight(SkinRect) div 2 +
  1099.                 RectHeight(SkinRect));
  1100.               Dec(NewItemsRect.Right, RectWidth(SkinRect) + 2);
  1101.             end
  1102.           else
  1103.             begin
  1104.               ObjectRect := Rect(NewItemsRect.Right - RectHeight(NewItemsRect),
  1105.                                  NewItemsRect.Top,
  1106.                                  NewItemsRect.Right,
  1107.                                  NewItemsRect.Bottom);
  1108.               Dec(NewItemsRect.Right, RectHeight(NewItemsRect) + 2);
  1109.             end;
  1110.         end;
  1111.     end;
  1112. end;
  1113. procedure TspSkinMainMenuBar.DrawSkinObject;
  1114. begin
  1115.   AObject.Draw(Canvas);
  1116. end;
  1117. procedure TspSkinMainMenuBar.GetSkinData;
  1118. begin
  1119.   inherited;
  1120.   if FIndex <> -1
  1121.   then
  1122.     if TspDataSkinControl(FSD.CtrlList.Items[FIndex]) is TspDataSkinMainMenuBar
  1123.     then
  1124.       with TspDataSkinMainMenuBar(FSD.CtrlList.Items[FIndex]) do
  1125.       begin
  1126.         Self.SkinRect := SkinRect;
  1127.         Self.ItemsRect := ItemsRect;
  1128.         Self.MenuBarItem := MenuBarItem;
  1129.         Self.CloseButton := CloseButton;
  1130.         Self.MaxButton := MaxButton;
  1131.         Self.MinButton := MinButton;
  1132.         Self.SysMenuButton := SysMenuButton;
  1133.         Self.TrackMarkColor := TrackMarkColor;
  1134.         Self.TrackMarkActiveColor := TrackMarkActiveColor;
  1135.         if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
  1136.         then
  1137.           Picture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
  1138.         else
  1139.           Picture := nil;
  1140.       end;
  1141. end;
  1142. procedure TspSkinMainMenuBar.WMSize;
  1143. begin
  1144.   inherited;
  1145.   CalcRects;
  1146. end;
  1147. procedure TspSkinMainMenuBar.CreateMenu;
  1148. var
  1149.   i, j: Integer;
  1150.   MMIData: TspDataSkinMainMenuBarItem;
  1151.   DS: TspDynamicSkinForm;
  1152.   ChildMainMenu: TMainMenu;
  1153. begin
  1154.   ClearObjects;
  1155.   if (DSF <> nil) and (DSF.FForm.FormStyle = fsMDIForm)
  1156.   then
  1157.     ChildMainMenu := GetChildMainMenu
  1158.   else
  1159.     ChildMainMenu := nil;
  1160.   if (FMainMenu = nil) then Exit;
  1161.   if (FSD = nil) or (FSD.Empty)
  1162.   then
  1163.     MMIData := nil
  1164.   else
  1165.     begin
  1166.       j := FSD.GetIndex(MenuBarItem);
  1167.       if j <> -1
  1168.       then MMIData := TspDataSkinMainMenuBarItem(FSD.ObjectList.Items[j])
  1169.       else MMIData := nil;
  1170.     end;
  1171.   for i := 0 to FMainMenu.Items.Count - 1 do
  1172.     if FMainMenu.Items[i].Visible
  1173.     then
  1174.       begin
  1175.         ObjectList.Add(TspSkinMainMenuBarItem.Create(Self, MMIData));
  1176.         with TspSkinMainMenuBarItem(ObjectList.Items[ObjectList.Count - 1]) do
  1177.         begin
  1178.           IDName := FMainMenu.Items[i].Name;
  1179.           Enabled := FMainMenu.Items[i].Enabled;
  1180.           MenuItem := FMainMenu.Items[i];
  1181.         end;
  1182.       end;
  1183.   ChildMenuIn := ChildMainMenu <> nil;
  1184.   if ChildMainMenu <> nil then
  1185.    for i := 0 to ChildMainMenu.Items.Count - 1 do
  1186.     if ChildMainMenu.Items[i].Visible
  1187.     then
  1188.       begin
  1189.         ObjectList.Add(TspSkinMainMenuBarItem.Create(Self, MMIData));
  1190.         with TspSkinMainMenuBarItem(ObjectList.Items[ObjectList.Count - 1]) do
  1191.         begin
  1192.           IDName := ChildMainMenu.Items[i].Name;
  1193.           Enabled := ChildMainMenu.Items[i].Enabled;
  1194.           MenuItem := ChildMainMenu.Items[i];
  1195.         end;
  1196.       end;
  1197.   if Self.FMDIChildMax
  1198.   then
  1199.     begin
  1200.       AddButtons;
  1201.       DS := GetMDIChildDynamicSkinFormComponent;
  1202.       if DS <> nil then CheckButtons(DS.BorderIcons);
  1203.     end;
  1204. end;
  1205. procedure TspSkinMainMenuBar.SetMainMenu;
  1206. begin
  1207.   FMainMenu := Value;
  1208.   CreateMenu;
  1209.   RePaint;
  1210. end;
  1211. procedure TspSkinMainMenuBar.UpDateItems;
  1212. begin
  1213.   CreateMenu;
  1214.   RePaint;
  1215. end;
  1216. procedure  TspSkinMainMenuBar.ClearObjects;
  1217. var
  1218.   i: Integer;
  1219. begin
  1220.   for i := 0 to ObjectList.Count - 1 do
  1221.     TspMenuBarObject(ObjectList.Items[i]).Free;
  1222.   ObjectList.Clear;
  1223.   ButtonsCount := 0;
  1224. end;
  1225. procedure TspSkinMainMenuBar.CMMouseEnter;
  1226. begin
  1227.   inherited;
  1228.   if (csDesigning in ComponentState) then Exit;
  1229.   if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
  1230.   MouseTimer.Enabled := True;
  1231. end;
  1232. procedure TspSkinMainMenuBar.CMMouseLeave;
  1233. begin
  1234.   inherited;
  1235.   if (csDesigning in ComponentState) then Exit;
  1236.   if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
  1237.   MouseTimer.Enabled := False;
  1238.   TestActive(-1, -1);
  1239. end;
  1240. procedure TspSkinMainMenuBar.MouseDown;
  1241. begin
  1242.   inherited;
  1243.   TestActive(X, Y);
  1244.   if (ActiveObject <> - 1)
  1245.   then
  1246.     with TspMenuBarObject(ObjectList.Items[ActiveObject]) do
  1247.     begin
  1248.       MouseCaptureObject := ActiveObject;
  1249.       MouseDown(X, Y, Button);
  1250.       if ssDouble in Shift then DblCLick;
  1251.     end
  1252.   else
  1253.     if Scroll and FScrollMenu
  1254.     then
  1255.       begin
  1256.         if PtInRect(GetMarkerRect, Point(X, Y)) then TrackScrollMenu;
  1257.       end;
  1258. end;
  1259. procedure TspSkinMainMenuBar.MouseUp;
  1260. begin
  1261.   if (MouseCaptureObject <> -1)
  1262.   then
  1263.     begin
  1264.       TspMenuBarObject(ObjectList.Items[MouseCaptureObject]).MouseUp(X, Y, Button);
  1265.       MouseCaptureObject := -1;
  1266.     end;
  1267.   inherited;
  1268. end;
  1269. procedure TspSkinMainMenuBar.MouseMove;
  1270. begin
  1271.   if not MouseTimer.Enabled
  1272.   then MouseTimer.Enabled := True;
  1273.   inherited;
  1274. end;
  1275. procedure TspSkinMainMenuBar.BeforeChangeSkinData;
  1276. begin
  1277.   FSkinSupport := False;
  1278.   inherited;
  1279.   ClearObjects;
  1280. end;
  1281. procedure TspSkinMainMenuBar.ChangeSkinData;
  1282. begin
  1283.   GetSkinData;
  1284.   FSkinSupport := FIndex <> -1;
  1285.   CreateMenu;
  1286.   if FSkinSupport
  1287.   then
  1288.     Height := RectHeight(SkinRect)
  1289.   else
  1290.     if FDefaultHeight > 0 then Height := FDefaultHeight;
  1291.   RePaint;
  1292. end;
  1293. procedure TspSkinMainMenuBar.TestActive;
  1294. var
  1295.   i: Integer;
  1296.   B: Boolean;
  1297. begin
  1298.   if ObjectList.Count = 0 then Exit;
  1299.   OldActiveObject := ActiveObject;
  1300.   i := -1;
  1301.   B := False;
  1302.   repeat
  1303.     Inc(i);
  1304.     with TspMenuBarObject(ObjectList.Items[i]) do
  1305.     begin
  1306.       if Enabled then B := PtInRect(ObjectRect, Point(X, Y));
  1307.     end;
  1308.   until B or (i = ObjectList.Count - 1);
  1309.   if not B and (OldActiveObject <> -1) and MenuActive and
  1310.      (TspMenuBarObject(ObjectList.Items[OldActiveObject]) is
  1311.       TspSkinMainMenuBarItem)
  1312.   then
  1313.     ActiveObject := OldActiveObject
  1314.   else
  1315.     if B then ActiveObject := i else ActiveObject := -1;
  1316.   if (MouseCaptureObject <> -1) and
  1317.      (ActiveObject <> MouseCaptureObject) and (ActiveObject <> -1)
  1318.   then
  1319.     ActiveObject := -1;
  1320.   if OldActiveObject >= ObjectList.Count then OldActiveObject := -1;
  1321.   if ActiveObject >= ObjectList.Count then ActiveObject := -1;
  1322.   if (OldActiveObject <> ActiveObject)
  1323.   then
  1324.     begin
  1325.       if OldActiveObject <> - 1
  1326.       then
  1327.         if TspMenuBarObject(ObjectList.Items[OldActiveObject]).Enabled
  1328.         then TspMenuBarObject(ObjectList.Items[OldActiveObject]).MouseLeave;
  1329.       if ActiveObject <> -1
  1330.       then
  1331.         if TspMenuBarObject(ObjectList.Items[ActiveObject]).Enabled
  1332.         then TspMenuBarObject(ObjectList.Items[ActiveObject]).MouseEnter;
  1333.     end;
  1334.   if Scroll and FScrollMenu
  1335.   then
  1336.     begin
  1337.       if PtInRect(GetMarkerRect, Point(X, Y)) and not MarkerActive
  1338.       then
  1339.         begin
  1340.           MarkerActive := True;
  1341.           DrawMarker(Canvas);
  1342.         end
  1343.       else
  1344.         if MarkerActive and not PtInRect(GetMarkerRect, Point(X, Y))
  1345.         then
  1346.           begin
  1347.             MarkerActive := False;
  1348.             DrawMarker(Canvas);
  1349.           end;  
  1350.     end;
  1351. end;
  1352. procedure TspSkinMainMenuBar.TestMouse;
  1353. var
  1354.   P: TPoint;
  1355. begin
  1356.   GetCursorPos(P);
  1357.   P := ScreenToClient(P);
  1358.   if (P.X >= 0) and (P.Y >= 0) and (P.X <= Width) and (P.Y <= Height)
  1359.   then
  1360.     TestActive(P.X, P.Y)
  1361.   else
  1362.     if MouseTimer.Enabled
  1363.     then
  1364.       begin
  1365.         MouseTimer.Enabled := False;
  1366.         TestActive(-1, -1);
  1367.       end;
  1368. end;
  1369. procedure TspSkinMainMenuBar.TestMorph;
  1370. var
  1371.   i: Integer;
  1372.   StopMorph: Boolean;
  1373. begin
  1374.   StopMorph := True;
  1375.   for i := 0 to ObjectList.Count  - 1 do
  1376.     with TspMenuBarObject(ObjectList.Items[i]) do
  1377.     begin
  1378.       if Morphing and CanMorphing
  1379.         then
  1380.           begin
  1381.             DoMorphing;
  1382.             StopMorph := False;
  1383.           end;
  1384.     end;
  1385.   if StopMorph
  1386.   then
  1387.   MorphTimer.Enabled := False;
  1388. end;
  1389. procedure TspSkinMainMenuBar.SetBounds;
  1390. begin
  1391.   GetSkinData;
  1392.   if FIndex <> -1 then AHeight := RectHeight(SkinRect);
  1393.   inherited;
  1394.   RePaint;
  1395. end;
  1396. procedure TspSkinMainMenuBar.PaintMenuBar(Cnvs: TCanvas);
  1397. var
  1398.   Buffer: TBitMap;
  1399.   R: TRect;
  1400.   i: Integer;
  1401. begin
  1402.   GetSkinData;
  1403.   Buffer := TBitMap.Create;
  1404.   R := Rect(0, 0, Width, Height);
  1405.   if FIndex <> -1
  1406.   then
  1407.     begin
  1408.       CreateHSkinImage(ItemsRect.Left, RectWidth(SkinRect) - ItemsRect.Right,
  1409.         Buffer, Picture, SkinRect, Width, Height);
  1410.     end
  1411.   else
  1412.     begin
  1413.       Buffer.Width := Width;
  1414.       Buffer.Height := Height;
  1415.       with Buffer.Canvas do
  1416.       begin
  1417.         Brush.Color := clBtnFace;
  1418.         FillRect(R);
  1419.       end;
  1420.     end;
  1421.   CalcRects;
  1422.   Scroll := False;
  1423.   for i := 0 to ObjectList.Count - 1 do
  1424.   with TspMenuBarObject(ObjectList.Items[i]) do
  1425.     begin
  1426.       if Visible then Draw(Buffer.Canvas);
  1427.     end;
  1428.   if Scroll and FScrollMenu then DrawMarker(Buffer.Canvas);
  1429.   Cnvs.Draw(0, 0, Buffer);
  1430.   Buffer.Free;
  1431. end;
  1432. procedure TspSkinMainMenuBar.Paint;
  1433. begin
  1434. end;
  1435. procedure TspSkinMainMenuBar.WMEraseBkgnd;
  1436. var
  1437.   Cnvs: TCanvas;
  1438. begin
  1439.   Cnvs := TCanvas.Create;
  1440.   Cnvs.Handle := TWMEraseBkgnd(Message).DC;
  1441.   PaintMenuBar(Cnvs);
  1442.   Cnvs.Free;
  1443.   Message.Result := 1;
  1444. end;
  1445. procedure TspSkinMainMenuBar.Notification(AComponent: TComponent;
  1446.                                           Operation: TOperation);
  1447. begin
  1448.   inherited Notification(AComponent, Operation);
  1449.   if (Operation = opRemove) and (AComponent = FMainMenu)
  1450.   then FMainMenu := nil;
  1451.     if (Operation = opRemove) and (AComponent = DSF)
  1452.   then DSF := nil;
  1453. end;
  1454. //============= TspDynamicSkinForm  =============//
  1455. type
  1456.   TParentForm = class(TForm);
  1457. constructor TspDynamicSkinForm.Create(AOwner: TComponent);
  1458. begin
  1459.   inherited Create(AOwner);
  1460.   FAlwaysShowInTray := False;
  1461.   FLogoBitMap := TBitMap.Create;
  1462.   FLogoBitMapTransparent := False;
  1463.   FAlwaysMinimizeToTray := False;
  1464.   FIcon := nil;
  1465.   FShowIcon := False;
  1466.   FSkinHint := nil;
  1467.   FMaximizeOnFullScreen := False;
  1468.   FSkinSupport := False;
  1469.   FShowObjectHint := False;
  1470.   FUseSkinCursors := False;
  1471.   FDefCaptionFont := TFont.Create;
  1472.   FDefInActiveCaptionFont := TFont.Create;
  1473.   with FDefCaptionFont do
  1474.   begin
  1475.     Name := 'Arial';
  1476.     Style := [fsBold];
  1477.     Height := 14;
  1478.     Color := clBtnText;
  1479.   end;
  1480.   with FDefInActiveCaptionFont do
  1481.   begin
  1482.     Name := 'Arial';
  1483.     Style := [fsBold];
  1484.     Height := 14;
  1485.     Color := clBtnShadow;
  1486.   end;
  1487.   InMenu := False;
  1488.   InMainMenu := False;
  1489.   RMTop := TBitMap.Create;
  1490.   RMLeft := TBitMap.Create;
  1491.   RMBottom := TBitMap.Create;
  1492.   RMRight := TBitMap.Create;
  1493.   BlackColor := RGB(0, 0, 0);
  1494.   ObjectList := TList.Create;
  1495.   AreaList := TList.Create;
  1496.   VisibleControls := TList.Create;
  1497.   FSD := nil;
  1498.   FMSD := nil;
  1499.   FMainMenu := nil;
  1500.   FSystemMenu := nil;
  1501.   FInChangeSkinData := False;
  1502.   MorphTimer := TTimer.Create(Self);
  1503.   MorphTimer.Enabled := False;
  1504.   MorphTimer.OnTimer := TestMorph;
  1505.   MorphTimer.Interval := MorphTimerInterval;
  1506.   MouseTimer := TTimer.Create(Self);
  1507.   MouseTimer.Enabled := False;
  1508.   MouseTimer.OnTimer := TestMouse;
  1509.   MouseTimer.Interval := MouseTimerInterval;
  1510.   AnimateTimer := TTimer.Create(Self);
  1511.   AnimateTimer.Enabled := False;
  1512.   AnimateTimer.OnTimer := TestAnimate;
  1513.   AnimateTimer.Interval := AnimateTimerInterval;
  1514.   OldBoundsRect := NulLRect;
  1515.   OldActiveObject := -1;
  1516.   ActiveObject := -1;
  1517.   MouseCaptureObject := -1;
  1518.   MouseIn := False;
  1519.   FMinWidth := 0;
  1520.   FMinHeight := 0;
  1521.   FRGN := 0;
  1522.   FClientInstance := nil;
  1523.   FPrevClientProc := nil;
  1524.   FForm := TForm(Owner);
  1525.   FForm.BorderIcons := [];
  1526.   FForm.OnShortCut := FormShortCut;
  1527.   FForm.AutoSize := False;
  1528.   FForm.AutoScroll := False;
  1529.   FSysMenu := TPopupMenu.Create(Self);
  1530.   FUseDefaultSysMenu := True;
  1531.   FSysTrayMenu := TspSkinPopupMenu.Create(Self);
  1532.   FSysTrayMenu.ComponentForm := FForm;
  1533.   CreateSysTrayMenu;
  1534.   SkinMenu := TspSkinMenu.CreateEx(Self, FForm);
  1535.   FMagneticSize := 10;
  1536.   FBorderIcons := [biSystemMenu, biMinimize, biMaximize, biRollUp];
  1537.   FAlphaBlend := False;
  1538.   FAlphaBlendAnimation := False;
  1539.   FAlphaBlendValue := 200;
  1540.   FMenusAlphaBlend := False;
  1541.   FMenusAlphaBlendValue := 200;
  1542.   FMenusAlphaBlendAnimation := False;
  1543.   FSupportNCArea := True;
  1544.   FSizeAble := True;
  1545.   FFullDrag := False;
  1546.   FSizeMove := False;
  1547.   FFormWidth := 0;
  1548.   FFormHeight := 0;
  1549.   FMainMenuBar := nil;
  1550.   FMDITabsBar := nil;
  1551.   FInShortCut := False;
  1552.   if not (csDesigning in ComponentState)
  1553.   then
  1554.     begin
  1555.       OldWindowProc := FForm.WindowProc;
  1556.       FForm.WindowProc := NewWndProc;
  1557.       TParentForm(FForm).ReCreateWnd;
  1558.       SetWindowLong(FForm.Handle, GWL_STYLE,
  1559.       GETWINDOWLONG(FForm.Handle, GWL_STYLE) and not WS_CAPTION);
  1560.     end;
  1561. end;
  1562. destructor TspDynamicSkinForm.Destroy;
  1563. var
  1564.   i: Integer;
  1565. begin
  1566.   if not (csDesigning in ComponentState) and (FForm <> nil)
  1567.   then
  1568.     FForm.WindowProc := OldWindowProc;
  1569.   FLogoBitMap.Free;
  1570.   FDefCaptionFont.Free;
  1571.   FDefInActiveCaptionFont.Free;
  1572.   FSysMenu.Free;
  1573.   FSysTrayMenu.Free;
  1574.   ClearObjects;
  1575.   MorphTimer.Free;
  1576.   AnimateTimer.Free;
  1577.   MouseTimer.Free;
  1578.   ObjectList.Free;
  1579.   AreaList.Free;
  1580.   VisibleControls.Free;
  1581.   SkinMenu.Free;
  1582.   RMTop.Free;
  1583.   RMLeft.Free;
  1584.   RMBottom.Free;
  1585.   RMRight.Free;
  1586.   if FRgn <> 0 then DeleteObject(FRgn);
  1587.   inherited Destroy;
  1588. end;
  1589. procedure  TspDynamicSkinForm.CheckMDIBar;
  1590. var
  1591.   DS: TspDynamicSkinForm;
  1592. begin
  1593.   DS := GetDynamicSkinFormComponent(Application.MainForm);
  1594.   if (DS <> nil) and (DS.MDITabsBar <> nil)
  1595.   then
  1596.     DS.MDITabsBar.CheckActive;
  1597. end;
  1598. procedure  TspDynamicSkinForm.CheckMDIMainMenu;
  1599. var
  1600.   DS: TspDynamicSkinForm;
  1601. begin
  1602.   DS := GetDynamicSkinFormComponent(Application.MainForm);
  1603.   if (DS <> nil) and (DS.MainMenuBar <> nil) and
  1604.      ((DS.MainMenuBar.GetChildMainMenu <> nil) or DS.MainMenuBar.ChildMenuIn)
  1605.   then
  1606.     DS.MainMenuBar.UpDateItems;
  1607. end;
  1608. procedure TspDynamicSkinForm.SetLogoBitMap;
  1609. begin
  1610.   FLogoBitMap.Assign(Value);
  1611. end;
  1612. procedure TspDynamicSkinForm.DrawLogoBitMap(C: TCanvas);
  1613. var
  1614.   X, Y: Integer;
  1615. begin
  1616.   X := FForm.ClientWidth div 2 - FLogoBitMap.Width div 2;
  1617.   Y := FForm.ClientHeight div 2 - FLogoBitMap.Height div 2;
  1618.   if X < 0 then X := 0;
  1619.   if Y < 0 then Y := 0;
  1620.   if FLogoBitMap.Transparent <> FLogoBitmapTransparent
  1621.   then
  1622.     FLogoBitmap.Transparent := FLogoBitmapTransparent;
  1623.   C.Draw(X, Y, FLogoBitMap);
  1624. end;
  1625. function TspDynamicSkinForm.GetUseSkinFontInMenu: Boolean;
  1626. begin
  1627.   Result := SkinMenu.UseSkinFont;
  1628. end;
  1629. procedure TspDynamicSkinForm.SetUseSkinFontInMenu(Value: Boolean);
  1630. begin
  1631.   SkinMenu.UseSkinFont := Value;
  1632. end;
  1633. procedure TspDynamicSkinForm.SetShowIcon(Value: Boolean);
  1634. begin
  1635.   FShowIcon := Value;
  1636.   if not (csDesigning in ComponentState) and
  1637.      not (csLoading in ComponentState)
  1638.   then
  1639.     SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);   
  1640. end;
  1641. procedure TspDynamicSkinForm.GetIcon;
  1642. var
  1643.   IH: HICON;
  1644.   IX, IY: Integer;
  1645.   B: Boolean;
  1646. begin
  1647.   if FIcon = nil
  1648.   then
  1649.     begin
  1650.       FIcon := TIcon.Create;
  1651.       B := False;
  1652.       IH := 0;
  1653.       if FForm.Icon.Handle <> 0
  1654.       then
  1655.         IH := FForm.Icon.Handle
  1656.       else
  1657.       if Application.Icon.Handle <> 0
  1658.       then
  1659.         IH := Application.Icon.Handle
  1660.       else
  1661.         begin
  1662.           IH := LoadIcon(0, IDI_APPLICATION);
  1663.           B := True;
  1664.         end;
  1665.       GetIconSize(IX, IY);
  1666.       FIcon.Handle := CopyImage(IH, IMAGE_ICON, IX, IY, LR_COPYFROMRESOURCE);
  1667.       if B then DestroyIcon(IH);
  1668.     end;
  1669. end;
  1670. procedure TspDynamicSkinForm.DrawFormIcon(Cnvs: TCanvas; X, Y: Integer);
  1671. begin
  1672.   GetIcon;
  1673.   if FIcon <> nil then
  1674.     DrawIconEx(Cnvs.Handle, X, Y, FIcon.Handle, 0, 0, 0, 0, DI_NORMAL);
  1675. end;
  1676. procedure TspDynamicSkinForm.GetIconSize(var X, Y: Integer);
  1677. begin
  1678.   X := GetSystemMetrics(SM_CXSMICON);
  1679.   if X = 0 then X := GetSystemMetrics(SM_CXSIZE);
  1680.   Y := GetSystemMetrics(SM_CYSMICON);
  1681.   if Y = 0 then Y := GetSystemMetrics(SM_CYSIZE);
  1682. end;
  1683. procedure TspDynamicSkinForm.MDIItemClick(Sender: TObject);
  1684. var
  1685.   I: Integer;
  1686.   S1, S2: String;
  1687.   MainBSF, ChildBSF: TspDynamicSkinForm;
  1688. begin
  1689.   MainBSF := GetDynamicSkinFormComponent(Application.MainForm);
  1690.   if MainBSF = nil then Exit;
  1691.   S1 := TMenuItem(Sender).Name;
  1692.   S2 := MI_CHILDITEM;
  1693.   Delete(S1, Pos(S2, S1), Length(S2));
  1694.   for I := 0 to MainBSF.FForm.MDIChildCount - 1 do
  1695.     if MainBSF.FForm.MDIChildren[I].Name = S1
  1696.     then
  1697.       begin
  1698.         ChildBSF := GetDynamicSkinFormComponent(MainBSF.FForm.MDIChildren[I]);
  1699.         if (ChildBSF <> nil) and (ChildBSF.WindowState = wsMinimized)
  1700.         then
  1701.           ChildBSF.WindowState := wsNormal;
  1702.         MainBSF.FForm.MDIChildren[I].Show;
  1703.       end;
  1704. end;
  1705. procedure TspDynamicSkinForm.UpDateChildCaptionInMenu(Child: TCustomForm);
  1706. var
  1707.   WM: TMenuItem;
  1708.   MainBSF: TspDynamicSkinForm;
  1709.   I: Integer;
  1710.   S1, S2: String;
  1711. begin
  1712.   MainBSF := DynamicSkinForm.GetDynamicSkinFormComponent(Application.MainForm);
  1713.   if MainBSF = nil then Exit;
  1714.   WM := MainBSF.FForm.WindowMenu;
  1715.   if WM = nil then Exit;
  1716.   for I := 0 to WM.Count - 1 do
  1717.   if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1718.   then
  1719.     begin
  1720.       S1 := WM.Items[I].Name;
  1721.       S2 := MI_CHILDITEM;
  1722.       Delete(S1, Pos(S2, S1), Length(S2));
  1723.       if Child.Name = S1
  1724.       then
  1725.         begin
  1726.           WM.Items[I].Caption := Child.Caption;
  1727.           Break;
  1728.         end;
  1729.     end;
  1730. end;
  1731. procedure TspDynamicSkinForm.UpDateChildActiveInMenu;
  1732. var
  1733.   WM: TMenuItem;
  1734.   MainBSF: TspDynamicSkinForm;
  1735.   I: Integer;
  1736.   S1, S2: String;
  1737. begin
  1738.   MainBSF := DynamicSkinForm.GetDynamicSkinFormComponent(Application.MainForm);
  1739.   if MainBSF = nil then Exit;
  1740.   WM := MainBSF.FForm.WindowMenu;
  1741.   if WM = nil then Exit;
  1742.   for I := 0 to WM.Count - 1 do
  1743.   if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1744.   then
  1745.     begin
  1746.       S1 := WM.Items[I].Name;
  1747.       S2 := MI_CHILDITEM;
  1748.       Delete(S1, Pos(S2, S1), Length(S2));
  1749.       if MainBSF.FForm.ActiveMDIChild.Name = S1
  1750.       then
  1751.         WM.Items[I].Checked := True
  1752.       else
  1753.         WM.Items[I].Checked := False;
  1754.     end;
  1755. end;
  1756. procedure TspDynamicSkinForm.AddChildToBar;
  1757. var
  1758.   MainBSF: TspDynamicSkinForm;
  1759. begin
  1760.   MainBSF := DynamicSkinForm.GetDynamicSkinFormComponent(Application.MainForm);
  1761.   if (MainBSF = nil) or (MainBSF.MDITabsBar = nil) then Exit;
  1762.   MainBSF.MDITabsBar.AddTab(Child);
  1763. end;
  1764. procedure TspDynamicSkinForm.RefreshMDIBarTab(Child: TCustomForm);
  1765. var
  1766.   MainBSF: TspDynamicSkinForm;
  1767.   I: Integer;
  1768. begin
  1769.   MainBSF := DynamicSkinForm.GetDynamicSkinFormComponent(Application.MainForm);
  1770.   if (MainBSF = nil) or (MainBSF.MDITabsBar = nil) then Exit;
  1771.   with MainBSF.MDITabsBar do
  1772.    for I := 0 to ObjectList.Count - 1 do
  1773.     if TspMDITab(ObjectList.Items[I]).Child = Child
  1774.     then
  1775.       TspMDITab(ObjectList.Items[I]).Draw(MainBSF.MDITabsBar.Canvas);
  1776. end;
  1777. procedure TspDynamicSkinForm.AddChildToMenu;
  1778. var
  1779.   WM: TMenuItem;
  1780.   NewItem: TMenuItem;
  1781.   MainBSF: TspDynamicSkinForm;
  1782. begin
  1783.   MainBSF := DynamicSkinForm.GetDynamicSkinFormComponent(Application.MainForm);
  1784.   if MainBSF = nil then Exit;
  1785.   WM := MainBSF.FForm.WindowMenu;
  1786.   if WM = nil then Exit;
  1787.   NewItem := TMenuItem.Create(Self);
  1788.   NewItem.Name := Child.Name + MI_CHILDITEM;
  1789.   NewItem.Caption := Child.Caption;
  1790.   NewItem.OnClick := MDIItemClick;
  1791.   WM.Add(NewItem);
  1792. end;
  1793. procedure TspDynamicSkinForm.DeleteChildFromBar;
  1794. var
  1795.   MainBSF: TspDynamicSkinForm;
  1796. begin
  1797.   MainBSF := DynamicSkinForm.GetDynamicSkinFormComponent(Application.MainForm);
  1798.   if (MainBSF = nil) or (MainBSF.MDITabsBar = nil) then Exit;
  1799.   MainBSF.MDITabsBar.DeleteTab(Child);
  1800. end;
  1801. procedure TspDynamicSkinForm.DeleteChildFromMenu;
  1802. var
  1803.   WM, MI: TMenuItem;
  1804.   MainBSF: TspDynamicSkinForm;
  1805.   I: Integer;
  1806.   S1, S2: String;
  1807. begin
  1808.   MainBSF := DynamicSkinForm.GetDynamicSkinFormComponent(Application.MainForm);
  1809.   if MainBSF = nil then Exit;
  1810.   WM := MainBSF.FForm.WindowMenu;
  1811.   if WM = nil then Exit;
  1812.   for I := 0 to WM.Count - 1 do
  1813.   if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1814.   then
  1815.     begin
  1816.       S1 := WM.Items[I].Name;
  1817.       S2 := MI_CHILDITEM;
  1818.       Delete(S1, Pos(S2, S1), Length(S2));
  1819.       if Child.Name = S1
  1820.       then
  1821.         begin
  1822.           MI := WM.Items[I];
  1823.           WM.Delete(I);
  1824.           MI.Free;
  1825.           Break;
  1826.         end;
  1827.     end;
  1828.   if MainBSF.FForm.MDIChildCount = 0
  1829.   then
  1830.     for I := 0 to WM.Count - 1 do
  1831.     if (Pos(MI_CHILDITEM, WM.Items[I].Name) <> 0)
  1832.     then
  1833.       begin
  1834.         MI := WM.Items[I];
  1835.         WM.Delete(I);
  1836.         MI.Free;
  1837.         Break;
  1838.       end;
  1839. end;
  1840. procedure TspDynamicSkinForm.SetAlphaBlend(Value: Boolean);
  1841. begin
  1842.   if FAlphaBlend <> Value
  1843.   then
  1844.     begin
  1845.       FAlphaBlend := Value;
  1846.       if ComponentState = []
  1847.       then
  1848.         begin
  1849.           if FAlphaBlend
  1850.           then
  1851.             begin
  1852.               SetWindowLong(FForm.Handle, GWL_EXSTYLE,
  1853.                             GetWindowLong(FForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  1854.               SetAlphaBlendTransparent(FForm.Handle, FAlphaBlendValue);
  1855.             end
  1856.            else
  1857.              SetWindowLong(FForm.Handle, GWL_EXSTYLE,
  1858.                            GetWindowLong(FForm.Handle, GWL_EXSTYLE) and not WS_EX_LAYERED);
  1859.         end;
  1860.     end;
  1861. end;
  1862. procedure TspDynamicSkinForm.SetAlphaBlendValue(Value: Byte);
  1863. begin
  1864.   if FAlphaBlendValue <> Value
  1865.   then
  1866.     begin
  1867.       FAlphaBlendValue := Value;
  1868.       if FAlphaBlend and (ComponentState = [])
  1869.       then
  1870.         SetAlphaBlendTransparent(FForm.Handle, FAlphaBlendValue);
  1871.     end;
  1872. end;
  1873. procedure TspDynamicSkinForm.SetMenusAlphaBlend(Value: Boolean);
  1874. begin
  1875.   FMenusAlphaBlend := Value;
  1876.   if SkinMenu <> nil then SkinMenu.AlphaBlend := Value;
  1877. end;
  1878. procedure TspDynamicSkinForm.SetMenusAlphaBlendAnimation(Value: Boolean);
  1879. begin
  1880.   FMenusAlphaBlendAnimation := Value;
  1881.   if SkinMenu <> nil then SkinMenu.AlphaBlendAnimation := Value;
  1882. end;
  1883. procedure TspDynamicSkinForm.SetMenusAlphaBlendValue(Value: Byte);
  1884. begin
  1885.   FMenusAlphaBlendValue := Value;
  1886.   if SkinMenu <> nil then SkinMenu.AlphaBlendValue := Value;
  1887. end;
  1888. procedure TspDynamicSkinForm.TrackSystemMenu(X, Y: Integer);
  1889. var
  1890.   MenuItem: TMenuItem;
  1891. begin
  1892.   MenuItem := GetSystemMenu;
  1893.   SkinMenuOpen;
  1894.   if MenusSkinData = nil
  1895.   then
  1896.     SkinMenu.Popup(nil, SkinData, 0, Rect(X, Y, X, Y), MenuItem, False)
  1897.   else
  1898.     SkinMenu.Popup(nil, MenusSkinData, 0, Rect(X, Y, X, Y), MenuItem, False);
  1899. end;
  1900. function TspDynamicSkinForm.GetAutoRenderingInActiveImage: Boolean;
  1901. begin
  1902.   if (FSD <> nil) and not (FSD.Empty)
  1903.   then Result := FSD.AutoRenderingInActiveImage
  1904.   else Result := False;
  1905. end;
  1906. procedure TspDynamicSkinForm.UpDateActiveObjects;
  1907. var
  1908.   i: Integer;
  1909. begin
  1910.   if ObjectList <> nil
  1911.   then
  1912.   for i := 0 to ObjectList.Count  - 1 do
  1913.     if TspActiveSkinObject(ObjectList.Items[i]) is TspSkinAnimateObject
  1914.     then
  1915.       begin
  1916.         with TspSkinAnimateObject(ObjectList.Items[i]) do
  1917.         begin
  1918.           FMouseIn := False;
  1919.           Active := False;
  1920.           FFrame := 1;
  1921.         end;
  1922.       end
  1923.     else  
  1924.     if not (TspActiveSkinObject(ObjectList.Items[i]) is TspSkinCaptionObject)
  1925.     then
  1926.       with TspActiveSkinObject(ObjectList.Items[i]) do
  1927.       begin
  1928.         Active := False;
  1929.         FMouseIn := False;
  1930.         FMorphkf := 0;
  1931.       end;
  1932. end;
  1933. function TspDynamicSkinForm.GetDefCaptionHeight: Integer;
  1934. begin
  1935.   if (FForm.BorderStyle = bsToolWindow) or
  1936.      (FForm.BorderStyle = bsSizeToolWin)
  1937.   then
  1938.     Result := DEFTOOLCAPTIONHEIGHT
  1939.   else
  1940.     Result := DEFCAPTIONHEIGHT;
  1941. end;
  1942. function TspDynamicSkinForm.GetDefButtonSize: Integer;
  1943. begin
  1944.   if (FForm.BorderStyle = bsToolWindow) or
  1945.      (FForm.BorderStyle = bsSizeToolWin)
  1946.   then
  1947.     Result := DEFTOOLBUTTONSIZE
  1948.   else
  1949.     Result := DEFBUTTONSIZE;
  1950. end;
  1951. function TspDynamicSkinForm.GetDefCaptionRect: TRect;
  1952. begin
  1953.   CalcDefRects;
  1954.   Result :=  NewDefCaptionRect;
  1955. end;
  1956. procedure TspDynamicSkinForm.ArangeMinimizedChilds;
  1957. var
  1958.   I: Integer;
  1959.   DS: TspDynamicSkinForm;
  1960.   P: TPoint;
  1961. begin
  1962.   for i := 0 to FForm.MDIChildCount - 1 do
  1963.   begin
  1964.     DS := GetDynamicSkinFormComponent(FForm.MDIChildren[i]);
  1965.     if DS <> nil
  1966.     then
  1967.       begin
  1968.         if DS.WindowState = wsMinimized
  1969.         then
  1970.           begin
  1971.             P := DS.GetMinimizeCoord;
  1972.             FForm.MDIChildren[i].Left := P.X;
  1973.             FForm.MDIChildren[i].Top := P.Y;
  1974.           end;
  1975.       end;
  1976.   end;
  1977. end;
  1978. procedure TspDynamicSkinForm.SetDefaultMenuItemHeight(Value: Integer);
  1979. begin
  1980.   if Value > 0 then
  1981.     SkinMenu.DefaultMenuItemHeight := Value;
  1982. end;
  1983. function TspDynamicSkinForm.GetDefaultMenuItemHeight: Integer;
  1984. begin
  1985.   Result := SkinMenu.DefaultMenuItemHeight;
  1986. end;
  1987. procedure TspDynamicSkinForm.SetDefaultMenuItemFont(Value: TFont);
  1988. begin
  1989.   SkinMenu.DefaultMenuItemFont.Assign(Value);
  1990. end;
  1991. function TspDynamicSkinForm.GetDefaultMenuItemFont: TFont;
  1992. begin
  1993.   Result := SkinMenu.DefaultMenuItemFont;
  1994. end;
  1995. procedure TspDynamicSkinForm.SetBorderIcons;
  1996. begin
  1997.   FBorderIcons := Value;
  1998.   if FSupportNCArea or FSkinSupport
  1999.   then
  2000.     begin
  2001.       LoadDefObjects;
  2002.       CheckObjects;
  2003.     end;
  2004. end;
  2005. procedure TspDynamicSkinForm.SetDefCaptionFont;
  2006. begin
  2007.   FDefCaptionFont.Assign(Value);
  2008.   if not (csDesigning in ComponentState) and
  2009.      not (csLoading in ComponentState) and not FSkinSupport
  2010.   then SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  2011. end;
  2012. procedure TspDynamicSkinForm.SetDefInActiveCaptionFont;
  2013. begin
  2014.   FDefInActiveCaptionFont.Assign(Value);
  2015.   if not (csDesigning in ComponentState) and
  2016.      not (csLoading in ComponentState) and not FSkinSupport
  2017.   then SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  2018. end;
  2019. procedure TspDynamicSkinForm.CorrectCaptionText;
  2020. var
  2021.   j: Integer;
  2022. begin
  2023.   j := Length(S);
  2024.   with C do
  2025.   begin
  2026.     if TextWidth(S) > w
  2027.     then
  2028.       begin
  2029.         repeat
  2030.           Delete(S, j, 1);
  2031.           Dec(j);
  2032.         until (TextWidth(S + '...') <= w) or (S = '');
  2033.         S := S + '...';
  2034.       end;
  2035.   end;
  2036. end;
  2037. procedure TspDynamicSkinForm.CalcDefRects;
  2038. var
  2039.   i: Integer;
  2040.   BSize: Integer;
  2041.   OffsetX, OffsetY: Integer;
  2042.   Button: TspSkinStdButtonObject;
  2043. procedure SetStdButtonRect(B: TspSkinStdButtonObject);
  2044. begin
  2045.   if B <> nil
  2046.   then
  2047.     with B do
  2048.     begin
  2049.       ObjectRect := Rect(OffsetX - BSize, OffsetY, OffsetX, OffsetY + BSize);
  2050.       OffsetX := OffsetX - BSize;
  2051.     end;
  2052. end;
  2053. procedure SetStdButtonRect2(B: TspSkinStdButtonObject);
  2054. var
  2055.   IX, IY: Integer;
  2056. begin
  2057.   if B <> nil
  2058.   then
  2059.     with B do
  2060.     begin
  2061.       if (Command = cmSysMenu) and Parent.ShowIcon
  2062.       then
  2063.         begin
  2064.           GetIconSize(IX, IY);
  2065.           ObjectRect := Rect(OffsetX, OffsetY, OffsetX + IX, OffsetY + IY);
  2066.           OffsetX := OffsetX + IX;
  2067.         end
  2068.       else
  2069.         begin
  2070.           ObjectRect := Rect(OffsetX, OffsetY, OffsetX + BSize, OffsetY + BSize);
  2071.           OffsetX := OffsetX + BSize;
  2072.         end;
  2073.     end;
  2074. end;
  2075. function GetStdButton(C: TStdCommand): TspSkinStdButtonObject;
  2076. var
  2077.   I: Integer;
  2078. begin
  2079.   Result := nil;
  2080.   for I := 0 to ObjectList.Count - 1 do
  2081.     if TspActiveSkinObject(ObjectList.Items[I]) is TspSkinStdButtonObject
  2082.     then
  2083.       with TspSkinStdButtonObject(ObjectList.Items[I]) do
  2084.         if Visible and SkinRectInAPicture and (Command = C)
  2085.         then
  2086.           begin
  2087.             Result := TspSkinStdButtonObject(ObjectList.Items[I]);
  2088.             Break;
  2089.           end;
  2090. end;
  2091. begin
  2092.   if (ObjectList = nil) or (ObjectList.Count = 0) then Exit;
  2093.   i := 0;
  2094.   OffsetX := FFormWidth - 3;
  2095.   OffsetY := 4;
  2096.   NewDefCaptionRect := Rect(3, 3, OffsetX, GetDefCaptionHeight);
  2097.   BSize := GetDefButtonSize;
  2098.   Button := GetStdButton(cmClose);
  2099.   SetStdButtonRect(Button);
  2100.   Button := GetStdButton(cmMaximize);
  2101.   SetStdButtonRect(Button);
  2102.   Button := GetStdButton(cmMinimize);
  2103.   SetStdButtonRect(Button);
  2104.   Button := GetStdButton(cmRollUp);
  2105.   SetStdButtonRect(Button);
  2106.   NewDefCaptionRect.Right := OffsetX;
  2107.   OffsetX := NewDefCaptionRect.Left;
  2108.   Button := GetStdButton(cmSysMenu);
  2109.   if Button <> nil
  2110.   then
  2111.     begin
  2112.       SetStdButtonRect2(Button);
  2113.       NewDefCaptionRect.Left := OffsetX;
  2114.     end;
  2115. end;
  2116. procedure TspDynamicSkinForm.PaintNCDefault;
  2117. var
  2118.   PaintRect, R: TRect;
  2119.   CB: TBitMap;
  2120.   i: Integer;
  2121.   TX, TY: Integer;
  2122.   C: TColor;
  2123.   LeftOffset, RightOffset: Integer;
  2124.   S: String;
  2125.   DC: HDC;
  2126.   Cnvs: TControlCanvas;
  2127.   F: TForm;
  2128.   FA: Boolean;
  2129. begin
  2130.   if FFormWidth = 0 then FFormWidth := FForm.Width;
  2131.   if FFormHeight = 0 then FFormHeight := FForm.Height;
  2132.   if (ObjectList.Count = 0) and not FSkinSupport then LoadDefObjects;
  2133.   CalcDefRects;
  2134.   DC := GetWindowDC(FForm.Handle);
  2135.   Cnvs := TControlCanvas.Create;
  2136.   Cnvs.Handle := DC;
  2137.   CB := TBitMap.Create;
  2138.   CB.Width := FFormWidth - 6;
  2139.   CB.Height := GetDefCaptionHeight;
  2140.   LeftOffset := NewDefCaptionRect.Left - 3;
  2141.   RightOffset := CB.Width - NewDefCaptionRect.Right;
  2142.   // create caption
  2143.   with CB.Canvas do
  2144.   begin
  2145.     Brush.Color := clBtnFace;
  2146.     FillRect(Rect(0, 0, CB.Width, CB.Height));
  2147.     C := clBtnShadow;
  2148.     for i := 2 to GetDefCaptionHeight - 4 do
  2149.     begin
  2150.       if C = clBtnShadow then C := clBtnHighLight else C := clBtnShadow;
  2151.       Pen.Color := C;
  2152.       MoveTo(LeftOffset + 2, i); LineTo(CB.Width - RightOffset - 6, i);
  2153.     end;
  2154.     FA := GetFormActive;
  2155.     if FA
  2156.     then
  2157.       begin
  2158.         CB.Canvas.Font.Assign(FDefCaptionFont);
  2159.         Font := DefCaptionFont;
  2160.       end
  2161.     else
  2162.       begin
  2163.         CB.Canvas.Font.Assign(FDefInActiveCaptionFont);
  2164.         Font := DefInActiveCaptionFont;
  2165.       end;
  2166.     // paint caption text
  2167.     S := FForm.Caption;
  2168.     if (FForm.FormStyle = fsMDIForm) and FMDIChildMaximized
  2169.     then
  2170.       begin
  2171.         F := GetMaximizeMDIChild;
  2172.         if F <> nil
  2173.         then
  2174.           S := S + ' - [' + F.Caption + ']';
  2175.       end;
  2176.     if S <> ''
  2177.     then
  2178.       begin
  2179.         CorrectCaptionText(CB.Canvas, S, CB.Width - LeftOffset - RightOffset);
  2180.         TX := LeftOffset + (CB.Width - LeftOffset - RightOffset) div 2 -
  2181.                           (TextWidth(S) + 5) div 2;
  2182.         TY := GetDefCaptionHeight div 2 - TextHeight(S) div 2;
  2183.         R := Rect(TX, 0, TX + TextWidth(S) + 5, CB.Height);
  2184.         TextRect(R, TX + 3, TY, S);
  2185.      end;
  2186.   end;
  2187.   if (ObjectList <> nil) and (ObjectList.Count > 0)
  2188.   then
  2189.     begin
  2190.       for i := 0 to ObjectList.Count - 1 do
  2191.       with TspActiveSkinObject(ObjectList.Items[i]) do
  2192.       if Visible then 
  2193.       begin
  2194.         OffsetRect(ObjectRect, -3, -3);
  2195.         Draw(CB.Canvas, True);
  2196.         OffsetRect(ObjectRect, 3, 3);
  2197.       end;
  2198.     end;
  2199.   //paint border + caption
  2200.   with Cnvs do
  2201.   begin
  2202.     ExcludeClipRect(Cnvs.Handle, 3, GetDefCaptionHeight + 3, FFormWidth - 3, FFormHeight - 3);
  2203.     PaintRect := Rect(0, 0, FFormWidth, FFormHeight);
  2204.     Draw(3, 3, CB);
  2205.     Frame3D(Cnvs, PaintRect, cl3DLight, cl3DDKShadow, 1);
  2206.     Frame3D(Cnvs, PaintRect, clBtnHighLight, clBtnShadow, 1);
  2207.     Frame3D(Cnvs, PaintRect, clBtnFace, clBtnFace, 1);
  2208.     CB.Free;
  2209.   end;
  2210.   Cnvs.Free;
  2211.   ReleaseDC(FForm.Handle, DC);
  2212. end;
  2213. procedure TspDynamicSkinForm.PaintBGDefault;
  2214. var
  2215.   C: TCanvas;
  2216. begin
  2217.   C := TCanvas.Create;
  2218.   C.Handle := DC;
  2219.   with C do
  2220.   begin
  2221.     Brush.Color := clBtnFace;
  2222.     FillRect(FForm.ClientRect);
  2223.     if not FLogoBitMap.Empty then DrawLogoBitMap(C);
  2224.   end;
  2225.   C.Free;
  2226. end;
  2227. procedure TspDynamicSkinForm.PaintMDIBGDefault(DC: HDC);
  2228. var
  2229.   C: TCanvas;
  2230. begin
  2231.   C := TCanvas.Create;
  2232.   C.Handle := DC;
  2233.   with C do
  2234.   begin
  2235.     Brush.Color := clAppWorkSpace;
  2236.     FillRect(FForm.ClientRect);
  2237.     if not FLogoBitMap.Empty then DrawLogoBitMap(C);
  2238.   end;
  2239.   C.Free;
  2240. end;
  2241. procedure TspDynamicSkinForm.HookApp;
  2242. begin
  2243.   OldAppMessage := Application.OnMessage;
  2244.   Application.OnMessage := NewAppMessage;
  2245. end;
  2246. procedure TspDynamicSkinForm.UnHookApp;
  2247. begin
  2248.   Application.OnMessage := OldAppMessage;
  2249. end;
  2250. function TspDynamicSkinForm.GetMaximizeMDIChild: TForm;
  2251. var
  2252.   i: Integer;
  2253.   DS: TspDynamicSkinForm;
  2254. begin
  2255.   Result := nil;
  2256.   DS := nil;
  2257.   if Application.MainForm.ActiveMDIChild <> nil
  2258.   then
  2259.     DS := GetDynamicSkinFormComponent(Application.MainForm.ActiveMDIChild);
  2260.   if (DS <> nil) and (DS.WindowState = wsMaximized)
  2261.   then
  2262.     Result := Application.MainForm.ActiveMDIChild
  2263.   else
  2264.   for i := 0 to Application.MainForm.MDIChildCount - 1 do
  2265.   begin
  2266.     DS := GetDynamicSkinFormComponent(Application.MainForm.MDIChildren[i]);
  2267.     if (DS <> nil) and (DS.WindowState = wsMaximized)
  2268.     then
  2269.       begin
  2270.         Result := Application.MainForm.MDIChildren[i];
  2271.         Break;
  2272.       end;
  2273.   end;
  2274. end;
  2275. function TspDynamicSkinForm.IsMDIChildMaximized;
  2276. begin
  2277.   Result := FMDIChildMaximized;
  2278. end;
  2279. procedure TspDynamicSkinForm.Tile;
  2280. var
  2281.   ColumnCount: Integer;
  2282.   FInColumnCount: Integer;
  2283.   R: TRect;
  2284.   W, H: Integer;
  2285.   i, j, X, Y, FW, FH, L, T: Integer;
  2286. begin
  2287.   if FForm.FormStyle <> fsMDIForm then Exit;
  2288.   RestoreAll;
  2289.   ColumnCount := Trunc(Sqrt(FForm.MDIChildCount));
  2290.   if ColumnCount <= 0 then Exit;
  2291.   FInColumnCount := FForm.MDIChildCount div ColumnCount;
  2292.   if FInColumnCount * ColumnCount < FForm.MDIChildCount
  2293.   then Inc(FInColumnCount, 1);
  2294.   R := GetMDIWorkArea;
  2295.   W := RectWidth(R);
  2296.   H := RectHeight(R);
  2297.   FW := W div ColumnCount;
  2298.   FH := H div FInColumnCount;
  2299.   X := W;
  2300.   Y := H;
  2301.   j := ColumnCount;
  2302.   for i := FForm.MDIChildCount downto 1 do
  2303.   begin
  2304.     L := X - FW;
  2305.     T := Y - FH;
  2306.     if L < 0 then L := 0;
  2307.     if T < 0 then T := 0;
  2308.     FForm.MDIChildren[i - 1].SetBounds(L, T, FW, FH);
  2309.     Y := Y - FH;
  2310.     if (Y - FH < 0) and (i <> 0)
  2311.     then
  2312.       begin
  2313.         Y := H;
  2314.         X := X - FW;
  2315.         Dec(j);
  2316.         if j = 0 then j := 1;
  2317.         FInColumnCount := (i - 1) div j;
  2318.         if FInColumnCount * j < (i - 1)
  2319.         then Inc(FInColumnCount, 1);
  2320.         if FInColumnCount = 0
  2321.         then FInColumnCount := 1;
  2322.         FH := H div FInColumnCount;
  2323.       end;
  2324.   end;
  2325. end;
  2326. procedure TspDynamicSkinForm.Cascade;
  2327. var
  2328.   i, j, k, FW, FH, FW1, FH1, W, H, Offset1, Offset2: Integer;
  2329.   R: TRect;
  2330. begin
  2331.   if FForm.FormStyle <> fsMDIForm then Exit;
  2332.   RestoreAll;
  2333.   R := GetMDIWorkArea;
  2334.   W := RectWidth(R);
  2335.   H := RectHeight(R);
  2336.   if FSkinSupport
  2337.   then
  2338.     Offset1 := NewClRect.Top
  2339.   else
  2340.     Offset1 := GetDefCaptionHeight + 3;
  2341.   Offset2 := W - Round(W * 0.8);
  2342.   j := Offset2 div Offset1;
  2343.   if FForm.MDIChildCount < j
  2344.   then
  2345.     begin
  2346.       FW := W - (FForm.MDIChildCount - 1) * Offset1;
  2347.       FH := H - (FForm.MDIChildCount - 1) * Offset1;
  2348.     end
  2349.   else
  2350.    begin
  2351.      FW := W - j * Offset1;
  2352.      FH := H - j * Offset1;
  2353.    end;
  2354.   if FW < GetMinWidth then  FW := GetMinWidth;
  2355.   if FH < GetMinHeight then FH := GetMinHeight;
  2356.   k := 0;
  2357.   for i := FForm.MDIChildCount - 1 downto 0 do
  2358.   begin
  2359.     FW1 := FW;
  2360.     FH1 := FH;
  2361.     if (FForm.MDIChildren[i].BorderStyle = bsSingle)
  2362.     then
  2363.       begin
  2364.         FW1 := FForm.MDIChildren[i].Width;
  2365.         FH1 := FForm.MDIChildren[i].Height;
  2366.       end;
  2367.     if (k + FW1 > W) or (k + FH1 > H) then k := 0;
  2368.     FForm.MDIChildren[i].SetBounds(k, k, FW1, FH1);
  2369.     k := k + Offset1;
  2370.   end;
  2371. end;
  2372. procedure TspDynamicSkinForm.MinimizeAll;
  2373. var
  2374.   i: Integer;
  2375.   DS: TspDynamicSkinForm;
  2376. begin
  2377.   if FForm.FormStyle <> fsMDIForm then Exit;
  2378.   for i := 0 to FForm.MDIChildCount - 1 do
  2379.   begin
  2380.     DS := GetDynamicSkinFormComponent(FForm.MDIChildren[i]);
  2381.     if DS <> nil then DS.WindowState := wsMinimized;
  2382.   end;
  2383. end;
  2384. procedure TspDynamicSkinForm.MaximizeAll;
  2385. var
  2386.   i: Integer;
  2387.   DS: TspDynamicSkinForm;
  2388. begin
  2389.   if FForm.FormStyle <> fsMDIForm then Exit;
  2390.   for i := 0 to FForm.MDIChildCount - 1 do
  2391.   begin
  2392.     DS := GetDynamicSkinFormComponent(FForm.MDIChildren[i]);
  2393.     if DS <> nil then DS.WindowState := wsMaximized;
  2394.   end;
  2395. end;
  2396. procedure TspDynamicSkinForm.CloseAll;
  2397. var
  2398.   i: Integer;
  2399. begin
  2400.   if FForm.FormStyle = fsMDIForm
  2401.   then
  2402.     for i := FForm.MDIChildCount - 1 downto 0 do
  2403.       FForm.MDIChildren[i].Close;
  2404. end;
  2405. procedure TspDynamicSkinForm.RestoreAll;
  2406. var
  2407.   i: Integer;
  2408.   DS: TspDynamicSkinForm;
  2409. begin
  2410.   if FForm.FormStyle <> fsMDIForm then Exit;
  2411.   for i := 0 to FForm.MDIChildCount - 1 do
  2412.   begin
  2413.     DS := GetDynamicSkinFormComponent(FForm.MDIChildren[i]);
  2414.     if (DS <> nil) and (DS.WindowState <> wsNormal) then DS.WindowState := wsNormal;
  2415.     if DS.RollUpState and (DS.WindowState = wsNormal) then DS.RollUpState := False;
  2416.   end;
  2417. end;
  2418. procedure TspDynamicSkinForm.ResizeMDIChilds;
  2419. var
  2420.   i: Integer;
  2421. begin
  2422.   for i := 0 to FForm.MDIChildCount - 1 do
  2423.     SendMessage(FForm.MDIChildren[i].Handle, WM_MDICHANGESIZE, 0, 0);
  2424.   ArangeMinimizedChilds;
  2425. end;
  2426. function TspDynamicSkinForm.GetMDIWorkArea;
  2427. function GetTop: Integer;
  2428. var
  2429.   i, j: Integer;
  2430. begin
  2431.   with Application.MainForm do
  2432.   begin
  2433.     j := 0;
  2434.     for i := 0 to ControlCount - 1 do
  2435.       if Controls[i].Visible and (Controls[i].Align = alTop) and
  2436.          (Controls[i].Top + Controls[i].Height > j)
  2437.       then
  2438.         j := Controls[i].Top + Controls[i].Height;
  2439.   end;
  2440.   Result := j;
  2441. end;
  2442. function GetBottom: Integer;
  2443. var
  2444.   i, j: Integer;
  2445. begin
  2446.   with Application.MainForm do
  2447.   begin
  2448.     j := ClientHeight;
  2449.     for i := 0 to ControlCount - 1 do
  2450.       if Controls[i].Visible and (Controls[i].Align = alBottom) and
  2451.          (Controls[i].Top < j)
  2452.       then
  2453.         j := Controls[i].Top;
  2454.   end;
  2455.   Result := j;
  2456. end;
  2457. function GetLeft: Integer;
  2458. var
  2459.   i, j: Integer;
  2460. begin
  2461.   with Application.MainForm do
  2462.   begin
  2463.     j := 0;
  2464.     for i := 0 to ControlCount - 1 do
  2465.       if Controls[i].Visible and (Controls[i].Align = alLeft) and
  2466.          (Controls[i].Left + Controls[i].Width > j)
  2467.       then
  2468.         j := Controls[i].Left + Controls[i].Width;
  2469.   end;
  2470.   Result := j;
  2471. end;
  2472. function GetRight: Integer;
  2473. var
  2474.   i, j: Integer;
  2475. begin
  2476.   with Application.MainForm do
  2477.   begin
  2478.     j := ClientWidth;
  2479.     for i := 0 to ControlCount - 1 do
  2480.       if Controls[i].Visible and (Controls[i].Align = alRight) and
  2481.          (Controls[i].Left < j)
  2482.       then
  2483.         j := Controls[i].Left;
  2484.   end;
  2485.   Result := j;
  2486. end;
  2487. begin
  2488.   if Application.MainForm <> nil then
  2489.   Result := Rect(GetLeft, GetTop, GetRight, GetBottom);
  2490. end;
  2491. procedure TspDynamicSkinForm.TrayIconDBLCLK;
  2492. begin
  2493.   RestoreFromTray;
  2494. end;
  2495. procedure TspDynamicSkinForm.MinimizeToTray;
  2496. begin
  2497.   if FTrayIcon <> nil
  2498.   then
  2499.     with FTrayIcon do
  2500.     begin
  2501.       FTrayIcon.MinimizeToTray := True;
  2502.       Application.Minimize;
  2503.       if Assigned(FOnMinimizeToTray) then FOnMinimizeToTray(Self);
  2504.     end;
  2505. end;
  2506. procedure TspDynamicSkinForm.RestoreFromTray;
  2507. begin
  2508.   if FTrayIcon <> nil
  2509.   then
  2510.     with FTrayIcon do
  2511.     begin
  2512.       FTrayIcon.MinimizeToTray := False;
  2513.       FTrayIcon.ShowMainForm;
  2514.       Application.Restore;
  2515.       if not FAlwaysShowInTray then FTrayIcon.IconVisible := False;
  2516.       if Assigned(FOnRestoreFromTray) then FOnRestoreFromTray(Self);
  2517.     end;
  2518. end;
  2519. procedure TspDynamicSkinForm.SetTrayIcon;
  2520. begin
  2521.   FTrayIcon := Value;
  2522.   if TrayIcon <> nil
  2523.   then
  2524.     with TrayIcon do
  2525.     begin
  2526.       if not FAlwaysShowInTray then IconVisible := False;
  2527.       if (csDesigning in ComponentState) and not
  2528.          (csLoading in ComponentState)
  2529.       then
  2530.         Self.BorderIcons := Self.BorderIcons + [biMinimizeToTray];
  2531.       if not (csDesigning in ComponentState)
  2532.       then
  2533.         begin
  2534.           if PopupMenu = nil
  2535.           then
  2536.             begin
  2537.               PopupMenu := FSysTrayMenu;
  2538.               OnDblClick := TrayIconDBLCLK;
  2539.             end;
  2540.         end;
  2541.     end
  2542.   else
  2543.     if (csDesigning in ComponentState) and not
  2544.          (csLoading in ComponentState)
  2545.     then
  2546.       Self.BorderIcons := Self.BorderIcons - [biMinimizeToTray];
  2547. end;
  2548. procedure TspDynamicSkinForm.TSM_Restore(Sender: TObject);
  2549. begin
  2550.   RestoreFromTray;
  2551. end;
  2552. procedure TspDynamicSkinForm.TSM_Close(Sender: TObject);
  2553. begin
  2554.   FForm.Close;
  2555. end;
  2556. procedure TspDynamicSkinForm.SM_Restore(Sender: TObject);
  2557. begin
  2558.   if MaxRollUpState or (FRollUpState and (WindowState = wsNormal))
  2559.   then
  2560.     RollUpState := False
  2561.   else
  2562.     WindowState := wsNormal;
  2563. end;
  2564. procedure TspDynamicSkinForm.SM_Max(Sender: TObject);
  2565. begin
  2566.   WindowState := wsMaximized;
  2567. end;
  2568. procedure TspDynamicSkinForm.SM_Min(Sender: TObject);
  2569. begin
  2570.   if FAlwaysMinimizeToTray
  2571.   then
  2572.     MinimizeToTray
  2573.   else
  2574.     WindowState := wsMinimized;
  2575. end;
  2576. procedure TspDynamicSkinForm.SM_RollUp(Sender: TObject);
  2577. begin
  2578.   RollUpState := True;
  2579. end;
  2580. procedure TspDynamicSkinForm.SM_Close(Sender: TObject);
  2581. begin
  2582.   FForm.Close;
  2583. end;
  2584. procedure TspDynamicSkinForm.SM_MinToTray(Sender: TObject);
  2585. begin
  2586.   MinimizeToTray;
  2587. end;
  2588. procedure TspDynamicSkinForm.CreateUserSysMenu;
  2589. procedure AddMaxItem;
  2590. var
  2591.   MI: TMenuItem;
  2592. begin
  2593.   if not (biMaximize in FBorderIcons) then Exit;
  2594.   MI := TMenuItem.Create(Self);
  2595.   with MI do
  2596.   begin
  2597.     Name := MI_MAXName;
  2598.     Caption := SP_MI_MAXCAPTION;
  2599.     OnClick := SM_Max;
  2600.   end;
  2601.   FSystemMenu.Items.Insert(0, MI);
  2602. end;
  2603. procedure AddMinItem;
  2604. var
  2605.   MI: TMenuItem;
  2606. begin
  2607.   if not (biMinimize in FBorderIcons) then Exit;
  2608.   MI := TMenuItem.Create(Self);
  2609.   with MI do
  2610.   begin
  2611.     Name := MI_MINName;
  2612.     Caption := SP_MI_MINCAPTION;
  2613.     OnClick := SM_Min;
  2614.   end;
  2615.   FSystemMenu.Items.Insert(0, MI);
  2616. end;
  2617. procedure AddRestoreItem;
  2618. var
  2619.   MI: TMenuItem;
  2620. begin
  2621.   MI := TMenuItem.Create(Self);
  2622.   with MI do
  2623.   begin
  2624.     Name := MI_RESTOREName;
  2625.     Caption := SP_MI_RESTORECAPTION;
  2626.     OnClick := SM_Restore;
  2627.   end;
  2628.   FSystemMenu.Items.Insert(0, MI);
  2629. end;
  2630. procedure AddRollUpItem;
  2631. var
  2632.   MI: TMenuItem;
  2633. begin
  2634.   if not (biRollUp in FBorderIcons) then Exit;
  2635.   MI := TMenuItem.Create(Self);
  2636.   with MI do
  2637.   begin
  2638.     Name := MI_ROLLUPName;
  2639.     Caption := SP_MI_ROLLUPCAPTION;
  2640.     OnClick := SM_RollUp;
  2641.   end;
  2642.   FSystemMenu.Items.Insert(0, MI);
  2643. end;
  2644. procedure AddCloseItem;
  2645. var
  2646.   MI: TMenuItem;
  2647. begin
  2648.   MI := TMenuItem.Create(Self);
  2649.   with MI do
  2650.   begin
  2651.     Name := MI_CLOSEName;
  2652.     Caption := SP_MI_CLOSECAPTION;
  2653.     OnClick := SM_Close;
  2654.     if FForm.FormStyle = fsMDIChild
  2655.     then
  2656.       ShortCut := TextToShortCut('Ctrl+F4')
  2657.     else
  2658.       ShortCut := TextToShortCut('Alt+F4');
  2659.   end;
  2660.   FSystemMenu.Items.Add(MI);
  2661. end;
  2662. procedure AddMinToTrayItem;
  2663. var
  2664.   MI: TMenuItem;
  2665. begin
  2666.   if not (biMinimizeToTray in FBorderIcons) then Exit;
  2667.   MI := TMenuItem.Create(Self);
  2668.   with MI do
  2669.   begin
  2670.     Name := MI_MINTOTRAYName;
  2671.     Caption := SP_MI_MINTOTRAYCAPTION;
  2672.     OnClick := SM_MinToTray;
  2673.   end;
  2674.   FSystemMenu.Items.Insert(0, MI);
  2675. end;
  2676. var
  2677.   B: Boolean;
  2678.   i: Integer;
  2679. begin
  2680.   if not FUseDefaultSysMenu then Exit;
  2681.   // delete old items
  2682.   repeat
  2683.     B := True;
  2684.     for i := 0 to FSystemMenu.Items.Count - 1 do
  2685.       if (FSystemMenu.Items[i].Name = MI_MINName) or
  2686.          (FSystemMenu.Items[i].Name = MI_MAXName) or
  2687.          (FSystemMenu.Items[i].Name = MI_CLOSEName) or
  2688.          (FSystemMenu.Items[i].Name = MI_MINTOTRAYName) or
  2689.          (FSystemMenu.Items[i].Name = MI_ROLLUPName) or
  2690.          (FSystemMenu.Items[i].Name = MI_RESTOREName)
  2691.       then
  2692.         begin
  2693.           FSystemMenu.Items[i].Free;
  2694.           B := False;
  2695.           Break;
  2696.         end;
  2697.   until B;
  2698.   //
  2699.   AddMinToTrayItem;
  2700.   if not ((FForm.FormStyle = fsMDIChild) and (FWindowState = wsMaximized))
  2701.   then
  2702.     if not FRollUpState and (FWindowState <> wsMinimized)
  2703.     then AddRollUpItem;
  2704.   if FWindowState <> wsMaximized then AddMaxItem;
  2705.   if (FWindowState <> wsNormal) or FRollUpState then AddRestoreItem;
  2706.   if FWindowState <> wsMinimized then AddMinItem;
  2707.   AddCloseItem;
  2708. end;
  2709. function TspDynamicSkinForm.GetSystemMenu;
  2710. begin
  2711.   if FSystemMenu <> nil
  2712.   then
  2713.     begin
  2714.       CreateUserSysMenu;
  2715.       Result := FSystemMenu.Items;
  2716.     end
  2717.   else
  2718.     begin
  2719.       CreateSysMenu;
  2720.       Result := FSysMenu.Items;
  2721.     end;
  2722. end;
  2723. procedure TspDynamicSkinForm.CreateSysTrayMenu;
  2724. procedure AddRestoreItem;
  2725. var
  2726.   MI: TMenuItem;
  2727. begin
  2728.   MI := TMenuItem.Create(Self);
  2729.   with MI do
  2730.   begin
  2731.     Name := TMI_RESTOREName;
  2732.     Caption := SP_MI_RESTORECAPTION;
  2733.     OnClick := TSM_Restore;
  2734.   end;
  2735.   FSysTrayMenu.Items.Add(MI);
  2736. end;
  2737. procedure AddCloseItem;
  2738. var
  2739.   MI: TMenuItem;
  2740. begin
  2741.   MI := TMenuItem.Create(Self);
  2742.   with MI do
  2743.   begin
  2744.     Name := TMI_CLOSEName;
  2745.     Caption := SP_MI_CLOSECAPTION;
  2746.     OnClick := TSM_Close;
  2747.     if FForm.FormStyle = fsMDIChild
  2748.     then
  2749.       ShortCut := TextToShortCut('Ctrl+F4')
  2750.     else
  2751.       ShortCut := TextToShortCut('Alt+F4');
  2752.   end;
  2753.   FSysTrayMenu.Items.Add(MI);
  2754. end;
  2755. procedure AddDevItem;
  2756. var
  2757.   MI: TMenuItem;
  2758. begin
  2759.   MI := TMenuItem.Create(Self);
  2760.   MI.Caption := '-';
  2761.   FSysTrayMenu.Items.Add(MI);
  2762. end;
  2763. begin
  2764.   AddRestoreItem;
  2765.   AddDevItem;
  2766.   AddCloseItem;
  2767. end;
  2768. procedure TspDynamicSkinForm.CreateSysMenu;
  2769. procedure AddMaxItem;
  2770. var
  2771.   MI: TMenuItem;
  2772. begin
  2773.   if not (biMaximize in FBorderIcons) then Exit;
  2774.   MI := TMenuItem.Create(Self);
  2775.   with MI do
  2776.   begin
  2777.     Name := MI_MAXName;
  2778.     Caption := SP_MI_MAXCAPTION;
  2779.     OnClick := SM_Max;
  2780.   end;
  2781.   FSysMenu.Items.Add(MI);
  2782. end;
  2783. procedure AddMinItem;
  2784. var
  2785.   MI: TMenuItem;
  2786. begin
  2787.   if not (biMinimize in FBorderIcons) then Exit;
  2788.   MI := TMenuItem.Create(Self);
  2789.   with MI do
  2790.   begin
  2791.     Name := MI_MINName;
  2792.     Caption := SP_MI_MINCAPTION;
  2793.     OnClick := SM_Min;
  2794.   end;
  2795.   FSysMenu.Items.Add(MI);
  2796. end;
  2797. procedure AddRestoreItem;
  2798. var
  2799.   MI: TMenuItem;
  2800. begin
  2801.   MI := TMenuItem.Create(Self);
  2802.   with MI do
  2803.   begin
  2804.     Name := MI_RESTOREName;
  2805.     Caption := SP_MI_RESTORECAPTION;
  2806.     OnClick := SM_Restore;
  2807.   end;
  2808.   FSysMenu.Items.Add(MI);
  2809. end;
  2810. procedure AddRollUpItem;
  2811. var
  2812.   MI: TMenuItem;
  2813. begin
  2814.   if not (biRollUp in FBorderIcons) then Exit;
  2815.   MI := TMenuItem.Create(Self);
  2816.   with MI do
  2817.   begin
  2818.     Name := MI_ROLLUPName;
  2819.     Caption := SP_MI_ROLLUPCAPTION;
  2820.     OnClick := SM_RollUp;
  2821.   end;
  2822.   FSysMenu.Items.Add(MI);
  2823. end;
  2824. procedure AddCloseItem;
  2825. var
  2826.   MI: TMenuItem;
  2827. begin
  2828.   MI := TMenuItem.Create(Self);
  2829.   with MI do
  2830.   begin
  2831.     Name := MI_CLOSEName;
  2832.     Caption := SP_MI_CLOSECAPTION;
  2833.     OnClick := SM_Close;
  2834.     if FForm.FormStyle = fsMDIChild
  2835.     then
  2836.       ShortCut := TextToShortCut('Ctrl+F4')
  2837.     else
  2838.       ShortCut := TextToShortCut('Alt+F4');
  2839.   end;
  2840.   FSysMenu.Items.Add(MI);
  2841. end;
  2842. procedure AddMinToTrayItem;
  2843. var
  2844.   MI: TMenuItem;
  2845. begin
  2846.   if not (biMinimizeToTray in FBorderIcons) then Exit;
  2847.   MI := TMenuItem.Create(Self);
  2848.   with MI do
  2849.   begin
  2850.     Name := MI_MINTOTRAYName;
  2851.     Caption := SP_MI_MINTOTRAYCAPTION;
  2852.     OnClick := SM_MinToTray;
  2853.   end;
  2854.   FSysMenu.Items.Add(MI);
  2855. end;
  2856. procedure AddDevItem;
  2857. var
  2858.   MI: TMenuItem;
  2859. begin
  2860.   MI := TMenuItem.Create(Self);
  2861.   MI.Caption := '-';
  2862.   FSysMenu.Items.Add(MI);
  2863. end;
  2864. var
  2865.   i: Integer;
  2866. begin
  2867.   for i := FSysMenu.Items.Count - 1 downto 0 do
  2868.     TMenuItem(FSysMenu.Items[i]).Free;
  2869.   if FWindowState <> wsMinimized then AddMinItem;
  2870.   if FWindowState <> wsMaximized then AddMaxItem;
  2871.   if (FWindowState <> wsNormal) or FRollUpState then AddRestoreItem;
  2872.   if not ((FForm.FormStyle = fsMDIChild) and (FWindowState = wsMaximized))
  2873.   then
  2874.     if not FRollUpState and (FWindowState <> wsMinimized)
  2875.     then AddRollUpItem;
  2876.   AddMinToTrayItem;
  2877.   if FSysMenu.Items.Count > 0 then AddDevItem;
  2878.   AddCloseItem;
  2879. end;
  2880. function TspDynamicSkinForm.CanNCSupport: Boolean;
  2881. begin
  2882.   Result := FSupportNCArea and (FSD <> nil) and not FSD.Empty and
  2883.             not IsNullRect(FSD.ClRect);
  2884. end;
  2885. function TspDynamicSkinForm.GetFullDragg: Boolean;
  2886. var
  2887.   B: Boolean;
  2888. begin
  2889.   SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @B, 0);
  2890.   Result := B;
  2891. end;
  2892. function TspDynamicSkinForm.GetMinimizeCoord;
  2893. function GetMDIEqualCoord(P: TPoint): Boolean;
  2894. var
  2895.   DS: TspDynamicSkinForm;
  2896.   MF: TForm;
  2897.   i: Integer;
  2898. begin
  2899.   Result := True;
  2900.   MF := Application.MainForm;
  2901.   for i := 0 to MF.MDIChildCount - 1 do
  2902.   if (MF.MDIChildren[i] <> FForm) and MF.MDIChildren[i].Visible 
  2903.   then
  2904.     begin
  2905.       DS := GetDynamicSkinFormComponent(MF.MDIChildren[i]);
  2906.       if (DS <> nil) and (DS.WindowState = wsMinimized) and
  2907.          (MF.MDIChildren[i].Left = P.X) and (MF.MDIChildren[i].Top = P.Y)
  2908.       then
  2909.         begin
  2910.           Result := False;
  2911.           Break;
  2912.         end;
  2913.     end;
  2914. end;
  2915. function GetSDIEqualCoord(P: TPoint): Boolean;
  2916. var
  2917.   DS: TspDynamicSkinForm;
  2918.   i: Integer;
  2919. begin
  2920.   Result := True;
  2921.   for i := 0 to Screen.FormCount - 1 do
  2922.   if (Screen.Forms[i] <> FForm) and (Screen.Forms[i] <> Application.MainForm) and
  2923.      (Screen.Forms[i].Visible)
  2924.   then
  2925.     begin
  2926.       DS := GetDynamicSkinFormComponent(Screen.Forms[i]);
  2927.       if (DS <> nil) and (DS.WindowState = wsMinimized) and
  2928.          (Screen.Forms[i].Left = P.X) and (Screen.Forms[i].Top = P.Y)
  2929.       then
  2930.         begin
  2931.           Result := False;
  2932.           Break;
  2933.         end;
  2934.     end;
  2935. end;
  2936. var
  2937.   R: TRect;
  2938.   P: TPoint;
  2939.   MW, MH, W, H: Integer;
  2940.   B: Boolean;
  2941. begin
  2942.   P := Point(0, 0);
  2943.   MW := GetMinWidth;
  2944.   MH := GetMinHeight;
  2945.   if FForm.FormStyle = fsMDIChild
  2946.   then
  2947.     begin
  2948.       R := GetMDIWorkArea;
  2949.       W := RectWidth(R);
  2950.       H := RectHeight(R);
  2951.       P.Y := H - MH;
  2952.       P.X := 0;
  2953.       repeat
  2954.         B := GetMDIEqualCoord(P);
  2955.         if not B
  2956.         then
  2957.           begin
  2958.             P.X := P.X + MW;
  2959.             if P.X + MW > W
  2960.             then
  2961.               begin
  2962.                 P.X := 0;
  2963.                 P.Y := P.Y - MH;
  2964.                 if P.Y < 0
  2965.                 then
  2966.                   begin
  2967.                     P.Y := H - MH;
  2968.                     B := True;
  2969.                   end;
  2970.               end;
  2971.           end;
  2972.       until B;
  2973.     end
  2974.   else
  2975.     begin
  2976.       R := GetMonitorWorkArea(FForm.Handle, True);
  2977.       P.Y := R.Bottom - MH;
  2978.       P.X := R.Left;
  2979.       repeat
  2980.         B := GetSDIEqualCoord(P);
  2981.         if not B
  2982.         then
  2983.           begin
  2984.             P.X := P.X + MW;
  2985.             if P.X + MW > R.Bottom
  2986.             then
  2987.               begin
  2988.                 P.X := R.Left;
  2989.                 P.Y  := P.Y - MH;
  2990.                 if P.Y < R.Top
  2991.                 then
  2992.                    begin
  2993.                      P.Y := R.Bottom - MH;
  2994.                      B := True;
  2995.                    end;
  2996.               end;
  2997.           end;
  2998.       until B;
  2999.     end;   
  3000.   Result := P;
  3001. end;
  3002. function TspDynamicSkinForm.CanObjectTest;
  3003. begin
  3004.    if FSupportNCArea
  3005.    then
  3006.      Result := not ARollUp
  3007.    else
  3008.      Result := (FRollUpState and ARollUp) or (not FRollUpState and not ARollUp);
  3009. end;
  3010. procedure TspDynamicSkinForm.SetSupportNCArea;
  3011. begin
  3012.   FSupportNCArea := Value;
  3013.   if FForm <> nil then 
  3014.   if not FSupportNCArea and (csDesigning in ComponentState)
  3015.   then FForm.BorderStyle := bsNone;
  3016. end;
  3017. function TspDynamicSkinForm.GetMinWidth: Integer;
  3018. begin
  3019.   if FSupportNCArea
  3020.   then
  3021.     begin
  3022.       if FSkinSupport
  3023.       then
  3024.         begin
  3025.           if (FMinWidth > FSD.FPicture.Width) and
  3026.           not (FWindowState = wsMinimized)
  3027.           then Result := FMinWidth
  3028.           else Result := FSD.FPicture.Width;
  3029.         end
  3030.       else
  3031.         begin
  3032.           if FMinWidth > 0
  3033.           then Result := FMinWidth
  3034.           else Result := DEFFORMMINWIDTH;
  3035.         end;
  3036.     end
  3037.   else
  3038.     begin
  3039.       if FSkinSupport
  3040.       then
  3041.         begin
  3042.           if FMinWidth = 0
  3043.           then
  3044.              Result := FSD.FPicture.Width
  3045.           else
  3046.             if FSkinSupport and (FMinWidth > FSD.FPicture.Width)
  3047.             then Result := FSD.FPicture.Width
  3048.             else Result := FMinWidth;
  3049.         end
  3050.       else
  3051.         Result := 0;
  3052.     end;
  3053. end;
  3054. function TspDynamicSkinForm.GetMinHeight: Integer;
  3055. begin
  3056.   if FSupportNCArea
  3057.   then
  3058.     begin
  3059.       if FSkinSupport
  3060.       then
  3061.         begin
  3062.           if (FMinHeight > FSD.FPicture.Height - RectHeight(FSD.ClRect))
  3063.           and not FRollUpState
  3064.           and not (FWindowState = wsMinimized)
  3065.           then Result := FMinHeight
  3066.           else Result := FSD.FPicture.Height - RectHeight(FSD.ClRect);
  3067.         end
  3068.       else
  3069.         begin
  3070.           if (FMinHeight > GetDefCaptionHeight + 6)
  3071.           and not FRollUpState
  3072.           and not (FWindowState = wsMinimized)
  3073.           then Result := FMinHeight
  3074.           else Result := GetDefCaptionHeight + 6;
  3075.         end;
  3076.     end
  3077.   else
  3078.     begin
  3079.       if FSkinSupport
  3080.       then
  3081.         begin
  3082.           if (FMinHeight = 0)
  3083.           then
  3084.             Result := FSD.FPicture.Height
  3085.           else
  3086.           if (FMinHeight > FSD.FPicture.Height)
  3087.           then Result := FSD.FPicture.Height
  3088.           else Result := FMinHeight;
  3089.         end
  3090.       else
  3091.         Result := 0;
  3092.     end;
  3093. end;
  3094. function TspDynamicSkinForm.GetMaxWidth: Integer;
  3095. var
  3096.   R: TRect;
  3097. begin
  3098.   R := GetMonitorWorkArea(FForm.Handle, not FMaximizeOnFullScreen);
  3099.   Result := RectWidth(R);
  3100. end;
  3101. function TspDynamicSkinForm.GetMaxHeight: Integer;
  3102. var
  3103.   R: TRect;
  3104. begin
  3105.   R := GetMonitorWorkArea(FForm.Handle, not FMaximizeOnFullScreen);
  3106.   Result := RectHeight(R);
  3107. end;
  3108. procedure TspDynamicSkinForm.DrawSkinObject;
  3109. var
  3110.   DC: HDC;
  3111.   Cnvs: TControlCanvas;
  3112. begin
  3113.   if CanObjectTest(AObject.RollUp) then
  3114.   if SupportNCArea
  3115.   then
  3116.     begin
  3117.       if not(((WindowState = wsMaximized) and (FForm.FormStyle = fsMDIChild))
  3118.             or (FForm.BorderStyle = bsNone))
  3119.       then
  3120.         begin
  3121.           DC := GetWindowDC(FForm.Handle);
  3122.           Cnvs := TControlCanvas.Create;
  3123.           Cnvs.Handle := DC;
  3124.           //
  3125.           AObject.Draw(Cnvs, True);
  3126.           //
  3127.           Cnvs.Handle := 0;
  3128.           ReleaseDC(FForm.Handle, DC);
  3129.           Cnvs.Free;
  3130.         end;
  3131.     end
  3132.   else
  3133.     AObject.Draw(FForm.Canvas, True);
  3134. end;
  3135. procedure TspDynamicSkinForm.PointToNCPoint(var P: TPoint);
  3136. begin
  3137.   if FForm.FormStyle = fsMDIChild
  3138.   then
  3139.     begin
  3140.       P := FForm.ScreenToClient(P);
  3141.       if FSkinSupport
  3142.       then
  3143.         begin
  3144.           P.X := P.X + NewClRect.Left;
  3145.           P.Y := P.Y + NewClRect.Top;
  3146.         end
  3147.       else
  3148.         begin
  3149.           P.X := P.X + 3;
  3150.           P.Y := P.Y + GetDefCaptionHeight + 3;
  3151.         end;
  3152.     end
  3153.   else
  3154.     begin
  3155.       P.X := P.X - FForm.Left;
  3156.       P.Y := P.Y - FForm.Top;
  3157.     end;
  3158. end;
  3159. procedure TspDynamicSkinForm.PaintNCSkin;
  3160. var
  3161.   CaptionBitMap, LeftBitMap, RightBitMap, BottomBitMap: TBitMap;
  3162.   DC: HDC;
  3163.   Cnvs: TCanvas;
  3164.   TempRect: TRect;
  3165.   i: Integer;
  3166.   CEB, LEB, REB, BEB: TspEffectBmp;
  3167. begin
  3168.   if not CanNCSupport then Exit;
  3169.   if FFormWidth = 0 then FFormWidth := FForm.Width;
  3170.   if FFormheight = 0 then FFormHeight := FForm.Height;
  3171.   if (FFormWidth < GetMinWidth) or (FFormHeight < GetMinHeight) then Exit;
  3172.   CalcRects;
  3173.   CalcAllRealObjectRect;
  3174.   DC := GetWindowDC(FForm.Handle);
  3175.   Cnvs := TCanvas.Create;
  3176.   Cnvs.Handle := DC;
  3177.   CaptionBitMap := TBitMap.Create;
  3178.   LeftBitMap := TBitMap.Create;
  3179.   RightBitMap := TBitMap.Create;
  3180.   BottomBitMap := TBitMap.Create;
  3181.   // crate borderbitmap
  3182.   with FSD do
  3183.     CreateSkinBorderImages(LTPoint, RTPoint, LBPoint, RBPoint, ClRect,
  3184.       NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  3185.       LeftBitMap, CaptionBitMap, RightBitMap, BottomBitMap,
  3186.       FPicture, Rect(0, 0, FPicture.Width, FPicture.Height),
  3187.       FFormWidth, FFormHeight,
  3188.       LeftStretch, TopStretch, RightStretch, BottomStretch);
  3189.   // draw mainmenuitems
  3190.   for i := 0 to ObjectList.Count - 1 do
  3191.     if TspActiveSkinObject(ObjectList.Items[i]) is TspSkinMainMenuItem
  3192.     then
  3193.       with TspSkinMainMenuItem(ObjectList.Items[i]) do
  3194.       begin
  3195.         if NewMainMenuRect.Top <= NewClRect.Top
  3196.         then
  3197.           Draw(CaptionBitMap.Canvas, False)
  3198.         else
  3199.           Draw(BottomBitMap.Canvas, False);
  3200.       end;
  3201.   // draw skin objects
  3202.   for i := 0 to ObjectList.Count - 1 do
  3203.      with TspActiveSkinObject(ObjectList.Items[i]) do
  3204.      if CanObjectTest(RollUp) and
  3205.         not (TspActiveSkinObject(ObjectList.Items[i]) is TspSkinMainMenuItem)
  3206.      then
  3207.        if Visible then 
  3208.        begin
  3209.          if (ObjectRect.Bottom <= NewClRect.Top)
  3210.          then
  3211.            Draw(CaptionBitMap.Canvas, False)
  3212.          else
  3213.            begin
  3214.              TempRect := ObjectRect;
  3215.              OffsetRect(ObjectRect, 0, -NewClRect.Bottom);
  3216.              Draw(BottomBitMap.Canvas, False);
  3217.              ObjectRect := TempRect;
  3218.            end;
  3219.        end;
  3220.   //
  3221.   if NewClRect.Bottom > NewClRect.Top
  3222.   then
  3223.     ExcludeClipRect(Cnvs.Handle,
  3224.       NewClRect.Left, NewClRect.Top, NewClRect.Right, NewClRect.Bottom);
  3225.   // paint nc
  3226.   if GetFormActive or not GetAutoRenderingInActiveImage
  3227.   then
  3228.     begin
  3229.       Cnvs.Draw(0, 0, CaptionBitMap);
  3230.       Cnvs.Draw(0, CaptionBitMap.Height, LeftBitMap);
  3231.       Cnvs.Draw(FFormWidth - RightBitMap.Width, CaptionBitMap.Height, RightBitMap);
  3232.       Cnvs.Draw(0, FFormHeight - BottomBitMap.Height, BottomBitMap);
  3233.     end
  3234.   else
  3235.     begin
  3236.       CEB := TspEffectBmp.CreateFromhWnd(CaptionBitMap.Handle);
  3237.       LEB := TspEffectBmp.CreateFromhWnd(LeftBitMap.Handle);
  3238.       REB := TspEffectBmp.CreateFromhWnd(RightBitMap.Handle);
  3239.       BEB := TspEffectBmp.CreateFromhWnd(BottomBitMap.Handle);
  3240.       case FSD.InActiveEffect of
  3241.         ieBrightness:
  3242.           begin
  3243.             CEB.ChangeBrightness(InActiveBrightnessKf);
  3244.             LEB.ChangeBrightness(InActiveBrightnessKf);
  3245.             REB.ChangeBrightness(InActiveBrightnessKf);
  3246.             BEB.ChangeBrightness(InActiveBrightnessKf);
  3247.           end;
  3248.         ieDarkness:
  3249.           begin
  3250.             CEB.ChangeDarkness(InActiveDarknessKf);
  3251.             LEB.ChangeDarkness(InActiveDarknessKf);
  3252.             REB.ChangeDarkness(InActiveDarknessKf);
  3253.             BEB.ChangeDarkness(InActiveDarknessKf);
  3254.           end;
  3255.         ieGrayScale:
  3256.           begin
  3257.             CEB.GrayScale;
  3258.             LEB.GrayScale;
  3259.             REB.GrayScale;
  3260.             BEB.GrayScale;
  3261.           end;
  3262.         ieNoise:
  3263.           begin
  3264.             CEB.AddMonoNoise(InActiveNoiseAmount);
  3265.             LEB.AddMonoNoise(InActiveNoiseAmount);
  3266.             REB.AddMonoNoise(InActiveNoiseAmount);
  3267.             BEB.AddMonoNoise(InActiveNoiseAmount);
  3268.           end;
  3269.         ieSplitBlur:
  3270.           begin
  3271.             CEB.SplitBlur(1);
  3272.             LEB.SplitBlur(1);
  3273.             REB.SplitBlur(1);
  3274.             BEB.SplitBlur(1);
  3275.           end;
  3276.         ieInvert:
  3277.           begin
  3278.             CEB.Invert;
  3279.             LEB.Invert;
  3280.             REB.Invert;
  3281.             BEB.Invert;
  3282.           end;
  3283.       end;
  3284.       CEB.Draw(Cnvs.Handle, 0, 0);
  3285.       LEB.Draw(Cnvs.Handle, 0, CaptionBitMap.Height);
  3286.       REB.Draw(Cnvs.Handle, FFormWidth - RightBitMap.Width, CaptionBitMap.Height);
  3287.       BEB.Draw(Cnvs.Handle, 0, FFormHeight - BottomBitMap.Height);
  3288.       CEB.Free;
  3289.       LEB.Free;
  3290.       REB.Free;
  3291.       BEB.Free;
  3292.     end;
  3293.   //
  3294.   BottomBitMap.Free;
  3295.   RightBitMap.Free;
  3296.   LeftBitMap.Free;
  3297.   CaptionBitMap.Free;
  3298.   ReleaseDC(FForm.Handle, DC);
  3299.   Cnvs.Handle := 0;
  3300.   Cnvs.Free;
  3301. end;
  3302. procedure TspDynamicSkinForm.FormShortCut;
  3303. var
  3304.   MM: TMainMenu;
  3305. begin
  3306.   if FInShortCut
  3307.   then
  3308.     begin
  3309.       FInShortCut := False;
  3310.       Handled := False;
  3311.       Exit;
  3312.     end;
  3313.   if (FMainMenuBar <> nil) and (FMainMenuBar.MainMenu <> nil)
  3314.   then
  3315.     MM := FMainMenuBar.MainMenu
  3316.   else
  3317.     MM := FMainMenu;
  3318.   if MM <> nil
  3319.   then
  3320.   if (KeyDataToShiftState(Msg.KeyData) = [ssAlt]) and FindHotKeyItem(Msg.CharCode)
  3321.   then
  3322.     Handled := True
  3323.   else
  3324.     begin
  3325.       FInShortCut := MM.IsShortCut(Msg);
  3326.       if FInShortCut then Handled := True else Handled := False;
  3327.     end;
  3328. end;
  3329. procedure TspDynamicSkinForm.SetDefaultCaptionText(AValue: String);
  3330. var
  3331.   i: Integer;
  3332. begin
  3333.   if (FSD <> nil) and (not FSD.Empty)
  3334.   then
  3335.     for i := 0 to ObjectList.Count - 1 do
  3336.       if TspActiveSkinObject(ObjectList.Items[i]) is TspSkinCaptionObject
  3337.       then
  3338.         with TspSkinCaptionObject(ObjectList.Items[i]) do
  3339.         begin
  3340.           if DefaultCaption
  3341.           then TextValue := FForm.Caption;
  3342.         end
  3343. end;
  3344. procedure TspDynamicSkinForm.SetFormStyle;
  3345. begin
  3346.   if (FS = fsNormal) or (FS = fsStayOnTop)
  3347.   then
  3348.     begin
  3349.       FForm.FormStyle := FS;
  3350.       if FAlphaBlend then UpDateSkinControls(0, FForm);
  3351.     end;
  3352. end;
  3353. procedure TspDynamicSkinForm.SetRollUpFormRegion;
  3354. var
  3355.   RMask: TBitMap;
  3356.   Size: Integer;
  3357.   RgnData: PRgnData;
  3358.   TempRgn: HRGN;
  3359. begin
  3360.   if (FSD.FRollUpMask.Empty) and (FRgn = 0) then Exit;
  3361.   if (FSD.FRollUpMask.Empty) and (FRgn <> 0)
  3362.   then
  3363.     begin
  3364.       SetWindowRgn(FForm.Handle, 0, True);
  3365.       DeleteObject(FRgn);
  3366.       FRgn := 0;
  3367.     end
  3368.   else
  3369.     if (not FSD.FRollUpMask.Empty)
  3370.     then
  3371.       begin
  3372.         if FSD.RollUpRightPoint.X > FSD.RollUpLeftPoint.X
  3373.         then
  3374.           begin
  3375.             RMask := TBitMap.Create;
  3376.             with FSD do
  3377.               CreateHSkinImage(
  3378.                  RollUpLeftPoint.X, FRollUpMask.Width - RollUpRightPoint.X,
  3379.                  RMask, FRollUpMask,
  3380.                  Rect(0, 0, FRollUpMask.Width, FRollUpMask.Height),
  3381.                  FForm.Width, FRollUpMask.Height);
  3382.             Size := CreateRgnFromBmp(RMask, 0, 0, RgnData);
  3383.             RMask.Free;
  3384.           end
  3385.         else
  3386.           Size := CreateRgnFromBmp(FSD.FRollUpMask, 0, 0, RgnData);
  3387.         if Size <> 0
  3388.         then
  3389.           begin
  3390.             TempRgn := FRgn;
  3391.             FRgn := ExtCreateRegion(nil, Size, RgnData^);
  3392.             SetWindowRgn(FForm.Handle, FRgn, True);
  3393.             if TempRgn <> 0 then DeleteObject(TempRgn);
  3394.             FreeMem(RgnData, Size);
  3395.           end;
  3396.       end;
  3397. end;
  3398. procedure TspDynamicSkinForm.CreateRollUpForm2;
  3399. begin
  3400.   FForm.Height := GetMinHeight;
  3401. end;
  3402. procedure TspDynamicSkinForm.CreateRollUpForm;
  3403. var
  3404.   W, H, dx: Integer;
  3405. procedure CalcRollUpObjectsRects;
  3406. function CalcRollUpObjectRect(R: TRect): TRect;
  3407. begin
  3408.   if R.Left >= FSD.RollUpRightPoint.X
  3409.   then
  3410.     OffsetRect(R, dx, 0)
  3411.   else
  3412.   if (R.Left <= FSD.RollUpLeftPoint.X) and
  3413.      (R.Right >= FSD.RollUpRightPoint.X)
  3414.   then
  3415.     Inc(R.Right, dx);
  3416.   Result := R;  
  3417. end;
  3418. var
  3419.   i: Integer;
  3420. begin
  3421.   if (FSD.RollUpRightPoint.X > FSD.RollUpLeftPoint.X)
  3422.   then
  3423.     for i := 0 to ObjectList.Count - 1 do
  3424.       with TspActiveSkinObject(ObjectList.Items[i]) do
  3425.       begin
  3426.         if RollUp
  3427.         then
  3428.           ObjectRect := CalcRollUpObjectRect(SkinRect);
  3429.       end;
  3430. end;
  3431. procedure HideControls;
  3432. var
  3433.   i: Integer;
  3434. begin
  3435.   VisibleControls.Clear;
  3436.   for i := 0 to FForm.ControlCount - 1 do
  3437.   begin
  3438.     if FForm.Controls[i].Visible
  3439.     then
  3440.       begin
  3441.         VisibleControls.Add(FForm.Controls[i]);
  3442.         FForm.Controls[i].Visible := False;
  3443.       end;
  3444.   end;
  3445. end;
  3446. begin
  3447.   H := FSD.FRollUpPicture.Height;
  3448.   if FSD.RollUpLeftPoint.X >= FSD.RollUpRightPoint.X
  3449.   then
  3450.     begin
  3451.       W := FSD.FRollUpPicture.Width;
  3452.       dx := 0;
  3453.     end
  3454.   else
  3455.     begin
  3456.       W := FForm.Width;
  3457.       dx := W - FSD.FRollUpPicture.Width;
  3458.     end;
  3459.   CalcRollUpObjectsRects;
  3460.   TestActive(-1, -1, True);
  3461.   MouseTimer.Enabled := False;
  3462.   MorphTimer.Enabled := False;
  3463.   //
  3464.   if VisibleControls.Count = 0 then HideControls;
  3465.   if FSD.RollUpLeftPoint.X >= FSD.RollUpRightPoint.X
  3466.   then
  3467.     FForm.SetBounds(FForm.Left, FForm.Top, W, H)
  3468.   else
  3469.     FForm.Height := H;
  3470.   SetRollUpFormRegion;
  3471.   if FSupportNCArea
  3472.   then SendMessage(FForm.Handle, WM_NCPAINT, 0, 0)
  3473.   else FForm.RePaint;
  3474.   MouseTimer.Enabled := True;
  3475.   MorphTimer.Enabled := True;
  3476. end;
  3477. procedure TspDynamicSkinForm.RestoreRollUpForm2;
  3478. begin
  3479.   FForm.Height := OldHeight;
  3480. end;
  3481. procedure TspDynamicSkinForm.RestoreRollUpForm;
  3482. procedure ShowControls;
  3483. var
  3484.   i: Integer;
  3485. begin
  3486.   for i := 0 to VisibleControls.Count - 1 do
  3487.     TControl(VisibleControls.Items[i]).Visible := True;
  3488.   VisibleControls.Clear;
  3489. end;
  3490. begin
  3491.   TestActive(-1, -1, True);
  3492.   MouseTimer.Enabled := False;
  3493.   MorphTimer.Enabled := False;
  3494.   //
  3495.   ShowControls;
  3496.   if CanScale
  3497.   then
  3498.     FForm.Height := OldHeight;
  3499.   CheckSize;
  3500.   //
  3501.   MouseTimer.Enabled := True;
  3502.   MorphTimer.Enabled := True;
  3503. end;
  3504. procedure TspDynamicSkinForm.SetRollUpState;
  3505. begin
  3506.   if (not FSkinSupport and not FSupportNCArea) or not (biRollUp in FBorderIcons) or
  3507.      (FRollUpState and (FWindowState = wsMaximized) and not MaxRollUpState) or
  3508.      (FWindowState = wsMinimized)
  3509.   then Exit;
  3510.   if WindowState = wsMaximized then MaxRollUpState := Value;
  3511.   FRollUpState := Value;
  3512.   if FSupportNCArea
  3513.   then
  3514.     begin
  3515.       if FRollUpState
  3516.       then
  3517.         begin
  3518.           OldHeight := FForm.Height;
  3519.           CreateRollUpForm2;
  3520.         end
  3521.       else
  3522.         RestoreRollUpForm2;
  3523.     end
  3524.  else
  3525.    if not FSD.FRollUpPicture.Empty
  3526.    then
  3527.      begin
  3528.        if FRollUpState
  3529.        then
  3530.          begin
  3531.            OldHeight := FForm.Height;
  3532.            CreateRollUpForm;
  3533.          end
  3534.        else
  3535.          RestoreRollUpForm;
  3536.      end
  3537.    else
  3538.      FRollUpState := False;
  3539.   if Assigned(FOnChangeRollUpState) then FOnChangeRollUpState(Self);
  3540. end;
  3541. procedure TspDynamicSkinForm.BeforeUpDateSkinControls;
  3542. procedure CheckControl(C: TControl);
  3543. begin
  3544.   if C is TspSkinControl
  3545.   then
  3546.     begin
  3547.       with TspSkinControl(C) do
  3548.         if (Integer(SkinData) = AFSD) or (AFSD = 0)
  3549.         then BeforeChangeSkinData;
  3550.     end
  3551.   else
  3552.   if C is TspGraphicSkinControl
  3553.   then
  3554.     begin
  3555.       with TspGraphicSkinControl(C) do
  3556.         if (Integer(SkinData) = AFSD) or (AFSD = 0)
  3557.         then BeforeChangeSkinData;
  3558.     end;
  3559. end;
  3560. var
  3561.   i: Integer;
  3562. begin
  3563.   CheckControl(WC);
  3564.   for i := 0 to WC.ControlCount - 1 do
  3565.   begin
  3566.     if WC.Controls[i] is TWinControl
  3567.     then
  3568.       BeforeUpDateSkinControls(AFSD, TWinControl(WC.Controls[i]))
  3569.     else
  3570.       CheckControl(WC.Controls[i]);
  3571.   end;
  3572. end;
  3573. procedure TspDynamicSkinForm.UpDateSkinControls;
  3574. procedure CheckControl(C: TControl);
  3575. begin
  3576.   if C is TspGraphicSkinControl
  3577.   then
  3578.     begin
  3579.       with TspGraphicSkinControl(C) do
  3580.         if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  3581.     end
  3582.   else
  3583.   if C is TspSkinControl
  3584.   then
  3585.     begin
  3586.       with TspSkinControl(C) do
  3587.         if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  3588.     end
  3589.   else
  3590.     if C is TspSkinPageControl
  3591.     then
  3592.       begin
  3593.         with TspSkinPageControl(C) do
  3594.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  3595.       end
  3596.     else
  3597.     if C is TspSkinTabControl
  3598.     then
  3599.       begin
  3600.         with TspSkinTabControl(C) do
  3601.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData
  3602.       end    
  3603.     else
  3604.     if C is TspSkinCustomEdit
  3605.     then
  3606.       begin
  3607.         with TspSkinCustomEdit(C) do
  3608.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3609.       end
  3610.     else
  3611.     if C is TspSkinMemo
  3612.     then
  3613.       begin
  3614.         with TspSkinMemo(C) do
  3615.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3616.       end
  3617.     else
  3618.     if C is TspSkinLinkLabel
  3619.     then
  3620.       begin
  3621.         with TspSkinLinkLabel(C) do
  3622.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3623.       end
  3624.     else
  3625.     if C is TspSkinButtonLabel
  3626.     then
  3627.       begin
  3628.         with TspSkinButtonLabel(C) do
  3629.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3630.       end
  3631.     else
  3632.     if C is TspSkinStdLabel
  3633.     then
  3634.       begin
  3635.         with TspSkinStdLabel(C) do
  3636.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3637.       end
  3638.     else
  3639.     if C is TspSkinTextLabel
  3640.     then
  3641.       begin
  3642.         with TspSkinTextLabel(C) do
  3643.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3644.       end
  3645.     else
  3646.     if C is TspSkinCustomTreeView
  3647.     then
  3648.       begin
  3649.         with TspSkinTreeView(C) do
  3650.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3651.       end
  3652.     else
  3653.     if C is TspSkinCustomListView
  3654.     then
  3655.       begin
  3656.         with TspSkinListView(C) do
  3657.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3658.       end
  3659.     else
  3660.     if C is TspSkinHeaderControl
  3661.     then
  3662.       begin
  3663.         with TspSkinHeaderControl(C) do
  3664.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3665.       end
  3666.     else
  3667.     if C is TspSkinControlBar
  3668.     then
  3669.       begin
  3670.         with TspSkinControlBar(C) do
  3671.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3672.       end
  3673.     else
  3674.     if C is TspSkinSplitter
  3675.     then
  3676.       begin
  3677.         with TspSkinSplitter(C) do
  3678.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3679.       end
  3680.     else
  3681.     if C is TspSkinBevel
  3682.     then
  3683.       begin
  3684.         with TspSkinBevel(C) do
  3685.           if (Integer(SkinData) = AFSD) or (AFSD = 0) then ChangeSkinData;
  3686.       end;
  3687. end;
  3688. var
  3689.   i: Integer;
  3690. begin
  3691.   CheckControl(WC);
  3692.   for i := 0 to WC.ControlCount - 1 do
  3693.   begin
  3694.     if WC.Controls[i] is TWinControl
  3695.     then
  3696.       UpDateSkinControls(AFSD, TWinControl(WC.Controls[i]))
  3697.     else
  3698.       CheckControl(WC.Controls[i]);
  3699.   end;
  3700. end;
  3701. procedure TspDynamicSkinForm.UnLinkControlFromArea(Control: TControl);
  3702. var
  3703.   i, j: Integer;
  3704. begin
  3705.   j := -1;
  3706.   for i := 0 to AreaList.Count - 1 do
  3707.   begin
  3708.     if PAreaInfo(AreaList.Items[i])^.Control = Control
  3709.     then
  3710.       begin
  3711.         j := i;
  3712.         Break;
  3713.       end;
  3714.   end;
  3715.   if j <> -1
  3716.   then
  3717.     begin
  3718.       FreeMem(PAreaInfo(AreaList.Items[i]), Sizeof(TAreaInfo));
  3719.       AreaList.Delete(j);
  3720.     end;
  3721. end;
  3722. procedure TspDynamicSkinForm.LinkControlToArea;
  3723. function GetAreaRect: TRect;
  3724. var
  3725.   i: Integer;
  3726. begin
  3727.   i := FSD.GetAreaIndex(AreaName);
  3728.   if i <> - 1
  3729.   then
  3730.     Result := TspDataSkinArea(FSD.AreaList.Items[i]).AreaRect
  3731.   else
  3732.     Result := NullRect;
  3733. end;
  3734. var
  3735.   PAI: PAreaInfo;
  3736.   R: TRect;
  3737. begin
  3738.   R := GetAreaRect;
  3739.   if IsNullRect(R) then Exit;
  3740.   GetMem(PAI, Sizeof(TAreaInfo));
  3741.   Control.Align := alNone;
  3742.   PAI^.Control := Control;
  3743.   PAI^.AreaRect := R;
  3744.   AreaList.Add(PAI);
  3745. end;
  3746. procedure TspDynamicSkinForm.ControlsToAreas;
  3747. var
  3748.   i: Integer;
  3749.   R: TRect;
  3750.   FCanScale: Boolean;
  3751. begin
  3752.   if AreaList.Count = 0 then Exit;
  3753.   FCanScale := CanScale;
  3754.   for i := 0 to AreaList.Count - 1 do
  3755.   with PAreaInfo(AreaList.Items[i])^ do
  3756.   begin
  3757.     if FCanScale
  3758.     then
  3759.       R := CalcRealObjectRect(AreaRect)
  3760.     else
  3761.       R := AreaRect;
  3762.     Control.SetBounds(R.Left, R.Top, RectWidth(R), RectHeight(R));
  3763.   end;
  3764. end;
  3765. procedure TspDynamicSkinForm.PopupSkinMenu;
  3766. var