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

Delphi控件源码

开发平台:

Delphi

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