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

Delphi控件源码

开发平台:

Delphi

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