⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skintabs.pas

📁 DynamicSkinForm.v9.15.For.Delphi.BCB 很好的皮肤控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  if CanClose
  then
    begin
      I.TabVisible := False;
      if FFreeOnClose then I.Free;
      if Assigned(FOnAfterClose) then FOnAfterClose(Self);
    end;
  if CanClose = False
  then
    begin
      GetCursorPos(P);
      if Windows.WindowFromPoint(P) <> Self.Handle
      then
        begin
          TspSkinCustomTabSheet(I).ButtonMouseIn := False;
          TspSkinCustomTabSheet(I).ButtonMouseDown := False;
          DrawTabs(Canvas);
        end;
    end;     
end;

procedure TspSkinPageControl.DrawCloseButton(Cnvs: TCanvas; R: TRect;
          I, W, H: Integer);
var
  Buffer: TBitMap;
  CIndex: Integer;
  BtnSkinPicture: TBitMap;
  BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint: TPoint;
  BtnCLRect: TRect;
  BSR, ABSR, DBSR, R1: TRect;
  CIX, CIY, X, Y, XO, YO: Integer;
  ButtonData: TspDataSkinButtonControl;
  ButtonR, R2: TRect;
begin
  if FIndex = -1
  then
    begin
      X := R.Left;
      Y := R.Top + RectHeight(R) div 2 - CLOSE_SIZE div 2;
      ButtonR := Rect(X, Y, X + CLOSE_SIZE, Y + CLOSE_SIZE);
      CIX := ButtonR.Left + 2;
      CIY := ButtonR.Top + 2;
      if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseDown and
         TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
      then
        DrawCloseImage(Cnvs, CIX, CIY, clWhite)
      else
      if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
      then
        begin
          DrawCloseImage(Cnvs, CIX, CIY, clWhite)
        end
      else
        begin
          DrawCloseImage(Cnvs, CIX, CIY, clBlack);
        end;
      //
      TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := ButtonR;
      if TabPosition = tpLeft
      then
        begin
          R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
          R2 := Rect(R1.Top, W - R1.Right, R1.Bottom, W - R1.Left);
          TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
        end
      else
      if TabPosition = tpRight
      then
        begin
          R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
          R2 := Rect(H - R1.Bottom, R1.Left, H - R1.Top, R1.Right);
          TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
        end;
      Exit;
    end;

  if not IsNullRect(CloseButtonRect)
  then
    begin
      if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseDown and
         TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
      then
        R1 := CloseButtonDownRect
      else
      if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
      then
        R1 := CloseButtonActiveRect
      else
        R1 := CloseButtonRect;
      X := R.Left;
      Y := R.Top + RectHeight(R) div 2 - RectHeight(R1) div 2;
      ButtonR := Rect(X, Y, X + RectWidth(R1), Y + RectHeight(R1));
      if ButtonTransparent
      then
        begin
          Buffer := TBitMap.Create;
          Buffer.Width := RectWidth(R1);
          Buffer.Height := RectHeight(R1);
          Buffer.Canvas.CopyRect(Rect(0, 0, Buffer.Width, Buffer.Height),
            Picture.Canvas, R1);
          Buffer.Transparent := True;
          Buffer.TransparentMode := tmFixed;
          Buffer.TransparentColor := ButtonTransparentColor;
          Cnvs.Draw(ButtonR.Left, ButtonR.Top, Buffer);
          Buffer.Free;
        end
      else
        Cnvs.CopyRect(ButtonR, Picture.Canvas, R1);

      //
      TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := ButtonR;
      if TabPosition = tpLeft
      then
        begin
          R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
          R2 := Rect(R1.Top, W - R1.Right, R1.Bottom, W - R1.Left);
          TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
        end
      else
      if TabPosition = tpRight
      then
        begin
          R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
          R2 := Rect(H - R1.Bottom, R1.Left, H - R1.Top, R1.Right);
          TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
        end;
      Exit;
    end;
  ButtonData := nil;
  CIndex := FSD.GetControlIndex('resizetoolbutton');
  if CIndex <> -1
  then
    ButtonData := TspDataSkinButtonControl(FSD.CtrlList[CIndex]);
  if ButtonData = nil then Exit;
  //
  ButtonR := Rect(0, 0, FCloseSize, FCloseSize);
  //
  Buffer := TBitMap.Create;
  Buffer.Width := RectWidth(ButtonR);
  Buffer.Height := RectHeight(ButtonR);
  //
  with ButtonData do
  begin
    XO := RectWidth(ButtonR) - RectWidth(SkinRect);
    YO := RectHeight(ButtonR) - RectHeight(SkinRect);
    BtnLTPoint := LTPoint;
    BtnRTPoint := Point(RTPoint.X + XO, RTPoint.Y);
    BtnLBPoint := Point(LBPoint.X, LBPoint.Y + YO);
    BtnRBPoint := Point(RBPoint.X + XO, RBPoint.Y + YO);
    BtnClRect := Rect(CLRect.Left, ClRect.Top,
      CLRect.Right + XO, ClRect.Bottom + YO);
    BtnSkinPicture := TBitMap(SkinData.FActivePictures.Items[ButtonData.PictureIndex]);

    BSR := SkinRect;
    ABSR := ActiveSkinRect;
    DBSR := DownSkinRect;
    if IsNullRect(ABSR) then ABSR := BSR;
    if IsNullRect(DBSR) then DBSR := ABSR;
    //
    if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseDown and
       TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
    then
      begin
        CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
        BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint, BtnCLRect,
        Buffer, BtnSkinPicture, DBSR, Buffer.Width, Buffer.Height, True,
        LeftStretch, TopStretch, RightStretch, BottomStretch,
        StretchEffect, StretchType);
        Buffer.Canvas.Font.Color := DownFontColor;
      end
    else
    if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
    then
      begin
        CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
        BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint, BtnCLRect,
        Buffer, BtnSkinPicture, ABSR, Buffer.Width, Buffer.Height, True,
        LeftStretch, TopStretch, RightStretch, BottomStretch,
        StretchEffect, StretchType);
        Buffer.Canvas.Font.Color := ActiveFontColor;
      end
    else
      begin
        CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
        BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint, BtnCLRect,
        Buffer, BtnSkinPicture, BSR, Buffer.Width, Buffer.Height, True,
        LeftStretch, TopStretch, RightStretch, BottomStretch,
        StretchEffect, StretchType);
        Buffer.Canvas.Font.Color := FontColor;
      end;
   end;

  CIX := Buffer.Width div 2 - 5;
  CIY := Buffer.Height div 2 - 5;

  DrawCloseImage(Buffer.Canvas, CIX, CIY, Buffer.Canvas.Font.Color);

  X := R.Left;
  Y := R.Top + RectHeight(R) div 2 - Buffer.Height div 2;

  TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := Rect(X, Y,
  X + Buffer.Width, Y + Buffer.Height);

  if TabPosition = tpLeft
  then
    begin
      R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
      R2 := Rect(R1.Top, W - R1.Right, R1.Bottom, W - R1.Left);
      TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
    end
  else
  if TabPosition = tpRight
  then
    begin
      R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
      R2 := Rect(H - R1.Bottom, R1.Left, H - R1.Top, R1.Right);
      TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
    end;

  Cnvs.Draw(X, Y, Buffer);
  Buffer.Free;
