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

Delphi控件源码

开发平台:

Delphi

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