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

Delphi控件源码

开发平台:

Delphi

  1.   UnHookApp;
  2.   if Assigned(FOnSkinMenuClose) then FOnSkinMenuClose(Self);
  3.   if InMainMenu
  4.   then
  5.     begin
  6.       InMainMenu := False;
  7.       if FMainMenuBar <> nil then FMainMenuBar.MenuExit;
  8.       if Assigned(FOnMainMenuExit) then FOnMainMenuExit(Self);
  9.     end;
  10. end;
  11. procedure TbsBusinessSkinForm.CheckObjectsHint;
  12. var
  13.   i: Integer;
  14. begin
  15.   if (not FUseDefaultObjectHint) or (FSD = nil) or (ObjectList.Count = 0) then Exit;
  16.   for i := 0 to ObjectList.Count - 1 do
  17.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinAnimateObject
  18.     then
  19.       with TbsSkinAnimateObject(ObjectList.Items[i]) do
  20.       begin
  21.         if FSD.ResourceStrData = nil
  22.         then
  23.           case Command of
  24.             cmClose: Hint := BS_CLOSEBUTTON_HINT;
  25.             cmMaximize: Hint := BS_MAXBUTTON_HINT;
  26.             cmMinimize: Hint := BS_MINBUTTON_HINT;
  27.             cmRollUp: Hint := BS_ROLLUPBUTTON_HINT;
  28.             cmMinimizeToTray: Hint := BS_TRAYBUTTON_HINT;
  29.             cmSysMenu: Hint := BS_MENUBUTTON_HINT;
  30.           end
  31.         else
  32.           case Command of
  33.             cmClose: Hint := FSD.ResourceStrData.GetResStr('CLOSEBUTTON_HINT');
  34.             cmMaximize: Hint := FSD.ResourceStrData.GetResStr('MAXBUTTON_HINT');
  35.             cmMinimize: Hint := FSD.ResourceStrData.GetResStr('MINBUTTON_HINT');
  36.             cmRollUp: Hint := FSD.ResourceStrData.GetResStr('ROLLUPBUTTON_HINT');
  37.             cmMinimizeToTray: Hint := FSD.ResourceStrData.GetResStr('TRAYBUTTON_HINT');
  38.             cmSysMenu: Hint := FSD.ResourceStrData.GetResStr('MENUBUTTON_HINT');
  39.           end;
  40.        end
  41.      else
  42.       if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinStdButtonObject
  43.       then
  44.         with TbsSkinStdButtonObject(ObjectList.Items[i]) do
  45.         begin
  46.           if FSD.ResourceStrData = nil
  47.           then
  48.             case Command of
  49.               cmClose: Hint := BS_CLOSEBUTTON_HINT;
  50.               cmMaximize: Hint := BS_MAXBUTTON_HINT;
  51.               cmMinimize: Hint := BS_MINBUTTON_HINT;
  52.               cmRollUp: Hint := BS_ROLLUPBUTTON_HINT;
  53.               cmMinimizeToTray: Hint := BS_TRAYBUTTON_HINT;
  54.               cmSysMenu: Hint := BS_MENUBUTTON_HINT;
  55.             end
  56.           else
  57.             case Command of
  58.               cmClose: Hint := FSD.ResourceStrData.GetResStr('CLOSEBUTTON_HINT');
  59.               cmMaximize: Hint := FSD.ResourceStrData.GetResStr('MAXBUTTON_HINT');
  60.               cmMinimize: Hint := FSD.ResourceStrData.GetResStr('MINBUTTON_HINT');
  61.               cmRollUp: Hint := FSD.ResourceStrData.GetResStr('ROLLUPBUTTON_HINT');
  62.               cmMinimizeToTray: Hint := FSD.ResourceStrData.GetResStr('TRAYBUTTON_HINT');
  63.               cmSysMenu: Hint := FSD.ResourceStrData.GetResStr('MENUBUTTON_HINT');
  64.             end;
  65.         end;
  66. end;
  67. procedure TbsBusinessSkinForm.CheckObjects;
  68. var
  69.   i: Integer;
  70.   ObjectVisible: Boolean;
  71. begin
  72.   if ObjectList.Count > 0 then
  73.   if FHideCaptionButtons
  74.   then
  75.     begin
  76.       for i := 0 to ObjectList.Count - 1 do
  77.         if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinAnimateObject
  78.         then
  79.           with TbsSkinAnimateObject(ObjectList.Items[i]) do
  80.           begin
  81.             Enabled := False;
  82.             Visible := not SkinRectInAPicture;
  83.           end
  84.         else
  85.         if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinStdButtonObject
  86.         then
  87.           with TbsSkinStdButtonObject(ObjectList.Items[i]) do
  88.           begin
  89.             Enabled := False;
  90.             Visible := not SkinRectInAPicture;
  91.           end;
  92.     end
  93.   else
  94.   for i := 0 to ObjectList.Count - 1 do
  95.   if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinAnimateObject
  96.     then
  97.       with TbsSkinAnimateObject(ObjectList.Items[i]) do
  98.       begin
  99.         if ButtonStyle
  100.         then
  101.           begin
  102.             if (Command = cmDefault)
  103.             then
  104.               begin
  105.                 ObjectVisible := False;
  106.                 if Assigned(FOnActivateCustomObject)
  107.                 then
  108.                   FOnActivateCustomObject(IDName, ObjectVisible);
  109.                 Visible := ObjectVisible;
  110.               end
  111.             else
  112.             if not (biMinimizeToTray in FBorderIcons) and
  113.                (Command = cmMinimizeToTray)
  114.             then
  115.               begin
  116.                 Enabled := False;
  117.                 Visible := not SkinRectInAPicture;
  118.               end
  119.             else
  120.             if not (biRollUp in FBorderIcons) and
  121.                (Command = cmRollUp)
  122.             then
  123.               begin
  124.                 Enabled := False;
  125.                 Visible := not SkinRectInAPicture;
  126.               end
  127.             else
  128.             if not (biMaximize in FBorderIcons) and
  129.                (Command = cmMaximize)
  130.             then
  131.                begin
  132.                  Enabled := False;
  133.                  Visible := not SkinRectInAPicture;
  134.                end
  135.             else
  136.             if not (biMinimize in FBorderIcons) and
  137.                (Command = cmMinimize)
  138.             then
  139.               begin
  140.                 Enabled := False;
  141.                 Visible := not SkinRectInAPicture;
  142.               end
  143.             else
  144.             if not (biSystemMenu in FBorderIcons) and
  145.                (Command = cmSysMenu)
  146.             then
  147.               begin
  148.                 Enabled := False;
  149.                 Visible := not SkinRectInAPicture;
  150.               end;
  151.           end;
  152.       end
  153.     else
  154.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinStdButtonObject
  155.     then
  156.       with TbsSkinStdButtonObject(ObjectList.Items[i]) do
  157.       begin
  158.         if (Command = cmDefault)
  159.             then
  160.               begin
  161.                 ObjectVisible := False;
  162.                 if Assigned(FOnActivateCustomObject)
  163.                 then
  164.                   FOnActivateCustomObject(IDName, ObjectVisible);
  165.                 Visible := ObjectVisible;
  166.               end
  167.             else
  168.         if not (biMinimizeToTray in FBorderIcons) and
  169.                (Command = cmMinimizeToTray)
  170.             then
  171.               begin
  172.                 Enabled := False;
  173.                 Visible := not SkinRectInAPicture;
  174.               end
  175.             else
  176.         if not (biRollUp in FBorderIcons) and (Command = cmRollUp)
  177.            then
  178.              begin
  179.                Enabled := False;
  180.                Visible := not SkinRectInAPicture;
  181.              end
  182.            else
  183.         if not (biMaximize in FBorderIcons) and (Command = cmMaximize)
  184.            then
  185.              begin
  186.                Enabled := False;
  187.                Visible := not SkinRectInAPicture;
  188.              end
  189.            else
  190.         if not (biMinimize in FBorderIcons) and (Command = cmMinimize)
  191.            then
  192.              begin
  193.                Enabled := False;
  194.                Visible := not SkinRectInAPicture;
  195.              end
  196.            else
  197.         if not (biSystemMenu in FBorderIcons) and (Command = cmSysMenu)
  198.         then
  199.           begin
  200.             Enabled := False;
  201.             Visible := not SkinRectInAPicture;
  202.           end;
  203.       end;
  204.   CheckObjectsHint;    
  205. end;
  206. function TbsBusinessSkinForm.CanScale;
  207. begin
  208.   if (FSD.RBPoint.X - FSD.LTPoint.X = 0) or
  209.      (FSD.RBPoint.Y - FSD.LTPoint.Y = 0)
  210.   then
  211.     Result := False
  212.   else
  213.     Result := True;
  214. end;
  215. function TbsBusinessSkinForm.GetIndex;
  216. var
  217.   i, j: Integer;
  218. begin
  219.   j := -1;
  220.   for i := 0 to ObjectList.Count - 1 do
  221.   begin
  222.     if AIDName = TbsActiveSkinObject(ObjectList.Items[i]).IDName
  223.     then
  224.       begin
  225.         j := i;
  226.         Break;
  227.       end;
  228.   end;
  229.   Result := j;
  230. end;
  231. procedure TbsBusinessSkinForm.UserObjectDraw;
  232. var
  233.   i: Integer;
  234. begin
  235.   i := GetIndex(AIDName);
  236.   if i <> -1
  237.   then
  238.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsUserObject
  239.     then
  240.       TbsUserObject(ObjectList.Items[i]).Draw(FForm.Canvas, True);
  241. end;
  242. procedure TbsBusinessSkinForm.DoMagnetic;
  243. var
  244.   R: TRect;
  245.   LW, TR: Integer;
  246.   P: TPoint;
  247. begin
  248.   if FForm.FormStyle <> fsMDIChild
  249.   then
  250.     R := GetMonitorWorkArea(FForm.Handle, True)
  251.   else
  252.     begin
  253.       R := GetMDIWorkArea;
  254.       P := Application.MainForm.ClientToScreen(Point(0, 0));
  255.       OffsetRect(R, P.X, P.Y);
  256.     end;
  257.   if (L < R.Left + FMagneticSize) and (L > R.Left - FMagneticSize)
  258.   then L := R.Left;
  259.   if (T < R.Top + FMagneticSize) and (T > R.Top - FMagneticSize)
  260.   then T := R.Top;
  261.   LW := L + W; TR := T + H;
  262.   if (LW > R.Right - FMagneticSize) and (LW < R.Right + FMagneticSize)
  263.   then L := R.Right - W;
  264.   if (TR > R.Bottom - FMagneticSize) and (TR < R.Bottom + FMagneticSize)
  265.   then T := R.Bottom - H;
  266. end;
  267. function TbsBusinessSkinForm.InForm;
  268. var
  269.   H: HWND;
  270. begin
  271.   H := WindowFromPoint(P);
  272.   Result := H = FForm.Handle;
  273. end;
  274. function TbsBusinessSkinForm.PtInMask;
  275. var
  276.   B: Boolean;
  277. begin
  278.   if PtInRect(NewMaskRectArea, P)
  279.   then
  280.     B := True
  281.   else
  282.     if P.Y <= NewMaskRectArea.Top
  283.     then
  284.       B := RMTop.Canvas.Pixels[P.X, P.Y] = BlackColor
  285.     else
  286.       if P.Y >= NewMaskRectArea.Bottom
  287.       then
  288.         B := RMBottom.Canvas.Pixels[P.X, P.Y - NewMaskRectArea.Bottom] = BlackColor
  289.       else
  290.         if P.X <= NewMaskRectArea.Left
  291.         then
  292.           B := RMLeft.Canvas.Pixels[P.X, P.Y - NewMaskRectArea.Top] = BlackColor
  293.         else
  294.           B := RMRight.Canvas.Pixels[P.X - NewMaskRectArea.Right, P.Y - NewMaskRectArea.Top] = BlackColor;
  295.   Result := B;
  296. end;
  297. procedure TbsBusinessSkinForm.SetWindowState;
  298. begin
  299.   if FWindowState <> Value
  300.   then
  301.     begin
  302.       if not ((Value = wsMinimized) and (FForm = Application.MainForm))
  303.       then
  304.         FWindowState := Value;
  305.         case Value of
  306.           wsNormal: DoNormalize;
  307.           wsMaximized: DoMaximize;
  308.           wsMinimized:
  309.             begin
  310.               DoMinimize;
  311.             end;
  312.         end;
  313.     end;
  314. end;
  315. procedure TbsBusinessSkinForm.DoMinimize;
  316. var
  317.   P: TPoint;
  318. begin
  319.   if (Application.MainForm = FForm)
  320.   then
  321.     begin
  322.       Application.Minimize
  323.     end
  324.   else
  325.     begin
  326.       if IsNullRect(OldBoundsRect)
  327.       then OldBoundsRect := FForm.BoundsRect;
  328.       P := GetMinimizeCoord;
  329.       FForm.SetBounds(P.X, P.Y, GetMinWidth, GetMinHeight);
  330.       if (FForm.FormStyle = fsMDIChild) and (FWindowState <> wsMaximized)
  331.       then
  332.         begin
  333.           SendMessage(Application.MainForm.Handle, WM_MDICHILDRESTORE, 0, 0);
  334.         end;
  335.     end;
  336. end;
  337. procedure TbsBusinessSkinForm.DoMaximize;
  338. var
  339.   R, R1: TRect;
  340.   OW, OH: Integer;
  341. begin
  342.   if IsNullRect(OldBoundsRect) then OldBoundsRect := FForm.BoundsRect;
  343.   if FForm.FormStyle = fsMDIChild
  344.   then
  345.     begin
  346.       MouseTimer.Enabled := False;
  347.       TestActive(-1, -1, False);
  348.       R := GetMDIWorkArea;
  349.       OW := FForm.Width;
  350.       OH := FForm.Height;
  351.       FForm.SetBounds(0, 0, RectWidth(R),  RectHeight(R));
  352.       if (OW = RectWidth(R)) and (OH = RectHeight(R)) then UpDateForm;
  353.       SendMessage(Application.MainForm.Handle, WM_MDICHILDMAX, 0, 0);
  354.     end
  355.   else
  356.     begin
  357.       if not FMaximizeOnFullScreen
  358.       then
  359.         begin
  360.           R := GetMonitorWorkArea(FForm.Handle, True);
  361.           R1 := GetMonitorWorkArea(FForm.Handle, False);
  362.           if (RectWidth(R) = RectWidth(R1)) and
  363.              (RectHeight(R) = RectHeight(R1))
  364.           then
  365.             InflateRect(R, -1, -1);
  366.         end
  367.       else
  368.         R := GetMonitorWorkArea(FForm.Handle, False);
  369.       FForm.SetBounds(R.Left, R.Top, RectWidth(R), RectHeight(R));
  370.     end;
  371. end;
  372. procedure TbsBusinessSkinForm.DoNormalize;
  373. var
  374.   OW, OH: Integer;
  375. begin
  376.   MaxRollUpState := False;
  377.   OW := FForm.Width;
  378.   OH := FForm.Height;
  379.   FForm.SetBounds(OldBoundsRect.Left, OldBoundsRect.Top,
  380.                   RectWidth(OldBoundsRect),
  381.                   RectHeight(OldBoundsRect));
  382.   MouseTimer.Enabled := True;
  383.   if (OW = RectWidth(OldBoundsRect)) and
  384.      (OH = RectHeight(OldBoundsRect))
  385.   then
  386.     UpDateForm;
  387.   FForm.RePaint;
  388.   if (FForm.FormStyle = fsMDIChild) and (FWindowState <> wsMaximized)
  389.   then
  390.     SendMessage(Application.MainForm.Handle, WM_MDICHILDRESTORE, 0, 0);
  391.   OldBoundsRect := NullRect;
  392. end;
  393. procedure TbsBusinessSkinForm.LinkMenu;
  394. var
  395.   i: Integer;
  396. begin
  397.   i := GetIndex(AIDName);
  398.   if i <> - 1 then
  399.   if (TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinButtonObject)
  400.   then
  401.     with TbsSkinButtonObject(ObjectList.Items[i]) do
  402.     begin
  403.       MenuItem := AMenu.Items;
  404.       FPopupUp := APopupUp;
  405.     end
  406.   else
  407.   else
  408.   if (TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinAnimateObject)
  409.   then
  410.     with TbsSkinAnimateObject(ObjectList.Items[i]) do
  411.       if ButtonStyle
  412.       then
  413.         begin
  414.           MenuItem := AMenu.Items;
  415.           FPopupUp := APopupUp;
  416.         end;
  417. end;
  418. procedure TbsBusinessSkinForm.UpDateForm;
  419. begin
  420.   with FForm do
  421.   begin
  422.     if Width - 1 >= GetMinWidth
  423.     then
  424.       begin
  425.         Width := Width - 1;
  426.         Width := Width + 1;
  427.       end
  428.     else
  429.       begin
  430.         Width := Width + 1;
  431.         Width := Width - 1;
  432.       end;
  433.   end;
  434. end;
  435. procedure TbsBusinessSkinForm.ChangeSkinData;
  436. begin
  437.   OldActiveObject := -1;
  438.   ActiveObject := -1;
  439.   MouseCaptureObject := -1;
  440.   if (FSD = nil) or (FSD.Empty)
  441.   then
  442.     FSkinSupport := False
  443.   else
  444.     FSkinSupport := True;
  445.   if FSkinSupport
  446.   then
  447.     begin
  448.       LoadObjects;
  449.       CheckObjects;
  450.     end
  451.   else
  452.     begin
  453.       ClearObjects;
  454.       CreateNewRegion(True);
  455.     end;
  456.   FInChangeSkinData := True;
  457.   if (FForm.Width < GetMinWidth) and (FForm.Height < GetMinHeight)
  458.   then
  459.     begin
  460.       FForm.SetBounds(FForm.Left, FForm.Top,
  461.                       GetMinWidth, GetMinHeight);
  462.     end
  463.   else
  464.     if FForm.Height < GetMinHeight then FForm.Height := GetMinHeight else
  465.     if FForm.Width < GetMinWidth then FForm.Width := GetMinWidth else
  466.     UpDateForm;
  467.   if (FRollUpState or (FWindowState = wsMinimized)) and
  468.      (FForm.Height <> GetMinHeight)
  469.   then
  470.     FForm.Height := GetMinHeight;
  471.   if (FWindowState = wsMinimized) and (FForm.Width <> GetMinWidth)
  472.   then
  473.     FForm.Width := GetMinWidth;
  474.   FFormWidth := FForm.Width;
  475.   FFormHeight := FForm.Height;
  476.   if FSkinSupport then CreateNewForm(True);
  477.   if (FForm.FormStyle = fsMDIForm)
  478.   then
  479.     begin
  480.       ReDrawWindow(FForm.ClientHandle, nil, 0, RDW_ERASE or RDW_INVALIDATE);
  481.       ResizeMDIChilds;
  482.     end
  483.   else
  484.     FForm.RePaint;
  485.   if (FForm.FormStyle = fsMDIChild) and (WindowState = wsMaximized)
  486.   then FormChangeActive(False)
  487.   else FormChangeActive(True);
  488.   MouseTimer.Enabled := True;
  489.   if Assigned(FOnChangeSkinData) then FOnChangeSkinData(Self);
  490.   FInChangeSkinData := False;
  491.   //
  492.   if (FClientWidth > 0) 
  493.   then FForm.ClientWidth := FClientWidth;
  494.   if FClientHeight > 0
  495.   then FForm.ClientHeight := FClientHeight;
  496.   //
  497. end;
  498. procedure TbsBusinessSkinForm.SetMenusSkinData(Value: TbsSkinData);
  499. begin
  500.   FMSD := Value;
  501. end;
  502. procedure TbsBusinessSkinForm.SetSkinData(Value: TbsSkinData);
  503. begin
  504.   FSD := Value;
  505. //  if (FSD <> nil) then
  506.   if {not FSD.Empty and} not (csDesigning in ComponentState) then ChangeSkinData;
  507.   FSysTrayMenu.SkinData := Value;
  508. end;
  509. procedure TbsBusinessSkinForm.Notification(AComponent: TComponent;
  510.                                           Operation: TOperation);
  511. begin
  512.   inherited Notification(AComponent, Operation);
  513.   if (Operation = opRemove) and (AComponent = FSD)
  514.   then FSD := nil else
  515.   if (Operation = opRemove) and (AComponent = FMSD)
  516.   then FMSD := nil else
  517.   if (Operation = opRemove) and (AComponent = FMainMenu)
  518.   then FMainMenu := nil else
  519.   if (Operation = opRemove) and (AComponent = FSystemMenu)
  520.   then FSystemMenu := nil else
  521.   if (Operation = opRemove) and (AComponent = FMainMenuBar)
  522.   then FMainMenuBar := nil else
  523.   if (Operation = opRemove) and (AComponent = FMDITabsBar)
  524.   then FMDITabsBar := nil else
  525.   if (Operation = opRemove) and (AComponent = FTrayIcon)
  526.   then FTrayIcon := nil;
  527.   if (Operation = opRemove) and (AComponent = FSkinHint)
  528.   then FSkinHint := nil;
  529. end;
  530. procedure TbsBusinessSkinForm.LoadDefObjects;
  531. var
  532.   NotNullRect: TRect;
  533. begin
  534.   ClearObjects;
  535.   NotNullRect := Rect(0, 0, 1, 1);
  536.   ObjectList.Add(TbsSkinStdButtonObject.Create(Self, nil));
  537.   with TbsSkinStdButtonObject(ObjectList.Items[ObjectList.Count - 1]) do
  538.   begin
  539.     SkinRectInAPicture := True;
  540.     SkinRect := NotNullRect;
  541.     ActiveSkinRect := NotNullRect;
  542.     DownRect := NotNullRect;
  543.     Command := cmClose;
  544.     IDName := 'closebutton';
  545.   end;
  546.   ObjectList.Add(TbsSkinStdButtonObject.Create(Self, nil));
  547.   with TbsSkinStdButtonObject(ObjectList.Items[ObjectList.Count - 1]) do
  548.   begin
  549.     SkinRectInAPicture := True;
  550.     SkinRect := NotNullRect;
  551.     ActiveSkinRect := NotNullRect;
  552.     DownRect := NotNullRect;
  553.     Command := cmMaximize;
  554.     IDName := 'maxbutton';
  555.   end;
  556.   ObjectList.Add(TbsSkinStdButtonObject.Create(Self, nil));
  557.   with TbsSkinStdButtonObject(ObjectList.Items[ObjectList.Count - 1]) do
  558.   begin
  559.     SkinRectInAPicture := True;
  560.     SkinRect := NotNullRect;
  561.     ActiveSkinRect := NotNullRect;
  562.     DownRect := NotNullRect;
  563.     Command := cmMinimize;
  564.     IDName := 'minbutton';
  565.   end;
  566.   ObjectList.Add(TbsSkinStdButtonObject.Create(Self, nil));
  567.   with TbsSkinStdButtonObject(ObjectList.Items[ObjectList.Count - 1]) do
  568.   begin
  569.     SkinRectInAPicture := True;
  570.     SkinRect := NotNullRect;
  571.     ActiveSkinRect := NotNullRect;
  572.     DownRect := NotNullRect;
  573.     Command := cmRollUp;
  574.     IDName := 'rollupbutton';
  575.   end;
  576.   ObjectList.Add(TbsSkinStdButtonObject.Create(Self, nil));
  577.   with TbsSkinStdButtonObject(ObjectList.Items[ObjectList.Count - 1]) do
  578.   begin
  579.     SkinRectInAPicture := True;
  580.     SkinRect := NotNullRect;
  581.     ActiveSkinRect := NotNullRect;
  582.     DownRect := NotNullRect;
  583.     Command := cmSysMenu;
  584.     IDName := 'sysmenubutton';
  585.   end;
  586.   ObjectList.Add(TbsSkinStdButtonObject.Create(Self, nil));
  587.   with TbsSkinStdButtonObject(ObjectList.Items[ObjectList.Count - 1]) do
  588.   begin
  589.     SkinRectInAPicture := True;
  590.     SkinRect := NotNullRect;
  591.     ActiveSkinRect := NotNullRect;
  592.     DownRect := NotNullRect;
  593.     Command := cmMinimizeToTray;
  594.     IDName := 'traybutton';
  595.   end;
  596.   CheckObjects;
  597. end;
  598. procedure TbsBusinessSkinForm.LoadObjects;
  599. var
  600.   i: Integer;
  601.   OL: TList;
  602. begin
  603.   ClearObjects;
  604.   OL := FSD.ObjectList;
  605.   for i := 0 to OL.Count - 1 do
  606.   begin
  607.     if (TbsDataSkinObject(OL.Items[i]) is TbsDataSkinMainMenuItem) or
  608.        (TbsDataSkinObject(OL.Items[i]) is TbsDataSkinMenuItem) or
  609.        (TbsDataSkinObject(OL.Items[i]) is TbsDataSkinMainMenuBarButton) 
  610.     then
  611.       begin
  612.       end
  613.     else
  614.     if TbsDataSkinObject(OL.Items[i]) is TbsDataSkinStdButton
  615.     then
  616.       ObjectList.Add(TbsSkinStdButtonObject.Create(Self, TbsDataSkinStdButton(OL.Items[i])))
  617.     else
  618.     if TbsDataSkinObject(OL.Items[i]) is TbsDataSkinButton
  619.     then ObjectList.Add(TbsSkinButtonObject.Create(Self, TbsDataSkinButton(OL.Items[i])))
  620.     else
  621.     if TbsDataSkinObject(OL.Items[i]) is TbsDataSkinCaption
  622.     then ObjectList.Add(TbsSkinCaptionObject.Create(Self, TbsDataSkinCaption(OL.Items[i])))
  623.     else
  624.     if TbsDataSkinObject(OL.Items[i]) is TbsDataSkinAnimate
  625.     then ObjectList.Add(TbsSkinAnimateObject.Create(Self, TbsDataSkinAnimate(OL.Items[i])))
  626.     else
  627.     if TbsDataSkinObject(OL.Items[i]) is TbsDataUserObject
  628.     then ObjectList.Add(TbsUserObject.Create(Self, TbsDataUserObject(OL.Items[i])));
  629.   end;
  630. end;
  631. procedure TbsBusinessSkinForm.ClearObjects;
  632. var
  633.   i: Integer;
  634. begin
  635.   for i := 0 to ObjectList.Count - 1 do
  636.     TbsActiveSkinObject(ObjectList.Items[i]).Free;
  637.   ObjectList.Clear;
  638. end;
  639. procedure TbsBusinessSkinForm.TestActive;
  640. var
  641.   i: Integer;
  642.   B: Boolean;
  643.   ObjHint: String;
  644. begin
  645.   if (ObjectList.Count = 0) or not GetFormActive  then Exit;
  646.   OldActiveObject := ActiveObject;
  647.   i := -1;
  648.   B := False;
  649.   repeat
  650.     Inc(i);
  651.     with TbsActiveSkinObject(ObjectList.Items[i]) do
  652.     begin
  653.       if Enabled and Visible
  654.       then
  655.         B := PtInRect(ObjectRect, Point(X, Y));
  656.     end;
  657.   until B or (i = ObjectList.Count - 1);
  658.   if B and InFrm then ActiveObject := i else ActiveObject := -1;
  659.   if (MouseCaptureObject <> -1) and
  660.      (ActiveObject <> MouseCaptureObject) and (ActiveObject <> -1)
  661.   then
  662.     ActiveObject := -1;
  663.   if OldActiveObject >= ObjectList.Count then OldActiveObject := -1;
  664.   if ActiveObject >= ObjectList.Count then ActiveObject := -1;
  665.   if (OldActiveObject <> ActiveObject)
  666.   then
  667.     begin
  668.       if OldActiveObject <> - 1
  669.       then
  670.         begin
  671.           if TbsActiveSkinObject(ObjectList.Items[OldActiveObject]).Enabled and
  672.              TbsActiveSkinObject(ObjectList.Items[OldActiveObject]).Visible
  673.           then TbsActiveSkinObject(ObjectList.Items[OldActiveObject]).MouseLeave;
  674.           if FShowObjectHint and (FSkinHint <> nil) and
  675.              TbsActiveSkinObject(ObjectList.Items[OldActiveObject]).Enabled and
  676.              TbsActiveSkinObject(ObjectList.Items[OldActiveObject]).Visible and
  677.              (TbsActiveSkinObject(ObjectList.Items[OldActiveObject]).Hint <> '')
  678.           then FSkinHint.HideHint;
  679.         end;
  680.       if ActiveObject <> -1
  681.       then
  682.         begin
  683.           if TbsActiveSkinObject(ObjectList.Items[ActiveObject]).Enabled and
  684.              TbsActiveSkinObject(ObjectList.Items[ActiveObject]).Visible
  685.           then TbsActiveSkinObject(ObjectList.Items[ActiveObject]).MouseEnter;
  686.           // show object hint
  687.           if FShowObjectHint and (FSkinHint <> nil) and
  688.              TbsActiveSkinObject(ObjectList.Items[ActiveObject]).Enabled and
  689.              TbsActiveSkinObject(ObjectList.Items[ActiveObject]).Visible
  690.           then
  691.             begin
  692.               ObjHint := TbsActiveSkinObject(ObjectList.Items[ActiveObject]).Hint;
  693.               if ObjHint <> '' then FSkinHint.ActivateHint2(ObjHint);
  694.             end;
  695.           //
  696.         end;
  697.     end;
  698. end;
  699. procedure TbsBusinessSkinForm.TestMouse;
  700. var
  701.   P: TPoint;
  702. begin
  703.   if not GetFormActive then Exit;
  704.   GetCursorPos(P);
  705.   if not FSizeMove then
  706.   begin
  707.     PointToNCPoint(P);
  708.     if not PtInRect(NewClRect, P)
  709.     then
  710.       TestActive(P.X, P.Y, True)
  711.     else
  712.      if ActiveObject <> -1 then TestActive(-1, -1, True);
  713.    end
  714.    else
  715.      MouseTimer.Enabled := False;
  716. end;
  717. procedure TbsBusinessSkinForm.PaintEvent;
  718. begin
  719.   if Assigned(FOnPaintEvent) then FOnPaintEvent(IDName, Canvas, ObjectRect);
  720. end;
  721. procedure TbsBusinessSkinForm.MouseUpEvent;
  722. begin
  723.   if Assigned(FOnMouseUpEvent)
  724.   then FOnMouseUpEvent(IDName, X, Y, ObjectRect, Button);
  725. end;
  726. procedure TbsBusinessSkinForm.MouseDownEvent;
  727. begin
  728.   if Assigned(FOnMouseDownEvent)
  729.   then FOnMouseDownEvent(IDName, X, Y, ObjectRect, Button);
  730. end;
  731. procedure TbsBusinessSkinForm.MouseMoveEvent;
  732. begin
  733.   if Assigned(FOnMouseMoveEvent)
  734.   then FOnMouseMoveEvent(IDName, X, Y, ObjectRect);
  735. end;
  736. procedure TbsBusinessSkinForm.MouseEnterEvent;
  737. begin
  738.   if Assigned(FOnMouseEnterEvent) then FOnMouseEnterEvent(IDName);
  739. end;
  740. procedure TbsBusinessSkinForm.MouseLeaveEvent;
  741. begin
  742.   if Assigned(FOnMouseLeaveEvent) then FOnMouseLeaveEvent(IDName);
  743. end;
  744. procedure TbsBusinessSkinForm.MouseMove;
  745. begin
  746.   if MouseCaptureObject <> -1
  747.   then TbsActiveSkinObject(ObjectList.Items[MouseCaptureObject]).MouseMove(X, Y)
  748.   else
  749.   if ActiveObject <> -1
  750.   then TbsActiveSkinObject(ObjectList.Items[ActiveObject]).MouseMove(X, Y);
  751. end;
  752. procedure TbsBusinessSkinForm.MouseDblClick;
  753. begin
  754.   if (ActiveObject <> - 1) then
  755.   with TbsActiveSkinObject(ObjectList.Items[ActiveObject]) do
  756.   begin
  757.     DblClick;
  758.   end;
  759. end;
  760. procedure TbsBusinessSkinForm.MouseDown;
  761. begin
  762.   if (ActiveObject <> - 1) then
  763.   with TbsActiveSkinObject(ObjectList.Items[ActiveObject]) do
  764.   begin
  765.     if not (TbsActiveSkinObject(ObjectList.Items[ActiveObject]) is
  766.             TbsSkinCaptionObject)
  767.     then SetCapture(FForm.Handle);
  768.     MouseCaptureObject := ActiveObject;
  769.     MouseDown(X, Y, Button);
  770.   end;
  771. end;
  772. procedure TbsBusinessSkinForm.MouseUp;
  773. begin
  774.   if (MouseCaptureObject <> -1)
  775.   then
  776.     begin
  777.       if not (TbsActiveSkinObject(ObjectList.Items[MouseCaptureObject]) is
  778.       TbsSkinCaptionObject)
  779.       then ReleaseCapture;
  780.       TbsActiveSkinObject(ObjectList.Items[MouseCaptureObject]).MouseUp(X, Y, Button);
  781.       MouseCaptureObject := -1;
  782.     end;
  783. end;
  784. function TbsBusinessSkinForm.CalcRealObjectRect;
  785. var
  786.   NewR: TRect;
  787.   LeftTop, LeftBottom, RightTop, RightBottom: TRect;
  788.   OffsetX, OffsetY: Integer;
  789. function CorrectResizeRect: TRect;
  790. var
  791.   NR: TRect;
  792. begin
  793.   NR := R;
  794.   if PtInRect(LeftTop, R.TopLeft) and
  795.      PtInRect(RightBottom, R.BottomRight)
  796.   then
  797.     begin
  798.       Inc(NR.Right, OffsetX);
  799.       Inc(NR.Bottom, OffsetY);
  800.     end
  801.   else
  802.   if PtInRect(LeftTop, R.TopLeft) and
  803.      PtInRect(RightTop, R.BottomRight)
  804.   then
  805.     Inc(NR.Right, OffsetX)
  806.   else
  807.     if PtInRect(LeftBottom, R.TopLeft) and
  808.        PtInRect(RightBottom, R.BottomRight)
  809.     then
  810.       begin
  811.         Inc(NR.Right, OffsetX);
  812.         OffsetRect(NR, 0, OffsetY);
  813.       end
  814.     else
  815.       if PtInRect(LeftTop, R.TopLeft) and
  816.          PtInRect(LeftBottom, R.BottomRight)
  817.       then
  818.         Inc(NR.Bottom, OffsetY)
  819.       else
  820.         if PtInRect(RightTop, R.TopLeft) and
  821.            PtInRect(RightBottom, R.BottomRight)
  822.         then
  823.           begin
  824.             OffsetRect(NR, OffsetX, 0);
  825.             Inc(NR.Bottom, OffsetY);
  826.           end;
  827.   Result := NR;
  828. end;
  829. begin
  830.   LeftTop := Rect(0, 0, FSD.LTPoint.X, FSD.LTPoint.Y);
  831.   LeftBottom := Rect(0, FSD.LBPoint.Y, FSD.LBPoint.X, FSD.FPicture.Height);
  832.   RightTop := Rect(FSD.RTPoint.X, 0, FSD.FPicture.Width, FSD.RTPoint.Y);
  833.   RightBottom := Rect(FSD.RBPoint.X, FSD.RBPoint.Y, FSD.FPicture.Width, FSD.FPicture.Height);
  834.   OffsetX := NewRBPoint.X - FSD.RBPoint.X;
  835.   OffsetY := NewRBPoint.Y - FSD.RBPoint.Y;
  836.   NewR := R;
  837.   if RectInRect(R, LeftTop)
  838.   then NewR := R
  839.   else
  840.     if RectInRect(R, RightTop)
  841.     then OffsetRect(NewR, OffsetX, 0)
  842.     else
  843.       if RectInRect(R, LeftBottom)
  844.       then OffsetRect(NewR, 0, OffsetY)
  845.       else
  846.         if RectInRect(R, RightBottom)
  847.         then
  848.           OffsetRect(NewR,  OffsetX, OffsetY)
  849.         else
  850.           NewR := CorrectResizeRect;
  851.   Result := NewR;
  852. end;
  853. procedure TbsBusinessSkinForm.CalcAllRealObjectRect;
  854. var
  855.   i: Integer;
  856.   OffsetX, OffsetY, BW, BH: Integer;
  857.   Button: TbsActiveSkinObject;
  858.   C: TbsSkinCaptionObject;
  859. function GetCaption: TbsSkinCaptionObject;
  860. var
  861.   I: Integer;
  862. begin
  863.   Result := nil;
  864.   for I := 0 to ObjectList.Count - 1 do
  865.     if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinCaptionObject
  866.     then
  867.       begin
  868.         Result := TbsSkinCaptionObject(ObjectList.Items[I]);
  869.         Break;
  870.       end;
  871. end;
  872. function GetStdButton(C: TbsStdCommand): TbsActiveSkinObject;
  873. var
  874.   I: Integer;
  875. begin
  876.   Result := nil;
  877.   for I := 0 to ObjectList.Count - 1 do
  878.     if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinStdButtonObject
  879.     then
  880.       begin
  881.         with TbsSkinStdButtonObject(ObjectList.Items[I]) do
  882.         if Visible and SkinRectInAPicture and (Command = C)
  883.         then
  884.           begin
  885.             Result := TbsActiveSkinObject(ObjectList.Items[I]);
  886.             Break;
  887.           end;
  888.       end
  889.    else
  890.      if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinAnimateObject
  891.      then
  892.        begin
  893.           with TbsSkinAnimateObject(ObjectList.Items[I]) do
  894.           if Visible and SkinRectInAPicture and (Command = C)
  895.           then
  896.             begin
  897.               Result := TbsActiveSkinObject(ObjectList.Items[I]);
  898.               Break;
  899.             end;
  900.         end;
  901. end;
  902. procedure SetStdButtonRect(B: TbsActiveSkinObject);
  903. begin
  904.   if (B <> nil) and (B is TbsSkinStdButtonObject)
  905.   then
  906.     begin
  907.       with TbsSkinStdButtonObject(B) do
  908.       begin
  909.         if (Command = cmSysMenu) and Parent.ShowIcon and SkinRectInAPicture
  910.         then
  911.           GetIconSize(BW, BH)
  912.         else
  913.           begin
  914.             BW := RectWidth(SkinRect);
  915.             BH := RectHeight(SkinRect);
  916.           end;
  917.         ObjectRect := Rect(OffsetX - BW, OffsetY, OffsetX, OffsetY + BH);
  918.         OffsetX := OffsetX - NewButtonsOffset - BW;
  919.       end;
  920.     end
  921.   else
  922.   if (B <> nil) and (B is TbsSkinAnimateObject)
  923.   then
  924.     begin
  925.       with TbsSkinAnimateObject(B) do
  926.       begin
  927.         BW := RectWidth(SkinRect);
  928.         BH := RectHeight(SkinRect);
  929.         ObjectRect := Rect(OffsetX - BW, OffsetY, OffsetX, OffsetY + BH);
  930.         OffsetX := OffsetX - NewButtonsOffset - BW;
  931.       end;
  932.     end
  933. end;
  934. procedure SetStdButtonRect2(B: TbsActiveSkinObject);
  935. begin
  936.   if (B <> nil) and (B is TbsSkinStdButtonObject)
  937.   then
  938.     begin
  939.       with TbsSkinStdButtonObject(B) do
  940.       begin
  941.         if (Command = cmSysMenu) and Parent.ShowIcon and SkinRectInAPicture
  942.         then
  943.           GetIconSize(BW, BH)
  944.         else
  945.           begin
  946.             BW := RectWidth(SkinRect);
  947.             BH := RectHeight(SkinRect);
  948.           end;
  949.         ObjectRect := Rect(OffsetX, OffsetY, OffsetX + BW, OffsetY + BH);
  950.         OffsetX := OffsetX + NewButtonsOffset + BW;
  951.       end;
  952.     end
  953.   else
  954.   if (B <> nil) and (B is TbsSkinAnimateObject)
  955.   then
  956.     begin
  957.       with TbsSkinAnimateObject(B) do
  958.       begin
  959.         BW := RectWidth(SkinRect);
  960.         BH := RectHeight(SkinRect);
  961.         ObjectRect := Rect(OffsetX, OffsetY, OffsetX + BW, OffsetY + BH);
  962.         OffsetX := OffsetX + NewButtonsOffset + BW;
  963.       end;
  964.     end
  965. end;
  966. procedure SetStdObjectsRect;
  967. var
  968.   I: Integer;
  969. begin
  970.   Button := GetStdButton(cmClose);
  971.   SetStdButtonRect(Button);
  972.   Button := GetStdButton(cmMaximize);
  973.   SetStdButtonRect(Button);
  974.   Button := GetStdButton(cmMinimize);
  975.   SetStdButtonRect(Button);
  976.   Button := GetStdButton(cmRollUp);
  977.   SetStdButtonRect(Button);
  978.   Button := GetStdButton(cmMinimizeToTray);
  979.   SetStdButtonRect(Button);
  980.   // custom buttons
  981.   for I := 0 to ObjectList.Count - 1 do
  982.     if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinStdButtonObject
  983.     then
  984.       begin
  985.         with TbsSkinStdButtonObject(ObjectList.Items[I]) do
  986.         if Visible and SkinRectInAPicture and (Command = cmDefault)
  987.         then
  988.           begin
  989.             Button := TbsActiveSkinObject(ObjectList.Items[I]);
  990.             SetStdButtonRect(Button);
  991.           end;
  992.       end
  993.    else
  994.      if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinAnimateObject
  995.      then
  996.        begin
  997.           with TbsSkinAnimateObject(ObjectList.Items[I]) do
  998.           if Visible and SkinRectInAPicture and (Command = cmDefault)
  999.           then
  1000.             begin
  1001.               Button := TbsActiveSkinObject(ObjectList.Items[I]);
  1002.               SetStdButtonRect(Button);
  1003.             end;
  1004.         end;
  1005.   //
  1006.   C := GetCaption;
  1007.   if IsNullRect(NewButtonsRect) and (C <> nil)
  1008.   then
  1009.     C.ObjectRect.Right := OffsetX + NewButtonsOffset;
  1010.   OffsetX := NewCaptionRect.Left;
  1011.   Button := GetStdButton(cmSysMenu);
  1012.   if Button <> nil
  1013.   then
  1014.     begin
  1015.       OffsetY := NewCaptionRect.Top;
  1016.       SetStdButtonRect2(Button);
  1017.       Button.ObjectRect.Top := OffsetY + RectHeight(NewCaptionRect) div 2  -
  1018.       BH div 2;
  1019.       Button.ObjectRect.Bottom := Button.ObjectRect.Top + BH;
  1020.       if C <> nil
  1021.       then
  1022.         C.ObjectRect.Left := OffsetX - NewButtonsOffset;
  1023.     end;
  1024. end;
  1025. procedure SetStdObjectsRect2;
  1026. var
  1027.   I: Integer;
  1028. begin
  1029.   Button := GetStdButton(cmClose);
  1030.   SetStdButtonRect2(Button);
  1031.   Button := GetStdButton(cmMaximize);
  1032.   SetStdButtonRect2(Button);
  1033.   Button := GetStdButton(cmMinimize);
  1034.   SetStdButtonRect2(Button);
  1035.   Button := GetStdButton(cmRollUp);
  1036.   SetStdButtonRect2(Button);
  1037.   Button := GetStdButton(cmMinimizeToTray);
  1038.   SetStdButtonRect2(Button);
  1039.   // custom buttons
  1040.   for I := 0 to ObjectList.Count - 1 do
  1041.     if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinStdButtonObject
  1042.     then
  1043.       begin
  1044.         with TbsSkinStdButtonObject(ObjectList.Items[I]) do
  1045.         if Visible and SkinRectInAPicture and (Command = cmDefault)
  1046.         then
  1047.           begin
  1048.             Button := TbsActiveSkinObject(ObjectList.Items[I]);
  1049.             SetStdButtonRect2(Button);
  1050.           end;
  1051.       end
  1052.    else
  1053.      if TbsActiveSkinObject(ObjectList.Items[I]) is TbsSkinAnimateObject
  1054.      then
  1055.        begin
  1056.           with TbsSkinAnimateObject(ObjectList.Items[I]) do
  1057.           if Visible and SkinRectInAPicture and (Command = cmDefault)
  1058.           then
  1059.             begin
  1060.               Button := TbsActiveSkinObject(ObjectList.Items[I]);
  1061.               SetStdButtonRect2(Button);
  1062.             end;
  1063.         end;
  1064.   //
  1065.   if IsNullRect(NewButtonsRect) and NewButtonsInLeft
  1066.   then
  1067.     begin
  1068.       Button := GetStdButton(cmSysmenu);
  1069.       SetStdButtonRect2(Button);
  1070.     end;
  1071.   C := GetCaption;
  1072.   if IsNullRect(NewButtonsRect) and (C <> nil)
  1073.   then C.ObjectRect.Left := OffsetX + NewButtonsOffset;
  1074.   if not NewButtonsInLeft and not IsNullRect(NewCaptionRect)
  1075.   then
  1076.     begin
  1077.       OffsetY := NewCaptionRect.Top;
  1078.       OffsetX := NewCaptionRect.Left;
  1079.       Button := GetStdButton(cmSysMenu);
  1080.       if Button <> nil
  1081.       then
  1082.         begin
  1083.           SetStdButtonRect2(Button);
  1084.           Button.ObjectRect.Top := OffsetY + RectHeight(NewCaptionRect) div 2  -
  1085.             BH div 2;
  1086.           Button.ObjectRect.Bottom := Button.ObjectRect.Top + BH;
  1087.           if C <> nil
  1088.           then
  1089.             C.ObjectRect.Left := OffsetX - NewButtonsOffset;
  1090.         end;    
  1091.     end;
  1092. end;
  1093. begin
  1094.   for i := 0 to ObjectList.Count - 1 do
  1095.     with TbsActiveSkinObject(ObjectList.Items[i]) do
  1096.       if not SkinRectInAPicture
  1097.       then
  1098.         ObjectRect := CalcRealObjectRect(SkinRect);
  1099.   // caption buttons rects
  1100.   if IsNullRect(NewButtonsRect) and not IsNullRect(NewCaptionRect)
  1101.   then
  1102.     begin
  1103.       OffsetY := NewCaptionRect.Top;
  1104.       if not NewButtonsInLeft
  1105.       then
  1106.         begin
  1107.           OffsetX := NewCaptionRect.Right;
  1108.           SetStdObjectsRect;
  1109.         end
  1110.       else
  1111.         begin
  1112.           OffsetX := NewCaptionRect.Left;
  1113.           SetStdObjectsRect2;
  1114.         end;
  1115.     end
  1116.   else
  1117.   if not IsNullRect(NewButtonsRect)
  1118.   then
  1119.     begin
  1120.       OffsetY := NewButtonsRect.Top;
  1121.       if not NewButtonsInLeft
  1122.       then
  1123.         begin
  1124.           OffsetX := NewButtonsRect.Right;
  1125.           SetStdObjectsRect;
  1126.         end
  1127.       else
  1128.         begin
  1129.           OffsetX := NewButtonsRect.Left;
  1130.           SetStdObjectsRect2;
  1131.         end;
  1132.     end;
  1133.   //
  1134. end;
  1135. procedure TbsBusinessSkinForm.PaintBG2(DC: HDC);
  1136. var
  1137.   C: TCanvas;
  1138.   X, Y, XCnt, YCnt: Integer;
  1139.   B: TBitMap;
  1140. begin
  1141.   if (FSD = nil) or FSD.Empty then Exit;
  1142.   C := TCanvas.Create;
  1143.   C.Handle := DC;
  1144.   B := TBitMap(FSD.FActivePictures.Items[FSD.BGPictureIndex]);
  1145.   if (FForm.ClientWidth > 0) and (FForm.ClientHeight > 0)
  1146.   then
  1147.     begin
  1148.       XCnt := FForm.ClientWidth div B.Width;
  1149.       YCnt := FForm.ClientHeight div B.Height;
  1150.       for X := 0 to XCnt do
  1151.       for Y := 0 to YCnt do
  1152.         C.Draw(X * B.Width, Y * B.Height, B);
  1153.     end;
  1154.   if not FLogoBitMap.Empty then DrawLogoBitMap(C);
  1155.   C.Free;
  1156. end;
  1157. procedure TbsBusinessSkinForm.PaintBG3(DC: HDC);
  1158. var
  1159.   C: TCanvas;
  1160.   X, Y, XCnt, YCnt: Integer;
  1161.   B: TBitMap;
  1162. begin
  1163.   if (FSD = nil) or FSD.Empty then Exit;
  1164.   C := TCanvas.Create;
  1165.   C.Handle := DC;
  1166.   B := TBitMap(FSD.FActivePictures.Items[FSD.MDIBGPictureIndex]);
  1167.   if (FForm.ClientWidth > 0) and (FForm.ClientHeight > 0)
  1168.   then
  1169.     begin
  1170.       XCnt := FForm.ClientWidth div B.Width;
  1171.       YCnt := FForm.ClientHeight div B.Height;
  1172.       for X := 0 to XCnt do
  1173.       for Y := 0 to YCnt do
  1174.         C.Draw(X * B.Width, Y * B.Height, B);
  1175.     end;
  1176.   if not FLogoBitMap.Empty then DrawLogoBitMap(C);
  1177.   C.Free;
  1178. end;
  1179. procedure TbsBusinessSkinForm.PaintBG(DC: HDC);
  1180. var
  1181.   C: TCanvas;
  1182.   X, Y, XCnt, YCnt, w, h, rw, rh: Integer;
  1183.   R: TRect;
  1184.   BGImage: TBitMap;
  1185. begin
  1186.   if (FSD = nil) or FSD.Empty then Exit;
  1187.   C := TCanvas.Create;
  1188.   C.Handle := DC;
  1189.   if IsNullRect(FSD.ClRect)
  1190.   then
  1191.     begin
  1192.       with C do
  1193.       begin
  1194.         Brush.Color := clBtnFace;
  1195.         R := FForm.ClientRect;
  1196.         FillRect(R);
  1197.       end;
  1198.       C.Free;
  1199.       Exit;
  1200.     end;
  1201.   BGImage := TBitMap.Create;
  1202.   BGImage.Width := RectWidth(FSD.ClRect);
  1203.   BGImage.Height := RectHeight(FSD.ClRect);
  1204.   BGImage.Canvas.CopyRect(Rect(0, 0, BGImage.Width, BGImage.Height),
  1205.     FSD.FPicture.Canvas, Rect(FSD.ClRect.Left, FSD.ClRect.Top,
  1206.                               FSD.ClRect.Right, FSD.ClRect.Bottom));
  1207.   if (FForm.ClientWidth > 0) and (FForm.ClientHeight > 0)
  1208.   then
  1209.     begin
  1210.       w := RectWidth(FSD.ClRect);
  1211.       h := RectHeight(FSD.ClRect);
  1212.       rw := FForm.ClientWidth;
  1213.       rh := FForm.ClientHeight;
  1214.       XCnt := rw div w;
  1215.       YCnt := rh div h;
  1216.       for X := 0 to XCnt do
  1217.       for Y := 0 to YCnt do
  1218.         C.Draw(X * w, Y * h, BGImage);
  1219.     end;
  1220.   BGImage.Free;
  1221.   if not FLogoBitMap.Empty then DrawLogoBitMap(C);
  1222.   C.Free;
  1223. end;
  1224. function TbsBusinessSkinForm.GetDefCaptionRect: TRect;
  1225. begin
  1226.   CalcDefRects;
  1227.   Result :=  NewDefCaptionRect;
  1228. end;
  1229. function TbsBusinessSkinForm.NewDefNCHitTest;
  1230. const
  1231.   Offset = 2;
  1232. var
  1233.   CR: TRect;
  1234. begin
  1235.   if (FWindowState = wsMaximized) or FRollUpState or not IsSizeAble or
  1236.      (FWindowState = wsMinimized)
  1237.   then
  1238.     with FForm do
  1239.     begin
  1240.       CR := GetDefCaptionRect;
  1241.       if PtInRect(CR, P)
  1242.       then
  1243.         Result := HTCAPTION
  1244.       else
  1245.       if PtInRect(Rect(3, GetDefCaptionHeight + 3, Width - 3, Height - 3), P)
  1246.       then
  1247.         Result := HTCLIENT
  1248.       else
  1249.         Result := HTNCACTIVE;
  1250.     end
  1251.   else
  1252.   if (ActiveObject <> -1)
  1253.   then
  1254.     begin
  1255.       Result := HTNCACTIVE;
  1256.     end
  1257.   else
  1258.   with FForm do
  1259.   if (P.X <= Offset) and (P.Y <= Offset)
  1260.   then
  1261.     Result := HTTOPLEFT
  1262.   else
  1263.   if (P.X >= Width - Offset) and (P.Y <= Offset)
  1264.   then
  1265.      Result := HTTOPRIGHT
  1266.   else
  1267.   if (P.X <= Offset) and (P.Y >= Height - Offset)
  1268.   then
  1269.     Result := HTBOTTOMLEFT
  1270.   else
  1271.   if (P.X >= Width - Offset) and (P.Y >= Height - Offset)
  1272.   then
  1273.     Result := HTBOTTOMRIGHT
  1274.   else
  1275.   if (P.X <= Offset)
  1276.   then
  1277.     Result := HTLEFT
  1278.   else
  1279.   if (P.Y <= Offset)
  1280.   then
  1281.     Result := HTTOP
  1282.   else
  1283.   if (P.X >= Width - Offset)
  1284.   then
  1285.     Result := HTRIGHT
  1286.   else
  1287.   if (P.Y >= Height - Offset)
  1288.   then
  1289.     Result := HTBOTTOM
  1290.   else
  1291.     begin
  1292.       CR := GetDefCaptionRect;
  1293.       if PtInRect(CR, P)
  1294.       then
  1295.         Result := HTCAPTION
  1296.       else
  1297.       if PtInRect(Rect(3, GetDefCaptionHeight + 3, Width - 3, Height - 3), P)
  1298.       then
  1299.         Result := HTCLIENT
  1300.       else
  1301.         Result := HTNCACTIVE;
  1302.     end
  1303. end;
  1304. function TbsBusinessSkinForm.NewNCHitTest(P: TPoint): Integer;
  1305. var
  1306.   LP, TP, RP, BP: TPoint;
  1307.   CR: TRect;
  1308.   BW: Integer;
  1309. function InCaption: Boolean;
  1310. var
  1311.   i: Integer;
  1312. begin
  1313.   Result := False;
  1314.   for i := 0 to ObjectList.Count - 1 do
  1315.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinCaptionObject
  1316.     then
  1317.       with TbsSkinCaptionObject(ObjectList.Items[i]) do
  1318.        if PtInRect(ObjectRect, P)
  1319.        then
  1320.          begin
  1321.            Result := True;
  1322.            Break;
  1323.          end;
  1324. end;
  1325. function CanHit: Boolean;
  1326. begin
  1327.   if FSD.FMask.Empty
  1328.   then
  1329.     begin
  1330.       Result := not (PtInRect(CR, LP) and PtInRect(CR, TP) and
  1331.                      PtInRect(CR, RP) and PtInRect(CR, BP));
  1332.     end
  1333.   else
  1334.     Result := not PtInRect(NewMaskRectArea, P) and
  1335.               not (PtInMask(LP) and PtInMask(TP) and
  1336.                    PtInMask(RP) and PtInMask(BP));
  1337. end;
  1338. begin
  1339.   if FRollUpState or (WindowState = wsMinimized)
  1340.   then
  1341.     begin
  1342.       if InCaption
  1343.       then Result := HTCAPTION
  1344.       else Result := HTNCACTIVE;
  1345.     end
  1346.   else
  1347.   if (ActiveObject <> -1) and not InCaption and not PtInRect(NewClRect, P) and
  1348.      not FSizeMove
  1349.   then
  1350.     begin
  1351.       Result := HTNCACTIVE;
  1352.     end
  1353.   else
  1354.   if (WindowState = wsMaximized) or not IsSizeAble
  1355.   then
  1356.     begin
  1357.       if PtInRect(NewClRect, P)
  1358.       then
  1359.         Result := HTCLIENT
  1360.       else
  1361.       if InCaption
  1362.       then Result := HTCAPTION
  1363.       else Result := HTNCACTIVE;
  1364.     end
  1365.   else
  1366.     begin
  1367.       BW := FSD.BorderW;
  1368.       LP := Point(P.X - BW, P.Y);
  1369.       TP := Point(P.X, P.Y - BW);
  1370.       RP := Point(P.X + BW, P.Y);
  1371.       BP := Point(P.X, P.Y + BW);
  1372.       CR := Rect(0, 0, FForm.Width, FForm.Height);
  1373.       if CanHit
  1374.       then
  1375.         begin
  1376.           if (P.X <= NewHitTestLtPoint.X) and (P.Y <= NewHitTestLtPoint.Y)
  1377.           then
  1378.             Result := HTTOPLEFT
  1379.           else
  1380.           if (P.X >= NewHitTestRTPoint.X) and (P.Y <= NewHitTestRTPoint.Y)
  1381.           then
  1382.             Result := HTTOPRIGHT
  1383.           else
  1384.           if (P.X <= NewHitTestLBPoint.X) and (P.Y >= NewHitTestLBPoint.Y)
  1385.           then
  1386.             Result := HTBOTTOMLEFT
  1387.           else
  1388.           if (P.X >= NewHitTestRBPoint.X) and (P.Y >= NewHitTestRBPoint.Y)
  1389.           then
  1390.             Result := HTBOTTOMRIGHT
  1391.           else
  1392.           if PtInRect(Rect(NewHitTestLTPoint.X, 0,
  1393.                NewHitTestRTPoint.X, NewClRect.Top), P)
  1394.           then
  1395.             Result := HTTOP
  1396.           else
  1397.           if PtInRect(Rect(NewHitTestLBPoint.X, NewClRect.Bottom,
  1398.                NewHitTestRBPoint.X, CR.Bottom), P)
  1399.           then
  1400.             Result := HTBOTTOM
  1401.           else
  1402.           if PtInRect(Rect(0, NewHitTestLTPoint.Y,
  1403.                NewCLRect.Left, NewHitTestLBPoint.Y), P)
  1404.           then
  1405.             Result := HTLEFT
  1406.           else
  1407.           if PtInRect(Rect(NewClRect.Right, NewHitTestRTPoint.Y,
  1408.                CR.Right, NewHitTestRBPoint.Y), P)
  1409.           then
  1410.             Result := HTRIGHT
  1411.           else
  1412.           if PtInRect(NewClRect, P)
  1413.           then
  1414.             Result := HTCLIENT
  1415.           else
  1416.             if InCaption
  1417.             then Result := HTCAPTION
  1418.             else Result := HTNCACTIVE;
  1419.         end
  1420.       else
  1421.         if PtInRect(NewClRect, P)
  1422.         then
  1423.           begin
  1424.             Result := HTCLIENT
  1425.           end  
  1426.         else
  1427.           if InCaption
  1428.           then Result := HTCAPTION
  1429.           else Result := HTNCACTIVE;
  1430.     end;
  1431. end;
  1432. function TbsBusinessSkinForm.FindHotKeyItem;
  1433. begin
  1434.   if FMainMenuBar <> nil
  1435.   then
  1436.     Result := FMainMenuBar.FindHotKeyItem(CharCode)
  1437.   else
  1438.     Result := False;
  1439. end;
  1440. function TbsBusinessSkinForm.CanNextMainMenuItem;
  1441. var
  1442.   PW: TbsSkinPopupWindow;
  1443. begin
  1444.   if SkinMenu.FPopupList.Count = 0
  1445.   then
  1446.     Result := True
  1447.   else
  1448.     with SkinMenu do
  1449.     begin
  1450.       PW := TbsSkinPopupWindow(FPopupList.Items[FPopupList.Count - 1]);
  1451.       if PW.ActiveItem <> -1
  1452.       then
  1453.         begin
  1454.           if TbsSkinMenuItem(PW.ItemList[PW.ActiveItem]).MenuItem.Count = 0
  1455.           then
  1456.             Result := True
  1457.           else
  1458.             Result := False;   
  1459.         end
  1460.       else
  1461.         Result := True
  1462.     end;
  1463. end;
  1464. function TbsBusinessSkinForm.CanPriorMainMenuItem;
  1465. begin
  1466.   if SkinMenu.FPopupList.Count < 2 then Result := True else Result := False;
  1467. end;
  1468. function TbsBusinessSkinForm.CheckReturnKey;
  1469. begin
  1470.   if FMainMenuBar <> nil
  1471.   then
  1472.     Result := FMainMenuBar.CheckReturnKey
  1473.   else
  1474.     Result := False;
  1475. end;
  1476. procedure TbsBusinessSkinForm.FormClientWindowProcHook(var Message: TMessage);
  1477. var
  1478.   FOld: Boolean;
  1479.   R: TRect;
  1480. begin
  1481.   FOld := True;
  1482.   case Message.Msg of
  1483.     WM_NCACTIVATE:
  1484.       begin
  1485.         FOld := False;
  1486.         Message.Result := 1;
  1487.       end;
  1488.     WM_NCCALCSIZE:
  1489.       begin
  1490.         FOLd := False;
  1491.       end;
  1492.     WM_SIZE:
  1493.       begin
  1494.         Message.Result := CallWindowProc(FPrevClientProc, FForm.ClientHandle, Message.Msg,
  1495.                                  Message.wParam, Message.lParam);
  1496.         ResizeMDIChilds;
  1497.         FOld := False;
  1498.         R := Rect(0, 0, FForm.ClientWidth, FForm.ClientHeight);
  1499.         if not FLogoBitMap.Empty
  1500.         then
  1501.           ReDrawWindow(FForm.ClientHandle, @R, 0, RDW_ERASE or RDW_INVALIDATE);
  1502.       end;
  1503.     WM_NCPAINT:
  1504.       begin
  1505.         FOld := False;
  1506.       end;
  1507.     WM_ERASEBKGND:
  1508.       begin
  1509.         FOld := False;
  1510.         if (FSD <> nil) and not FSD.Empty
  1511.         then
  1512.           begin
  1513.             if FSD.MDIBGPictureIndex <> -1
  1514.             then
  1515.               PaintBG3(TWMERASEBKGND(Message).DC)
  1516.             else
  1517.             if FSD.BGPictureIndex = -1
  1518.             then
  1519.               PaintBG(TWMERASEBKGND(Message).DC)
  1520.             else
  1521.               PaintBG2(TWMERASEBKGND(Message).DC);
  1522.           end
  1523.         else
  1524.           PaintMDIBGDefault(TWMERASEBKGND(Message).DC);
  1525.       end;
  1526.   end;
  1527.   if FOld
  1528.   then
  1529.     with Message do
  1530.       Result := CallWindowProc(FPrevClientProc, FForm.ClientHandle, Msg,
  1531.                                wParam, lParam);
  1532. end;
  1533. procedure TbsBusinessSkinForm.FormKeyDown(Message: TMessage);
  1534. var
  1535.   BSF: TbsBusinessSkinForm;
  1536. begin
  1537.   if (FForm.FormStyle = fsMDIChild)
  1538.   then
  1539.     begin
  1540.       BSF := GetBusinessSkinFormComponent(Application.MainForm);
  1541.       if BSF <> nil
  1542.       then
  1543.         begin
  1544.           if BSF.InMenu or BSF.InMainMenu or BSF.SkinMenu.Visible
  1545.           then
  1546.             begin
  1547.               BSF.FormKeyDown(Message);
  1548.               Exit;
  1549.             end;
  1550.         end;
  1551.     end;
  1552.   if InMainMenu and FindHotKeyItem(TWMKeyDown(Message).CharCode)
  1553.   then
  1554.     begin       
  1555.     end
  1556.   else
  1557.   if (TWMKeyDown(Message).CharCode = VK_ESCAPE) and
  1558.      (InMainMenu and not InMenu)
  1559.   then
  1560.     SkinMainMenuClose
  1561.   else
  1562.     if (TWMKeyDown(Message).CharCode = VK_LEFT) and InMainMenu and
  1563.        CanPriorMainMenuItem
  1564.     then
  1565.       begin
  1566.         if FMainMenuBar <> nil
  1567.         then FMainMenuBar.PriorMainMenuItem;
  1568.       end
  1569.     else
  1570.       if (TWMKeyDown(Message).CharCode = VK_RIGHT) and InMainMenu and
  1571.            CanNextMainMenuItem
  1572.       then
  1573.         begin
  1574.           if FMainMenuBar <> nil
  1575.           then FMainMenuBar.NextMainMenuItem;
  1576.         end
  1577.       else
  1578.        if TWMKeyDown(Message).CharCode = VK_RETURN
  1579.        then
  1580.          begin
  1581.            if  not CheckReturnKey
  1582.            then
  1583.              with TWMKeyDown(Message), SkinMenu do
  1584.              begin
  1585.                if Visible and (FPopupList.Count > 0)
  1586.                then
  1587.                  TbsSkinPopupWindow(FPopupList.Items[FPopupList.Count - 1]).PopupKeyDown(CharCode);
  1588.              end;
  1589.           end
  1590.         else
  1591.           with TWMKeyDown(Message), SkinMenu do
  1592.           begin
  1593.             if Visible and (FPopupList.Count > 0)
  1594.             then
  1595.               TbsSkinPopupWindow(FPopupList.Items[FPopupList.Count - 1]).PopupKeyDown(CharCode);
  1596.             if (CharCode = VK_ESCAPE) and (FPopupList.Count = 0)
  1597.             then
  1598.               if InMainMenu
  1599.               then
  1600.                 SkinMenuClose2
  1601.               else
  1602.                 SkinMenuClose;
  1603.           end;
  1604. end;
  1605. procedure TbsBusinessSkinForm.NewAppMessage;
  1606. var
  1607.   MsgNew: TMessage;
  1608. begin
  1609.   MsgNew.WParam := Msg.WParam;
  1610.   MsgNew.LParam := Msg.LParam;
  1611.   MsgNew.Msg := Msg.message;
  1612.   case Msg.message of
  1613.      WM_MOUSEWHEEL:
  1614.       begin
  1615.         Msg.message := 0;
  1616.         Handled := True;
  1617.       end;
  1618.       
  1619.     WM_KEYDOWN:
  1620.       begin
  1621.         FormKeyDown(MsgNew);
  1622.         Msg.message := 0;
  1623.         Handled := True;
  1624.       end;
  1625.   end;
  1626. end;
  1627. procedure TbsBusinessSkinForm.CheckMenuVisible;
  1628. var
  1629.   BS: TbsBusinessSkinForm;
  1630. begin
  1631.   if CanMenuClose(Msg)
  1632.   then
  1633.     begin
  1634.       // hide object hint
  1635.       if FShowObjectHint and (FSkinHint <> nil)
  1636.       then FSkinHint.HideHint;
  1637.       //
  1638.       if InMainMenu and not InMenu
  1639.       then
  1640.         SkinMainMenuClose
  1641.       else
  1642.       if (SkinMenu <> nil) and (SkinMenu.Visible or (InMenu))
  1643.       then
  1644.         begin
  1645.           if SkinMenu.Visible
  1646.           then SkinMenu.Hide
  1647.           else SkinMenuClose;
  1648.         end
  1649.       else
  1650.       if (FForm.FormStyle = fsMDIForm) and FForm.Visible
  1651.       then
  1652.         begin
  1653.           BS := GetMDIChildBusinessSkinFormComponent2;
  1654.           if BS <> nil then BS.CheckMenuVisible(Msg);
  1655.         end;
  1656.     end;
  1657. end;
  1658. procedure TbsBusinessSkinForm.NewWndProc(var Message: TMessage);
  1659. const
  1660.   WM_SYNCPAINT = $0088;
  1661.   WS_EX_LAYERED = $80000;
  1662. var
  1663.   MM: PMINMAXINFO;
  1664.   Old: boolean;
  1665.   P: TPoint;
  1666.   L, T, I, J: Integer;
  1667.   R: PRect;
  1668.   R1: TRect;
  1669. begin
  1670.   CheckMenuVisible(Message.Msg);
  1671.   Old := True;
  1672.   with Message do
  1673.   begin
  1674.     case Msg of
  1675.       WM_MOUSEACTIVATE:
  1676.         if (FForm.FormStyle = fsMDIChild)
  1677.         then
  1678.         begin
  1679.           if (Application.MainForm.ActiveMDIChild = FForm) and not FFormActive
  1680.            then
  1681.              begin
  1682.                FFormActive := True;
  1683.                if FWindowState = wsMaximized
  1684.                then FormChangeActive(False)
  1685.                else FormChangeActive(True);
  1686.              end;
  1687.         end;
  1688.       WM_SETTEXT:
  1689.         begin
  1690.           OldWindowProc(Message);
  1691.           if (FForm.BorderStyle <> bsNone) and
  1692.              not ((FForm.FormStyle = fsMDICHILD) and (WindowState = wsMaximized))
  1693.           then
  1694.             SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  1695.           if FForm.FormStyle = fsMDIChild
  1696.           then
  1697.             begin
  1698.               UpDateChildCaptionInMenu(FForm);
  1699.               RefreshMDIBarTab(FForm);
  1700.             end;
  1701.           Old := False;
  1702.         end;
  1703.     WM_MDICHILDMAX:
  1704.       if FForm.FormStyle = fsMDIForm
  1705.       then
  1706.         begin
  1707.           FMDIChildMaximized := True;
  1708.           SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  1709.           if FMainMenuBar <> nil then FMainMenuBar.MDIChildMaximize;
  1710.         end;
  1711.     WM_MDICHILDRESTORE:
  1712.        if FForm.FormStyle = fsMDIForm
  1713.       then
  1714.         begin
  1715.           if GetMaximizeMDIChild = nil then FMDIChildMaximized := False;
  1716.           SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  1717.           if FMainMenuBar <> nil then FMainMenuBar.MDIChildRestore;
  1718.         end;
  1719.      WM_MDICHANGESIZE:
  1720.       if (FForm.FormStyle = fsMDICHILD) and (FWindowState = wsMaximized)
  1721.       then
  1722.         begin
  1723.           R1 := GetMDIWorkArea;
  1724.           FForm.SetBounds(0, 0, RectWidth(R1), RectHeight(R1));
  1725.         end;
  1726.       WM_SYSCOMMAND:
  1727.         begin
  1728.           if Message.WParam = SC_KEYMENU
  1729.           then
  1730.             begin
  1731.               if not InMainMenu then
  1732.               begin
  1733.                 if SkinMenu.Visible then SkinMenuClose;
  1734.                 if FMainMenuBar <> nil then FMainMenuBar.MenuEnter;
  1735.               end
  1736.               else
  1737.               if InMainMenu
  1738.               then
  1739.                 SkinMainMenuClose;
  1740.               Old := False;
  1741.             end;
  1742.         end;
  1743.      WM_CLOSESKINMENU:
  1744.         begin
  1745.           SkinMenuClose;
  1746.         end;
  1747.      WM_TIMER:
  1748.      if (Message.WParam = 1) and CheckW2KWXP and (FAlphaBlend or FAlphaBlendAnimation)
  1749.      then
  1750.        begin
  1751.          KillTimer(FForm.Handle, 1);
  1752.          if FAlphaBlendAnimation and not FAlphaBlend
  1753.            then J := 255 else J := FAlphaBlendValue;
  1754.          if FAlphaBlendAnimation
  1755.          then
  1756.            begin
  1757.              I := 0;
  1758.              Application.ProcessMessages;
  1759.              repeat
  1760.                Inc(i, 5);
  1761.                if I > J then I := J;
  1762.                SetAlphaBlendTransparent(FForm.Handle, i);
  1763.              until i >= J;
  1764.            end
  1765.          else
  1766.            if J <> 255
  1767.            then
  1768.              SetAlphaBlendTransparent(FForm.Handle, FAlphaBlendValue);
  1769.          if J = 255
  1770.          then
  1771.            SetWindowLong(FForm.Handle, GWL_EXSTYLE,
  1772.                                GetWindowLong(FForm.Handle, GWL_EXSTYLE) and not WS_EX_LAYERED);
  1773.        end;
  1774.      WM_SHOWWINDOW:
  1775.        begin
  1776.          if Message.wParam > 0
  1777.          then
  1778.            begin
  1779.              if CheckW2KWXP and (FAlphaBlend or FAlphaBlendAnimation)
  1780.              then
  1781.                begin
  1782.                  SetWindowLong(FForm.Handle, GWL_EXSTYLE,
  1783.                                GetWindowLong(FForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  1784.                  SetAlphaBlendTransparent(FForm.Handle, 0);
  1785.                  SetTimer(FForm.Handle, 1, 1, nil);
  1786.                end;
  1787.              //
  1788.              if (FForm.FormStyle <> fsMDIForm) then UpDateForm else
  1789.              if (FForm.FormStyle = fsMDIForm) and (FForm.ClientHandle <> 0) and
  1790.                 (FClientInstance = nil)
  1791.              then
  1792.                begin
  1793.                  FPrevClientProc := Pointer(GetWindowLong(FForm.ClientHandle, GWL_WNDPROC));
  1794.                  FClientInstance := MakeObjectInstance(FormClientWindowProcHook);
  1795.                  SetWindowLong(FForm.ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
  1796.                  UpDateForm;
  1797.                end;
  1798.              //
  1799.              if FForm.FormStyle = fsMDIChild
  1800.              then
  1801.                begin
  1802.                  AddChildToMenu(FForm);
  1803.                  AddChildToBar(FForm);
  1804.                end;
  1805.              //
  1806.              if FForm.Menu <> nil then FForm.Menu := nil;
  1807.             end
  1808.           else
  1809.             begin
  1810.               if FForm.FormStyle = fsMDIChild
  1811.               then
  1812.                 begin
  1813.                   DeleteChildFromMenu(FForm);
  1814.                   DeleteChildFromBar(FForm);
  1815.                 end;
  1816.               if CheckW2KWXP and FAlphaBlend
  1817.               then
  1818.                 SetWindowLong(FForm.Handle, GWL_EXSTYLE,
  1819.                               GetWindowLong(FForm.Handle, GWL_EXSTYLE) and not WS_EX_LAYERED);
  1820.             end;
  1821.         end;
  1822.       WM_NCHITTEST:
  1823.           begin
  1824.             P.X := Short(LoWord(lParam));
  1825.             P.Y := HiWord(lParam);
  1826.             PointToNCPoint(P);
  1827.             if FSkinSupport
  1828.             then
  1829.               Result := NewNCHitTest(P)
  1830.             else
  1831.               Result := NewDefNCHitTest(P);
  1832.             if not MouseTimer.Enabled and (Message.Result = HTNCACTIVE)
  1833.             then
  1834.               begin
  1835.                 TestActive(P.X, P.Y, True);
  1836.                 MouseTimer.Enabled := True;
  1837.               end;
  1838.             Old := False;
  1839.           end;
  1840.       WM_BEFORECHANGESKINDATA:
  1841.         if WParam = Integer(FSD)
  1842.         then
  1843.           begin
  1844.             FSkinSupport := False;
  1845.             MouseTimer.Enabled := False;
  1846.             MorphTimer.Enabled := False;
  1847.             AnimateTimer.Enabled := False;
  1848.             ClearObjects;
  1849.             BeforeUpDateSkinControls(WParam, FForm);
  1850.           end;
  1851.       WM_CHANGERESSTRDATA:
  1852.         begin
  1853.           CheckObjectsHint;
  1854.         end;  
  1855.       WM_AFTERCHANGESKINDATA:
  1856.         begin
  1857.           if (WParam = Integer(FSD)) and (FForm.FormStyle = fsMDIForm)
  1858.           then
  1859.             begin
  1860.               ResizeMDIChilds;
  1861.             end;
  1862.         end;
  1863.       WM_CHANGESKINDATA:
  1864.         begin
  1865.           if WParam = Integer(FSD)
  1866.           then
  1867.             ChangeSkinData;
  1868.           UpDateSkinControls(WParam, FForm);
  1869.         end;
  1870.       WM_MOVING:
  1871.         if (WindowState = wsMaximized) and (FForm.FormStyle <> fsMDIChild)
  1872.         then
  1873.           begin
  1874.             L := FForm.Left;
  1875.             T := FForm.Top;
  1876.             PRect(Message.LParam)^.Left := L;
  1877.             PRect(Message.LParam)^.Top := T;
  1878.             PRect(Message.LParam)^.Right := L + FForm.Width;
  1879.             PRect(Message.LParam)^.Bottom := T + FForm.Height;
  1880.           end
  1881.         else
  1882.         if FMagnetic
  1883.         then
  1884.           begin
  1885.             L := PRect(Message.LParam)^.Left;
  1886.             T := PRect(Message.LParam)^.Top;
  1887.             DoMagnetic(L, T, FForm.Width, FForm.Height);
  1888.             PRect(Message.LParam)^.Left := L;
  1889.             PRect(Message.LParam)^.Top := T;
  1890.             PRect(Message.LParam)^.Right := L + FForm.Width;
  1891.             PRect(Message.LParam)^.Bottom := T + FForm.Height;
  1892.           end;
  1893.       WM_ENTERSIZEMOVE:
  1894.         begin
  1895.           UpDateActiveObjects;
  1896.           MouseTimer.Enabled := False;
  1897.           ActiveObject := -1;
  1898.           MouseCaptureObject := -1;
  1899.           FSizeMove := True;
  1900.           FFullDrag := GetFullDragg;
  1901.         end;
  1902.       WM_EXITSIZEMOVE:
  1903.          begin
  1904.            MouseTimer.Enabled := False;
  1905.            ActiveObject := -1;
  1906.            OldActiveObject := -1;
  1907.            MouseCaptureObject := -1;
  1908. //         FSizeMove := False;
  1909.            if (FSD <> nil) and not FSD.Empty
  1910.            then
  1911.             SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  1912.          end;
  1913.       WM_SIZING:
  1914.       if FSizeMove and FFullDrag
  1915.       then
  1916.         begin
  1917.           OldWindowProc(Message);
  1918.           Old := False;
  1919.           R := PRect(LParam);
  1920.           FFormWidth := RectWidth(R^);
  1921.           FFormHeight := RectHeight(R^);
  1922.           if (FSD <> nil) and
  1923.              (FForm.Width >= GetMinWidth) and
  1924.              (FForm.Height >= GetMinHeight)
  1925.           then
  1926.             CreateNewForm(True);
  1927.         end;
  1928.       WM_SIZE:
  1929.       if not FSizeMove or not FFullDrag
  1930.       then
  1931.         begin
  1932.           OldWindowProc(Message);
  1933.           Old := False;
  1934.           FFormWidth := FForm.Width;
  1935.           FFormHeight := FForm.Height;
  1936.           if not FSkinSupport
  1937.           then
  1938.             SendMessage(FForm.Handle, WM_NCPAINT, 0, 0)
  1939.           else
  1940.             begin
  1941.               if (FSD <> nil) and
  1942.                  (FFormWidth >= GetMinWidth) and
  1943.                  (FFormHeight >= GetMinHeight)
  1944.               then
  1945.                 CreateNewForm(True);
  1946.              end;
  1947.           if FAlphaBlend and (FAlphaBlendValue <> 255) and CheckW2KWXP
  1948.           then
  1949.             begin
  1950.               SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  1951.               FForm.RePaint;
  1952.             end;
  1953.           if not FLogoBitMap.Empty and (FForm.FormStyle <> fsMDIForm)
  1954.           then
  1955.             FForm.RePaint;
  1956.         end
  1957.       else
  1958.         if not FLogoBitMap.Empty and (FForm.FormStyle <> fsMDIForm)
  1959.         then
  1960.           FForm.RePaint;
  1961.       WM_DESTROY:
  1962.       begin
  1963.         MouseTimer.Enabled := False;
  1964.         MorphTimer.Enabled := False;
  1965.         AnimateTimer.Enabled := False;
  1966.         if (FForm.FormStyle = fsMDIChild)
  1967.         then
  1968.           begin
  1969.             FWindowState := wsNormal;
  1970.             SendMessage(Application.MainForm.Handle, WM_MDICHILDRESTORE, 0, 0);
  1971.             CheckMDIMainMenu;
  1972.             CheckMDIBar;
  1973.           end;
  1974.       end;
  1975.      WM_ACTIVATE:
  1976.        begin
  1977.          OldWindowProc(Message);
  1978.          SendMessage(FForm.Handle, WM_NCPaint, 0, 0);
  1979.          if (FForm.FormStyle = fsMDIChild) and (WindowState = wsMaximized)
  1980.          then FormChangeActive(False)
  1981.          else
  1982.            begin
  1983.              UpDateActiveObjects;
  1984.              FormChangeActive(True);
  1985.            end;
  1986.          Old := False;
  1987.          if FForm.FormStyle = fsMDIForm then Self.CheckMDIMainMenu;
  1988.        end;
  1989.      WM_GetMinMaxInfo:
  1990.       begin
  1991.         MM := PMinMaxInfo(lParam);
  1992.         MM^.ptMinTrackSize.x := GetMinWidth;
  1993.         MM^.ptMinTrackSize.y := GetMinHeight;
  1994.         MM^.ptMaxTrackSize.x := GetMaxWidth;
  1995.         MM^.ptMaxTrackSize.y := GetMaxHeight;
  1996.       end;
  1997.      WM_NCCALCSIZE:
  1998.        begin
  1999.          Old := False;
  2000.          if  not ((FForm.FormStyle = fsMDIChild) and
  2001.             (WindowState = wsMaximized)) and (FForm.BorderStyle <> bsNone)
  2002.          then
  2003.            if (FSD <> nil) and not FSD.Empty
  2004.            then
  2005.              begin
  2006.                CalcRects;
  2007.                with TWMNCCALCSIZE(Message).CalcSize_Params^.rgrc[0], FSD do
  2008.                begin
  2009.                  Inc(Left, ClRect.Left);
  2010.                  Inc(Top,  ClRect.Top);
  2011.                  Dec(Right, FPicture.Width - ClRect.Right);
  2012.                  Dec(Bottom, FPicture.Height - ClRect.Bottom);
  2013.                  if Right < Left
  2014.                  then Right := Left;
  2015.                  if Bottom < Top
  2016.                  then Bottom := Top;
  2017.                end;
  2018.              end
  2019.            else
  2020.              with TWMNCCALCSIZE(Message).CalcSize_Params^.rgrc[0] do
  2021.              begin
  2022.                Inc(Left, 3);
  2023.                Inc(Top, GetDefCaptionHeight + 3);
  2024.                Dec(Right, 3);
  2025.                Dec(Bottom, 3);
  2026.                if Right < Left then Right := Left;
  2027.                if Bottom < Top
  2028.                then Bottom := Top;
  2029.              end;
  2030.        end;
  2031.       WM_SYNCPAINT:
  2032.       if FRollUpState
  2033.       then
  2034.         begin
  2035.           SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  2036.            Message.Result := 0;
  2037.           Old := False;
  2038.         end;
  2039.      WM_NCPAINT:
  2040.       begin
  2041.         if (FForm.BorderStyle <> bsNone) and
  2042.             not ((FForm.FormStyle = fsMDICHILD) and (WindowState = wsMaximized))
  2043.         then
  2044.           if FSkinSupport
  2045.           then
  2046.             PaintNCSkin
  2047.           else
  2048.             PaintNCDefault;
  2049.         Old := False;
  2050.       end;
  2051.     WM_NCACTIVATE:
  2052.       begin
  2053.         FFormActive := TWMNCACTIVATE(Message).Active;
  2054.         if (FForm.FormStyle = fsMDIForm) or
  2055.            (FForm.FormStyle = fsMDIChild)
  2056.         then
  2057.           OldWindowProc(Message)
  2058.         else
  2059.           Message.Result := 1;
  2060.         if not ((FForm.FormStyle = fsMDICHILD) and (WindowState = wsMaximized))
  2061.            and (FForm.BorderStyle <> bsNone)
  2062.         then
  2063.           begin
  2064.             SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  2065.             FormChangeActive(True);
  2066.           end
  2067.         else
  2068.           FormChangeActive(False);
  2069.         //
  2070.         if FForm.FormStyle = fsMDIChild
  2071.         then  UpDateChildActiveInMenu;
  2072.         //
  2073.         Old := False;
  2074.         if (FForm.FormStyle = fsMDIChild) and (WindowState = wsMaximized)
  2075.         then
  2076.           begin
  2077.             Application.MainForm.Perform(WM_NCPAINT, 0, 0);
  2078.           end;
  2079.         if (FForm.FormStyle = fsMDIChild)
  2080.         then
  2081.           begin
  2082.             CheckMDIMainMenu;
  2083.             CheckMDIBar;
  2084.           end;  
  2085.       end;
  2086.      WM_ERASEBKGND:
  2087.        if (FForm.FormStyle <> fsMDIForm)
  2088.        then
  2089.          begin
  2090.            if FSkinSupport
  2091.            then
  2092.             begin
  2093.               if FSD.BGPictureIndex = -1
  2094.               then
  2095.                 PaintBG(wParam)
  2096.               else
  2097.                 PaintBG2(wParam);
  2098.             end
  2099.           else
  2100.             PaintBGDefault(wParam);
  2101.          Old := False;
  2102.        end;
  2103.     end;
  2104.     if Old then OldWindowProc(Message);
  2105.     case Msg of
  2106.       WM_LBUTTONUP:
  2107.         begin
  2108.           MouseUp(mbLeft, -1, -1);
  2109.         end;
  2110.       WM_RBUTTONUP:
  2111.         begin
  2112.           MouseUp(mbRight, -1, -1);
  2113.         end;
  2114.       WM_NCMOUSEMOVE:
  2115.         begin
  2116.           P.X := Short(LoWord(lParam));
  2117.           P.Y := HiWord(lParam);
  2118.           PointToNCPoint(P);
  2119.           MouseMove(P.X, P.Y);
  2120.         end;
  2121.       WM_NCLBUTTONDBLCLK:
  2122.       begin
  2123.         P.X := Short(LoWord(Message.lParam));
  2124.         P.Y := HiWord(Message.lParam);
  2125.         PointToNCPoint(P);
  2126.         TestActive(P.X, P.Y, True);
  2127.         MouseDown(mbLeft, P.X, P.Y);
  2128.         MouseDblClick;
  2129.         if Message.wParam = HTCAPTION
  2130.         then
  2131.           if IsSizeAble and (WindowState = wsMinimized)
  2132.           then
  2133.             begin
  2134.               WindowState := wsNormal;
  2135.               MouseCaptureObject := -1;
  2136.             end
  2137.           else
  2138.           if IsSizeAble and (WindowState <> wsMaximized) and not FRollUpState and
  2139.              (biMaximize in BorderIcons)
  2140.           then
  2141.             begin
  2142.               WindowState := wsMaximized;
  2143.               MouseCaptureObject := -1;
  2144.             end
  2145.           else
  2146.           if IsSizeAble and (WindowState = wsMaximized) and not MaxRollUpState
  2147.           then
  2148.             begin
  2149.               WindowState := wsNormal;
  2150.               MouseCaptureObject := -1;
  2151.             end
  2152.           else
  2153.             begin
  2154.               if FRollUpState
  2155.               then
  2156.                 RollUpState := False
  2157.               else
  2158.                 RollUpState := True;
  2159.               MouseCaptureObject := -1;
  2160.             end;
  2161.       end;
  2162.       WM_NCRBUTTONDBLCLK:
  2163.         begin
  2164.           P.X := Short(LoWord(Message.lParam));
  2165.           P.Y := HiWord(Message.lParam);
  2166.           PointToNCPoint(P);
  2167.           TestActive(P.X, P.Y, True);
  2168.           MouseDown(mbRight, P.X, P.Y);
  2169.           if wParam = HTCAPTION then MouseCaptureObject := -1;
  2170.         end;
  2171.       WM_NCLBUTTONDOWN:
  2172.         if not FSizeMove then
  2173.         begin
  2174.           P.X := Short(LoWord(lParam));
  2175.           P.Y := HiWord(lParam);
  2176.           PointToNCPoint(P);
  2177.           TestActive(P.X, P.Y, True);
  2178.           MouseDown(mbLeft, P.X, P.Y);
  2179.           if wParam = HTCAPTION then MouseCaptureObject := -1;
  2180.         end
  2181.         else
  2182.           FSizeMove := False;
  2183.       WM_NCLBUTTONUP:
  2184.         begin
  2185.           P.X := Short(LoWord(lParam));
  2186.           P.Y := HiWord(lParam);
  2187.           PointToNCPoint(P);
  2188.           MouseUp(mbLeft, LoWord(LParam), HiWord(LParam));
  2189.         end;
  2190.       WM_NCRBUTTONDOWN:
  2191.         begin
  2192.           P.X := Short(LoWord(lParam));
  2193.           P.Y := HiWord(lParam);
  2194.           PointToNCPoint(P);
  2195.           TestActive(P.X, P.Y, True);
  2196.           MouseDown(mbRight, P.X, P.Y);
  2197.           if wParam = HTCAPTION
  2198.           then
  2199.             begin
  2200.               GetCursorPos(P);
  2201.               MouseCaptureObject := -1;
  2202.               TrackSystemMenu(P.X, P.Y);
  2203.             end;
  2204.         end;
  2205.       WM_NCRBUTTONUP:
  2206.         begin
  2207.           P.X := Short(LoWord(lParam));
  2208.           P.Y := HiWord(lParam);
  2209.           PointToNCPoint(P);
  2210.           MouseUp(mbRight, P.X, P.Y);
  2211.         end;
  2212.     end;
  2213.   end;
  2214. end;
  2215. procedure  TbsBusinessSkinForm.CheckMDIMainMenu;
  2216. var
  2217.   BS: TbsBusinessSkinForm;
  2218. begin
  2219.   BS := GetBusinessSkinFormComponent(Application.MainForm);
  2220.   if (BS <> nil) and (BS.MainMenuBar <> nil) and
  2221.      ((BS.MainMenuBar.GetChildMainMenu <> nil) or BS.MainMenuBar.ChildMenuIn)
  2222.   then
  2223.     BS.MainMenuBar.UpDateItems;
  2224. end;
  2225. procedure  TbsBusinessSkinForm.CheckMDIBar;
  2226. var
  2227.   BS: TbsBusinessSkinForm;
  2228. begin
  2229.   BS := GetBusinessSkinFormComponent(Application.MainForm);
  2230.   if (BS <> nil) and (BS.MDITabsBar <> nil)
  2231.   then
  2232.     BS.MDITabsBar.CheckActive;
  2233. end;
  2234. procedure TbsBusinessSkinForm.CalcRects;
  2235. var
  2236.   OX, OY: Integer;
  2237. begin
  2238.   if FFormWidth = 0 then FFormWidth := FForm.Width;
  2239.   if FFormHeight = 0 then FFormHeight := FForm.Height;
  2240.   if (FSD <> nil) and not FSD.Empty then
  2241.   with FSD do
  2242.   begin
  2243.     OX := FFormWidth - FPicture.Width;
  2244.     OY := FFormHeight - FPicture.Height;
  2245.     NewLTPoint := LTPoint;
  2246.     NewRTPoint := Point(RTPoint.X + OX, RTPoint.Y);
  2247.     NewLBPoint := Point(LBPoint.X, LBPoint.Y + OY);
  2248.     NewRBPoint := Point(RBPoint.X + OX, RBPoint.Y + OY);
  2249.     NewClRect := Rect(ClRect.Left, ClRect.Top,
  2250.     ClRect.Right + OX, ClRect.Bottom + OY);
  2251.     NewCaptionRect := CaptionRect;
  2252.     if not IsNullRect(CaptionRect)
  2253.     then Inc(NewCaptionRect.Right, OX);
  2254.     NewButtonsRect := ButtonsRect;
  2255.     NewButtonsInLeft := CapButtonsInLeft;
  2256.     if not IsNullRect(ButtonsRect) and (ButtonsRect.Left > FPicture.Width div 2)
  2257.     then
  2258.       OffsetRect(NewButtonsRect, OX, 0)
  2259.     else
  2260.     if not IsNullRect(ButtonsRect) and (ButtonsRect.Left < FPicture.Width div 2)
  2261.     then
  2262.       ButtonsInLeft := True;
  2263.     NewButtonsOffset := ButtonsOffset;
  2264.     NewHitTestLTPoint := HitTestLTPoint;
  2265.     NewHitTestRTPoint := Point(HitTestRTPoint.X + OX, HitTestRTPoint.Y);
  2266.     NewHitTestLBPoint := Point(HitTestLBPoint.X, LBPoint.Y + OY);
  2267.     NewHitTestRBPoint := Point(HitTestRBPoint.X + OX, HitTestRBPoint.Y + OY);
  2268.     NewMaskRectArea := Rect(MaskRectArea.Left, MaskRectArea.Top,
  2269.     MaskRectArea.Right + OX, MaskRectArea.Bottom + OY);
  2270.   end;
  2271. end;
  2272. procedure TbsBusinessSkinForm.CreateNewForm;
  2273. begin
  2274.   if csDesigning in ComponentState then Exit;
  2275.   if FSD = nil then Exit;
  2276.   if FSD.Empty then Exit;
  2277.   CalcRects;
  2278.   if FCanScale then CalcAllRealObjectRect;
  2279.   CreateNewRegion(FCanScale);
  2280.   if FRgn = 0
  2281.   then SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  2282. end;
  2283. procedure TbsBusinessSkinForm.CreateNewRegion;
  2284. var
  2285.   Size: Integer;
  2286.   RgnData: PRgnData;
  2287.   R1, R2, R3, R4, TempRgn: HRGN;
  2288. begin
  2289.   if (FForm.BorderStyle = bsNone)
  2290.   then
  2291.     begin
  2292.       if FRgn <> 0
  2293.       then
  2294.         begin
  2295.           SetWindowRgn(FForm.Handle, 0, True);
  2296.           DeleteObject(FRgn);
  2297.           FRgn := 0;
  2298.         end;
  2299.     end
  2300.   else
  2301.   if (FForm.FormStyle = fsMDIChild) and (WindowState = wsMaximized) and not FSD.FMask.Empty
  2302.   then
  2303.     begin
  2304.       if FRgn <> 0
  2305.       then
  2306.         begin
  2307.           SetWindowRgn(FForm.Handle, 0, True);
  2308.           DeleteObject(FRgn);
  2309.           FRgn := 0;
  2310.         end;
  2311.     end
  2312.   else
  2313.   if ((FSD = nil) or ((FSD <> nil) and (FSD.FMask.Empty))) and (FRgn <> 0)
  2314.   then
  2315.     begin
  2316.       SetWindowRgn(FForm.Handle, 0, True);
  2317.       DeleteObject(FRgn);
  2318.       FRgn := 0;
  2319.       RMLeft.Assign(nil);
  2320.       RMTop.Assign(nil);
  2321.       RMRight.Assign(nil);
  2322.       RMBottom.Assign(nil);
  2323.     end
  2324.   else
  2325.     if (FSD <> nil) and not FSD.FMask.Empty
  2326.     then
  2327.       begin
  2328.         if FCanScale
  2329.         then
  2330.           begin
  2331.             CreateSkinMask(
  2332.                FSD.LTPoint, FSD.RTPoint, FSD.LBPoint, FSD.RBPoint, FSD.MaskRectArea,
  2333.                NewLtPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewMaskRectArea,
  2334.                FSD.FMask, RMTop, RMLeft, RMRight, RMBottom,
  2335.                FFormWidth, FFormHeight);
  2336.             if RMTop.Height > 0
  2337.             then
  2338.               begin
  2339.                 Size := CreateRgnFromBmp(RMTop, 0, 0, RgnData);
  2340.                 R1 := ExtCreateRegion(nil, Size, RgnData^);
  2341.                 FreeMem(RgnData, Size);
  2342.               end
  2343.             else
  2344.               R1 := 0;    
  2345.             if RMBottom.Height > 0
  2346.             then
  2347.               begin
  2348.                 Size := CreateRgnFromBmp(RMBottom, 0, NewMaskRectArea.Bottom, RgnData);
  2349.                 R2 := ExtCreateRegion(nil, Size, RgnData^);
  2350.                 FreeMem(RgnData, Size);
  2351.               end
  2352.             else
  2353.               R2 := 0;  
  2354.             if RMLeft.Width > 0
  2355.             then
  2356.               begin
  2357.                 Size := CreateRgnFromBmp(RMLeft, 0, NewMaskRectArea.Top, RgnData);
  2358.                 R3 := ExtCreateRegion(nil, Size, RgnData^);
  2359.                 FreeMem(RgnData, Size);
  2360.               end
  2361.             else
  2362.               R3 := 0;
  2363.             if RMRight.Width > 0
  2364.             then
  2365.               begin
  2366.                 Size := CreateRgnFromBmp(RMRight, NewMaskRectArea.Right, NewMaskRectArea.Top, RgnData);
  2367.                 R4 := ExtCreateRegion(nil, Size, RgnData^);
  2368.                 FreeMem(RgnData, Size);
  2369.               end
  2370.             else
  2371.               R4 := 0;    
  2372.             TempRgn := FRgn;
  2373.             FRgn := CreateRectRgn(NewMaskRectArea.Left, NewMaskRectArea.Top,
  2374.                                   NewMaskRectArea.Right, NewMaskRectArea.Bottom);
  2375.             CombineRgn(R1, R1, R2, RGN_OR);
  2376.             CombineRgn(R3, R3, R4, RGN_OR);
  2377.             CombineRgn(R3, R3, R1, RGN_OR);
  2378.             CombineRgn(FRgn, FRgn, R3, RGN_OR);
  2379.             SetWindowRgn(FForm.Handle, FRgn, True);
  2380.             if TempRgn <> 0 then DeleteObject(TempRgn);
  2381.             DeleteObject(R1);
  2382.             DeleteObject(R2);
  2383.             DeleteObject(R3);
  2384.             DeleteObject(R4);
  2385.           end
  2386.         else
  2387.           begin
  2388.             Size := CreateRgnFromBmp(FSD.FMask, 0, 0, RgnData);
  2389.             if Size <> 0
  2390.             then
  2391.               begin
  2392.                 TempRgn := FRgn;
  2393.                 FRgn := ExtCreateRegion(nil, Size, RgnData^);
  2394.                 SetWindowRgn(FForm.Handle, FRgn, True);
  2395.                 if TempRgn <> 0 then DeleteObject(TempRgn);
  2396.                 FreeMem(RgnData, Size);
  2397.               end;
  2398.           end;
  2399.       end;
  2400. end;
  2401. function TbsBusinessSkinForm.GetFormActive;
  2402. begin
  2403.   if PreviewMode
  2404.   then
  2405.     Result := True
  2406.   else
  2407.   if (FForm.FormStyle = fsMDIChild) or (FForm.FormStyle = fsMDIForm)
  2408.   then
  2409.     Result := FFormActive
  2410.   else
  2411.     Result := FForm.Active;
  2412. end;
  2413. procedure TbsBusinessSkinForm.FormChangeActive;
  2414. var
  2415.   i: Integer;
  2416.   FA: Boolean;
  2417. begin
  2418.   FA := GetFormActive;
  2419.   for i := 0 to ObjectList.Count - 1 do
  2420.     if TbsActiveSkinObject(ObjectList.Items[i]) is TbsSkinCaptionObject
  2421.     then
  2422.       with TbsSkinCaptionObject(ObjectList.Items[i]) do
  2423.         if (Active <> FA)
  2424.         then
  2425.           begin
  2426.             Active := FA;
  2427.             if AUpDate
  2428.             then
  2429.               begin
  2430.                 SendMessage(FForm.Handle, WM_NCPAINT, 0, 0);
  2431.                 if Morphing
  2432.                 then MorphTimer.Enabled := True;
  2433.               end
  2434.             else
  2435.               if Morphing
  2436.               then
  2437.                 if Active
  2438.                 then
  2439.                   FMorphKf := 1
  2440.                 else
  2441.                   FMorphKf := 0;
  2442.             Break;
  2443.           end;
  2444.   if FA
  2445.   then
  2446.     begin
  2447.       if Assigned(FOnActivate) then FOnActivate(Self);
  2448.     end
  2449.   else
  2450.     begin
  2451.       if Assigned(FOnDeActivate) then FOnDeActivate(Self);
  2452.     end;
  2453. end;
  2454. procedure TbsBusinessSkinForm.SetEnabled;
  2455. var
  2456.   i: Integer;
  2457. begin
  2458.   i := GetIndex(AIDName);
  2459.   if i <> -1
  2460.   then
  2461.     TbsActiveSkinObject(ObjectList.Items[i]).Enabled := Value;
  2462. end;
  2463. constructor TbsMDITab.Create;
  2464. begin
  2465.   TabsBar := AParentBar;
  2466.   Child := AChild;
  2467.   ObjectRect := NullRect;
  2468.   Active := False;
  2469.   MouseIn := False;
  2470. end;
  2471. procedure TbsMDITab.Draw(Cnvs: TCanvas);
  2472. procedure DrawFlipVert(B: TBitMap);
  2473. var
  2474.   B1, B2: TbsEffectBmp;
  2475. begin
  2476.   B1 := TbsEffectBmp.CreateFromhWnd(B.Handle);
  2477.   B2 := TbsEffectBmp.Create(B1.Width, B1.Height);
  2478.   B1.FlipVert(B2);
  2479.   B2.Draw(B.Canvas.Handle, 0, 0);
  2480.   B1.Free;
  2481.   B2.Free;
  2482. end;
  2483. var
  2484.   TB: TBitMap;
  2485.   R: TRect;
  2486.   S: String;
  2487.   FC: TColor;
  2488.   W, H: Integer;
  2489. begin
  2490.   if RectWidth(ObjectRect) < 1 then Exit;
  2491.   TB := TBitMap.Create;
  2492.   TB.Width := RectWidth(ObjectRect);
  2493.   TB.Height := RectHeight(ObjectRect);
  2494.   W := TB.Width;
  2495.   H := TB.Height;
  2496.   if TabsBar.FIndex <> -1
  2497.   then
  2498.     begin
  2499.       if MouseIn and not Active
  2500.       then
  2501.         begin
  2502.           CreateHSkinImage(TabsBar.TabLeftOffset, TabsBar.TabRightOffset,
  2503.             TB, TabsBar.Picture, TabsBar.MouseInTabRect, W, H);
  2504.           FC := TabsBar.MouseInFontColor;
  2505.         end
  2506.       else
  2507.       if Active
  2508.       then
  2509.         begin
  2510.           CreateHSkinImage(TabsBar.TabLeftOffset, TabsBar.TabRightOffset,
  2511.             TB, TabsBar.Picture, TabsBar.ActiveTabRect, W, H);
  2512.           FC := TabsBar.ActiveFontColor;
  2513.         end
  2514.       else
  2515.         begin
  2516.           CreateHSkinImage(TabsBar.TabLeftOffset, TabsBar.TabRightOffset,
  2517.             TB, TabsBar.Picture, TabsBar.TabRect, W, H);
  2518.           FC := TabsBar.FontColor;
  2519.         end;
  2520.       if TabsBar.Align = alBottom then DrawFlipVert(TB);
  2521.       with TB.Canvas.Font do
  2522.       begin
  2523.         Name := TabsBar.FontName;
  2524.         Style := TabsBar.FontStyle;
  2525.         Height := TabsBar.FontHeight;
  2526.         if (TabsBar.SkinData <> nil) and (TabsBar.SkinData.ResourceStrData <> nil)
  2527.         then
  2528.           CharSet := TabsBar.SkinData.ResourceStrData.Charset
  2529.         else
  2530.           CharSet := TabsBar.DefaultFont.CharSet;
  2531.         Color := FC;
  2532.       end;
  2533.       R := Rect(TabsBar.TabLeftOffset, 0, TB.Width - TabsBar.TabRightOffset, TB.Height);
  2534.       S := Child.Caption;
  2535.       CorrectTextbyWidth(TB.Canvas, S, RectWidth(R));
  2536.       TB.Canvas.Brush.Style := bsClear;
  2537.       DrawText(TB.Canvas.Handle, PChar(S), Length(S), R,
  2538.         DT_CENTER or DT_SINGLELINE or DT_VCENTER);
  2539.     end
  2540.   else
  2541.     with TB.Canvas do
  2542.     begin
  2543.       if MouseIn and not Active
  2544.       then
  2545.         Brush.Color := BS_XP_BTNACTIVECOLOR
  2546.       else
  2547.       if Active
  2548.       then
  2549.         Brush.Color := BS_XP_BTNDOWNCOLOR
  2550.       else
  2551.         Brush.Color := clBtnFace;
  2552.       FillRect(Rect(0, 0, TB.Width, TB.Height));
  2553.       Brush.Style := bsClear;
  2554.       Font.Assign(TabsBar.DefaultFont);
  2555.       if (TabsBar.SkinData <> nil) and (TabsBar.SkinData.ResourceStrData <> nil)
  2556.       then
  2557.         Font.CharSet := TabsBar.SkinData.ResourceStrData.Charset;
  2558.       R := Rect(2, 0, TB.Width - 2, TB.Height);
  2559.       S := Child.Caption;
  2560.       CorrectTextbyWidth(TB.Canvas,S, RectWidth(R));
  2561.       DrawText(TB.Canvas.Handle, PChar(S), Length(S), R,
  2562.         DT_CENTER or DT_SINGLELINE or DT_VCENTER);
  2563.     end;
  2564.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, TB);  
  2565.   TB.Free;
  2566. end;
  2567. constructor TbsSkinMDITabsBar.Create(AOwner: TComponent);
  2568. begin
  2569.   inherited Create(AOwner);
  2570.   FMoveTabs := True;
  2571.   FDefaultHeight := 21;
  2572.   Height := 21;
  2573.   Width := 150;
  2574.   SkinDataName := 'tab';
  2575.   FDefaultFont := TFont.Create;
  2576.   FDefaultTabWidth := 100;
  2577.   with FDefaultFont do
  2578.   begin
  2579.     Name := 'Arial';
  2580.     Style := [];
  2581.     Height := 14;
  2582.   end;
  2583.   ObjectList := TList.Create;
  2584.   ActiveTabIndex := -1;
  2585.   OldTabIndex := -1;
  2586.   DragIndex := -1;
  2587.   IsDrag := False;
  2588.   FDown := False;
  2589. end;
  2590. destructor TbsSkinMDITabsBar.Destroy;
  2591. begin
  2592.   ClearObjects;
  2593.   ObjectList.Free;
  2594.   FDefaultFont.Free;
  2595.   inherited;
  2596. end;
  2597. procedure TbsSkinMDITabsBar.CheckActive;
  2598. var
  2599.   I: Integer;
  2600.   F: TCustomForm;
  2601. begin
  2602.   F := Application.MainForm.ActiveMDIChild;
  2603.   if F = nil then Exit;
  2604.   for I := 0 to ObjectList.Count - 1 do
  2605.   with TbsMDITab(ObjectList.Items[I]) do
  2606.   begin
  2607.     Active := (Child = F);
  2608.   end;
  2609.   RePaint;
  2610. end;
  2611. procedure TbsSkinMDITabsBar.MouseUp;
  2612. var
  2613.   I: Integer;
  2614.   Tab: TbsMDITab;
  2615. begin
  2616.   inherited;
  2617.   FDown := False;
  2618.   if IsDrag
  2619.   then
  2620.     begin
  2621.       IsDrag := False;
  2622.       FDown := False;
  2623.       //
  2624.       I := GetMoveIndex;
  2625.       If (I <> -1) and (I <> DragIndex)
  2626.       then
  2627.         ObjectList.Move(DragIndex, I);
  2628.       //
  2629.       DragIndex := -1;
  2630.       DX := 0;
  2631.       TabDX := 0;
  2632.       RePaint;
  2633.     end
  2634.   else
  2635.     if Assigned(FOnTabMouseUp)
  2636.     then
  2637.       begin
  2638.         Tab := GetTab(X, Y);
  2639.         if Tab <> nil then FOnTabMouseUp(Button, Shift, Tab);
  2640.       end;
  2641. end;
  2642. function TbsSkinMDITabsBar.GetMoveIndex;
  2643. var
  2644.   I: Integer;
  2645.   R: TRect;
  2646.   X: Integer;
  2647. begin
  2648.   Result := -1;
  2649.   if ObjectList.Count = 0 then Exit;
  2650.   if TabDX > 0
  2651.   then
  2652.     begin
  2653.       X := TbsMDITab(ObjectList.Items[DragIndex]).ObjectRect.Right;
  2654.       if DragIndex + 1 <= ObjectList.Count - 1 then
  2655.         for I := DragIndex + 1 to ObjectList.Count - 1 do
  2656.         begin
  2657.           R := TbsMDITab(ObjectList.Items[I]).ObjectRect;
  2658.           if X > R.Left + RectWidth(R) div 2
  2659.           then Result := I;
  2660.         end;
  2661.     end
  2662.   else
  2663.   if TabDX < 0
  2664.   then
  2665.     begin
  2666.       X := TbsMDITab(ObjectList.Items[DragIndex]).ObjectRect.Left;
  2667.       if DragIndex - 1 >= 0 then
  2668.       begin
  2669.         for i := DragIndex - 1 downto 0 do
  2670.         begin
  2671.           R := TbsMDITab(ObjectList.Items[I]).ObjectRect;
  2672.           if X < R.Left + RectWidth(R) div 2
  2673.           then Result := I;
  2674.         end;
  2675.       end;
  2676.     end;
  2677. end;
  2678. procedure TbsSkinMDITabsBar.MouseMove;
  2679. begin
  2680.   inherited;
  2681.   if FDown and (DragIndex <> -1) and not IsDrag and (X - DX <> 0)
  2682.   then
  2683.     IsDrag := True;
  2684.   if IsDrag
  2685.   then
  2686.     begin
  2687.       TabDX := X - DX;
  2688.       RePaint;
  2689.     end
  2690.   else
  2691.     TestActive(X, Y);
  2692. end;
  2693. procedure TbsSkinMDITabsBar.MouseDown;
  2694. var
  2695.   Tab: TbsMDITab;
  2696.   ChildBSF: TbsBusinessSkinForm;
  2697. begin
  2698.   inherited;
  2699.   if Button = mbLeft
  2700.   then
  2701.     begin
  2702.       Tab := GetTab(X, Y);
  2703.       if Tab <> nil
  2704.       then
  2705.         begin
  2706.           Tab.Child.Show;
  2707.           ChildBSF := GetBusinessSkinFormComponent(Tab.Child);
  2708.           if (ChildBSF <> nil) and (ChildBSF.WindowState = wsMinimized)
  2709.           then
  2710.             ChildBSF.WindowState := wsNormal;
  2711.           FDown := True;
  2712.           if FMoveTabs then DragIndex := GetTabIndex(X, Y);
  2713.           DX := X;
  2714.           TabDX := 0;
  2715.           if Assigned(FOnTabMouseDown) then FOnTabMouseDown(Button, Shift, Tab);
  2716.         end;
  2717.     end;
  2718. end;
  2719. procedure TbsSkinMDITabsBar.CMMouseLeave;
  2720. begin
  2721.   inherited;
  2722.   TestActive(-1, -1);
  2723. end;
  2724. function TbsSkinMDITabsBar.GetTabIndex;
  2725. var
  2726.   I: Integer;
  2727.   R: TRect;
  2728. begin
  2729.   Result := -1;
  2730.   if ObjectList.Count > 0
  2731.   then
  2732.     for I := 0 to ObjectList.Count - 1 do
  2733.       begin
  2734.         R := TbsMDITab(ObjectList.Items[I]).ObjectRect;
  2735.         if (X >= R.Left) and (X <= R.Right) and
  2736.            (Y >= R.Top) and (Y <= R.Bottom)
  2737.         then
  2738.           begin
  2739.             Result := I;
  2740.             Break;
  2741.           end;
  2742.     end;
  2743. end;
  2744. function TbsSkinMDITabsBar.GetTab;
  2745. var
  2746.   I: Integer;
  2747. begin
  2748.   I := GetTabIndex(X, Y);
  2749.   if I <> -1
  2750.   then
  2751.     Result := TbsMDITab(ObjectList.Items[I])
  2752.   else
  2753.     Result := nil;
  2754. end;
  2755. procedure TbsSkinMDITabsBar.TestActive;
  2756. var
  2757.   Tab: TbsMDITab;
  2758. begin
  2759.   ActiveTabIndex := GetTabIndex(X, Y);
  2760.   if (ActiveTabIndex <> OldTabIndex)
  2761.   then
  2762.     begin
  2763.       if OldTabIndex <> -1
  2764.       then
  2765.         with TbsMDITab(ObjectList.Items[OldTabIndex]) do
  2766.         begin
  2767.           MouseIn := False;
  2768.           Draw(Canvas);
  2769.           if Assigned(FOnTabMouseLeave)
  2770.           then
  2771.             FOnTabMouseLeave(TbsMDITab(ObjectList.Items[OldTabIndex]));
  2772.         end;
  2773.       if ActiveTabIndex <> -1
  2774.       then
  2775.         with TbsMDITab(ObjectList.Items[ActiveTabIndex]) do
  2776.         begin
  2777.           MouseIn := True;
  2778.           Draw(Canvas);
  2779.           if Assigned(FOnTabMouseEnter)
  2780.           then
  2781.             FOnTabMouseEnter(TbsMDITab(ObjectList.Items[ActiveTabIndex]));
  2782.         end;
  2783.       OldTabIndex := ActiveTabIndex;
  2784.     end;
  2785. end;
  2786. procedure TbsSkinMDITabsBar.CalcObjectRects;
  2787. var
  2788.   I, TabW, X: Integer;
  2789. begin
  2790.   if ObjectList.Count = 0 then Exit;
  2791.   TabW := Width div ObjectList.Count;
  2792.   if TabW > FDefaultTabWidth
  2793.   then
  2794.     TabW := FDefaultTabWidth;
  2795.   X := 0;
  2796.   for I := 0 to ObjectList.Count - 1 do
  2797.   begin
  2798.     TbsMDITab(ObjectList.Items[I]).ObjectRect := Rect(X, 0, X + TabW, Height);
  2799.     if (I = ObjectList.Count - 1) and (TabW < FDefaultTabWidth) and
  2800.        (TbsMDITab(ObjectList.Items[I]).ObjectRect.Right <> Width)
  2801.     then
  2802.       TbsMDITab(ObjectList.Items[I]).ObjectRect.Right := Width;
  2803.     Inc(X, TabW);
  2804.   end;
  2805.   if (DragIndex <> -1) and IsDrag
  2806.   then
  2807.     with TbsMDITab(ObjectList.Items[DragIndex]) do
  2808.     begin
  2809.       OffsetRect(ObjectRect, TabDX, 0);
  2810.       if ObjectRect.Right > Width
  2811.       then
  2812.         OffsetRect(ObjectRect, Width - ObjectRect.Right, 0);
  2813.       if ObjectRect.Left < 0
  2814.       then
  2815.         begin
  2816.           OffsetRect(ObjectRect, -ObjectRect.Left, 0);
  2817.         end;
  2818.     end;
  2819. end;
  2820. procedure TbsSkinMDITabsBar.SetDefaultHeight;
  2821. begin
  2822.   FDefaultHeight := Value;
  2823.   if (FIndex = -1) and (FDefaultHeight > 0) then Height := FDefaultHeight;
  2824. end;
  2825. procedure TbsSkinMDITabsBar.SetDefaultFont;
  2826. begin
  2827.   FDefaultFont.Assign(Value);
  2828. end;
  2829. procedure TbsSkinMDITabsBar.GetSkinData;
  2830. begin
  2831.   inherited;
  2832.   //
  2833.   if FIndex <> -1
  2834.   then
  2835.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinTabControl
  2836.     then
  2837.       with TbsDataSkinTabControl(FSD.CtrlList.Items[FIndex]) do
  2838.       begin
  2839.         if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
  2840.         then
  2841.           Picture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
  2842.         else
  2843.           Picture := nil;
  2844.         Self.TabRect := TabRect;
  2845.         if IsNullRect(ActiveTabRect)
  2846.         then
  2847.           Self.ActiveTabRect := TabRect
  2848.         else
  2849.           Self.ActiveTabRect := ActiveTabRect;
  2850.         if IsNullRect(MouseInTabRect)
  2851.         then
  2852.           Self.MouseInTabRect := TabRect
  2853.         else
  2854.           Self.MouseInTabRect := MouseInTabRect;
  2855.         //
  2856.         Self.TabsBGRect := TabsBGRect;
  2857.         Self.TabLeftOffset := TabLeftOffset;
  2858.         Self.TabRightOffset := TabRightOffset;
  2859.         //
  2860.         Self.FontName := FontName;
  2861.         Self.FontColor := FontColor;
  2862.         Self.ActiveFontColor := FocusFontColor;
  2863.         Self.MouseInFontColor := MouseInFontColor;
  2864.         Self.FontStyle := FontStyle;
  2865.         Self.FontHeight := FontHeight;
  2866.         Self.UpDown := UpDown;
  2867.       end;
  2868. end;
  2869. procedure TbsSkinMDITabsBar.ChangeSkinData;
  2870. begin
  2871.   inherited;
  2872.   if FIndex <> -1
  2873.   then
  2874.     Height := RectHeight(TabRect)
  2875.   else
  2876.     Height := FDefaultHeight;
  2877. end;
  2878. procedure TbsSkinMDITabsBar.ClearObjects;
  2879. var
  2880.   I: Integer;
  2881. begin
  2882.   if ObjectList.Count > 0
  2883.   then
  2884.     for I := 0 to ObjectList.Count - 1 do
  2885.      TbsMDITab(ObjectList.Items[I]).Free;
  2886.   ObjectList.Clear;   
  2887. end;
  2888. procedure TbsSkinMDITabsBar.AddTab(Child: TCustomForm);
  2889. begin
  2890.   ObjectList.Add(TbsMDITab.Create(Self, Child));
  2891.   RePaint;
  2892. end;
  2893. procedure TbsSkinMDITabsBar.DeleteTab(Child: TCustomForm);
  2894. var
  2895.   I: Integer;
  2896. begin
  2897.   for I := 0 to ObjectList.Count - 1 do
  2898.     if TbsMDITab(ObjectList.Items[I]).Child = Child
  2899.     then
  2900.       begin
  2901.         TbsMDITab(ObjectList.Items[I]).Free;
  2902.         ObjectList.Delete(I);
  2903.         Break;
  2904.       end;
  2905.   RePaint;
  2906. end;
  2907. procedure TbsSkinMDITabsBar.CreateControlDefaultImage;
  2908. var
  2909.   I, X: Integer;
  2910.   R: TRect;
  2911. begin
  2912.   with B.Canvas do
  2913.   begin
  2914.     Brush.Color := clBtnFace;
  2915.     FillRect(Rect(0, 0, B.Width, B.Height));
  2916.   end;
  2917.   //
  2918.   if ObjectList.Count > 0
  2919.   then
  2920.     begin
  2921.       CalcObjectRects;
  2922.       for I := 0 to ObjectList.Count - 1 do
  2923.         if (I <> DragIndex) or not FDown
  2924.         then
  2925.           TbsMDITab(ObjectList.Items[I]).Draw(B.Canvas);
  2926.       if (DragIndex <> -1) and IsDrag
  2927.       then
  2928.         begin
  2929.           TbsMDITab(ObjectList.Items[DragIndex]).Draw(B.Canvas);
  2930.           I := Self.GetMoveIndex;
  2931.           if I <> -1
  2932.           then
  2933.             begin
  2934.               R := TbsMDITab(ObjectList.Items[I]).ObjectRect;
  2935.               with B.Canvas do
  2936.               begin
  2937.                 Pen.Mode := pmNot;
  2938.                 Brush.Style := bsClear;
  2939.                 if TabDX > 0
  2940.                 then
  2941.                   X := R.Right
  2942.                 else
  2943.                   X := R.Left;
  2944.                 MoveTo(X, 0); LineTo(X, Height);
  2945.                 MoveTo(X + 1, 0); LineTo(X + 1, Height);
  2946.                 MoveTo(X - 1, 0); LineTo(X - 1, Height);
  2947.                 MoveTo(X + 2, Height div 2);
  2948.                 LineTo(X + 5, Height div 2 - 3);
  2949.                 LineTo(X + 5, Height div 2 + 3);
  2950.                 LineTo(X + 2, Height div 2);
  2951.                 MoveTo(X - 2, Height div 2);
  2952.                 LineTo(X - 5, Height div 2 - 3);
  2953.                 LineTo(X - 5, Height div 2 + 3);
  2954.                 LineTo(X - 2, Height div 2);
  2955.               end;
  2956.             end;
  2957.         end;
  2958.     end;
  2959. end;
  2960. procedure TbsSkinMDITabsBar.CreateControlSkinImage;
  2961. var
  2962.   I: Integer;
  2963.   rw, rh, w, h, XCnt, YCnt, X, Y, XO, YO: Integer;
  2964.   R: TRect;
  2965. begin
  2966.   w := RectWidth(TabsBGRect);
  2967.   h := RectHeight(TabsBGRect);
  2968.   rw := B.Width;
  2969.   rh := B.Height;
  2970.   XCnt := rw div w;
  2971.   YCnt := rh div h;
  2972.   for X := 0 to XCnt do
  2973.   for Y := 0 to YCnt do
  2974.   begin
  2975.     if X * w + w > rw then XO := X * w + w - rw else XO := 0;
  2976.     if Y * h + h > rh then YO := Y * h + h - rh else YO := 0;
  2977.      B.Canvas.CopyRect(Rect(X * w, Y * h, X * w + w - XO, Y * h + h - YO),
  2978.                    Picture.Canvas,
  2979.                    Rect(TabsBGRect.Left, TabsBGRect.Top,
  2980.                         TabsBGRect.Right - XO, TabsBGRect.Bottom - YO));
  2981.   end;
  2982.   //
  2983.   if ObjectList.Count > 0
  2984.   then
  2985.     begin
  2986.       CalcObjectRects;
  2987.       for I := 0 to ObjectList.Count - 1 do
  2988.         if (I <> DragIndex) or not FDown
  2989.         then
  2990.           TbsMDITab(ObjectList.Items[I]).Draw(B.Canvas);
  2991.       if (DragIndex <> -1) and IsDrag
  2992.       then
  2993.         begin
  2994.           TbsMDITab(ObjectList.Items[DragIndex]).Draw(B.Canvas);
  2995.           I := Self.GetMoveIndex;
  2996.           if I <> -1
  2997.           then
  2998.             begin
  2999.               R := TbsMDITab(ObjectList.Items[I]).ObjectRect;
  3000.               with B.Canvas do
  3001.               begin
  3002.                 Pen.Mode := pmNot;
  3003.                 Brush.Style := bsClear;
  3004.                 if TabDX > 0
  3005.                 then
  3006.                   X := R.Right
  3007.                 else
  3008.                   X := R.Left;
  3009.                 MoveTo(X, 0); LineTo(X, Height);
  3010.                 MoveTo(X + 1, 0); LineTo(X + 1, Height);
  3011.                 MoveTo(X - 1, 0); LineTo(X - 1, Height);
  3012.                 MoveTo(X + 2, Height div 2);
  3013.                 LineTo(X + 5, Height div 2 - 3);
  3014.                 LineTo(X + 5, Height div 2 + 3);
  3015.                 LineTo(X + 2, Height div 2);
  3016.                 MoveTo(X - 2, Height div 2);
  3017.                 LineTo(X - 5, Height div 2 - 3);
  3018.                 LineTo(X - 5, Height div 2 + 3);
  3019.                 LineTo(X - 2, Height div 2);
  3020.               end;
  3021.             end;
  3022.         end;
  3023.     end;
  3024. end;
  3025. end.