end;


procedure TspSkinPageControl.SetShowCloseButtons(Value: Boolean);
begin
  if FShowCloseButtons <> Value
  then
    begin
      FShowCloseButtons := Value;
      if FShowCloseButtons
      then
        begin
          if TabPosition in [tpTop, tpBottom]
          then
            FTempImages.Width := FTempImages.Width + FCloseSize
          else
            FTempImages.Height := FTempImages.Height + FCloseSize
        end
      else
        begin
          if TabPosition in [tpTop, tpBottom]
          then
            FTempImages.Width := FTempImages.Width - FCloseSize
          else
            FTempImages.Height := FTempImages.Height - FCloseSize;
        end;
    end;
  Invalidate;
end;

procedure TspSkinPageControl.SetImages(value: TCustomImageList);
begin
  if FImages <> nil then
  begin
    if TabPosition in [tpTop, tpBottom] then
      FTempImages.Width := FTempImages.Width - FImages.Width
    else
      FTempImages.Height := FTempImages.Height - FImages.Height;
  end;

  FImages := Value;

  if FImages <> nil then
  begin
    if TabPosition in [tpTop, tpBottom] then
      FTempImages.Width := FTempImages.Width + FImages.Width
    else // tpLeft, tpRight
      FTempImages.Height := FTempImages.Height + FImages.Height;
  end;

  Invalidate;
end;

procedure TspSkinPageControl.WMCHECKPARENTBG;
begin
  if TabsBGTransparent then RePaint;
end;

procedure TspSkinPageControl.DrawEmptyBackGround(DC: HDC);
var
  C: TCanvas;
  TabSheetBG, Buffer2: TBitMap;
  X, Y, XCnt, YCnt, w, h, w1, h1: Integer;
begin
  if (Width <= 0) or (Height <=0) then Exit;

  C := TCanvas.Create;
  C.Handle := DC;

  if BGPictureIndex <> -1
  then
    begin
      TabSheetBG := TBitMap(FSD.FActivePictures.Items[BGPictureIndex]);

      if StretchEffect and (Width > 0) and (Height > 0)
      then
        begin
          case StretchType of
            spstFull:
              begin
                C.StretchDraw(Rect(0, 0, Width, Height), TabSheetBG);
              end;
            spstVert:
              begin
                Buffer2 := TBitMap.Create;
                Buffer2.Width := Width;
                Buffer2.Height := TabSheetBG.Height;
                Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
                YCnt := Height div Buffer2.Height;
                for Y := 0 to YCnt do
                  C.Draw(0, Y * Buffer2.Height, Buffer2);
                Buffer2.Free;
              end;
           spstHorz:
             begin
               Buffer2 := TBitMap.Create;
               Buffer2.Width := TabSheetBG.Width;
               Buffer2.Height := Height;
               Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
               XCnt := Width div Buffer2.Width;
               for X := 0 to XCnt do
                 C.Draw(X * Buffer2.Width, 0, Buffer2);
               Buffer2.Free;
             end;
          end;
        end
      else
      if (Width > 0) and (Height > 0)
      then
        begin
          XCnt := Width div TabSheetBG.Width;
          YCnt := Height div TabSheetBG.Height;
          for X := 0 to XCnt do
          for Y := 0 to YCnt do
            C.Draw(X * TabSheetBG.Width, Y * TabSheetBG.Height, TabSheetBG);
        end;
    end
 else
   begin
     w1 := Width;
     h1 := Height;
     TabSheetBG := TBitMap.Create;
     TabSheetBG.Width := RectWidth(ClRect);
     TabSheetBG.Height := RectHeight(ClRect);
     TabSheetBG.Canvas.CopyRect(Rect(0, 0, TabSheetBG.Width, TabSheetBG.Height),
       Picture.Canvas,
        Rect(SkinRect.Left + ClRect.Left, SkinRect.Top + ClRect.Top,
             SkinRect.Left + ClRect.Right,
             SkinRect.Top + ClRect.Bottom));

      if StretchEffect and (Width > 0) and (Height > 0)
      then
        begin
          case StretchType of
            spstFull:
              begin
                C.StretchDraw(Rect(0, 0, Width, Height), TabSheetBG);
              end;
            spstVert:
              begin
                Buffer2 := TBitMap.Create;
                Buffer2.Width := Width;
                Buffer2.Height := TabSheetBG.Height;
                Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
                YCnt := Height div Buffer2.Height;
                for Y := 0 to YCnt do
                  C.Draw(0, Y * Buffer2.Height, Buffer2);
                Buffer2.Free;
              end;
           spstHorz:
             begin
               Buffer2 := TBitMap.Create;
               Buffer2.Width := TabSheetBG.Width;
               Buffer2.Height := Height;
               Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
               XCnt := Width div Buffer2.Width;
               for X := 0 to XCnt do
                 C.Draw(X * Buffer2.Width, 0, Buffer2);
               Buffer2.Free;
             end;
          end;
        end
      else
        begin
          w := RectWidth(ClRect);
          h := RectHeight(ClRect);
          XCnt := w1 div w;
          YCnt := h1 div h;
          for X := 0 to XCnt do
          for Y := 0 to YCnt do
            C.Draw(X * w, Y * h, TabSheetBG);
        end;
      TabSheetBG.Free;
   end;
  C.Free;
end;


procedure TspSkinPageControl.SetTabsBGTransparent(Value: Boolean);
begin
  if FTabsBGTransparent <> Value
  then
    begin
      FTabsBGTransparent := Value;
      Invalidate;
    end;
end;

procedure TspSkinPageControl.UpDateTabs;
begin
  if FIndex <> -1
  then
    begin
      if TabHeight <= 0
      then
        SetItemSize(TabWidth, RectHeight(TabRect))
      else
        SetItemSize(TabWidth, TabHeight);
    end
  else
    begin
      if TabHeight <= 0
      then
        SetItemSize(TabWidth, FDefaultItemHeight)
      else
        SetItemSize(TabWidth, TabHeight);
    end;
  if MultiLine and (FSkinUpDown <> nil)
  then
    HideSkinUpDown;
  ReAlign;
end;

procedure TspSkinPageControl.CMMouseLeave;
begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -