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

📄 be_controls.pas

📁 KSDev.BlockEngine.v3.03.rar 界面控件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
end;

procedure TbeFillColorBox.Change;
begin
  inherited;
  if (FEditor <> nil) and (FEditor.FocusedBlock <> nil) then
  begin
    FEditor.FocusedBlock.Fill.Color := ColorValue;
    FEditor.FocusedBlock.Repaint;
  end;
end;

procedure TbeFillColorBox.DoChangeFocus(Sender: TObject);
begin
  inherited;
  if (FEditor <> nil) and (FEditor.FocusedBlock <> nil) then
  begin
    ColorValue := FEditor.FocusedBlock.Fill.Color;
  end;
end;

procedure TbeFillColorBox.RebuildList;
const
  ColorCount = 7;
  HueCount   = 10;
var
  r, g, b: integer;
  h, l: integer;
  C: TColor;
begin
  inherited;
  Items.Clear;
  { Gray }
  for r := 0 to ColorCount do
    Items.Add(IntToStr(RGB(Round((r / ColorCount) * $FF), Round((r / ColorCount) * $FF), Round((r / ColorCount) * $FF))));

  { HSL ----}
  for h := 0 to HueCount do // hue
    for l := 0 to ColorCount do // lum
    begin
      Items.Add(IntToStr(HSLtoRGB(h / (HueCount + 1), 0.5, (l + 1) / (ColorCount + 2))));
    end;
end;

procedure TbeFillColorBox.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
var
  G: TGPGraphics;
  P: TGPPen;
begin
  with Canvas do
  begin
    if odFocused in State then
    begin
      Brush.Color := clHighlight;
      FillRect(Rect);
      Brush.Color := clWhite;
    end
    else
    begin
      Brush.Color := Color;
      FillRect(Rect);
      Brush.Color := clBlack;
    end;
    
    Brush.Color := StringToColor(Items[Index]);
    InflateRect(Rect, -2, -2);
    FillRect(Rect);

    if odFocused in State then
      DrawRect(Canvas, Rect, clHighlightText)
    else
      DrawRect(Canvas, Rect, clWindowText)
  end;
end;

function TbeFillColorBox.GetColor: ColorType;
begin
  if ItemIndex >= 0 then
    Result := $FF000000 or FromRGB(ColorToRGB(StringToColor(Items[ItemIndex])))
  else
    Result := $FF000000;
end;

function TbeFillColorBox.GetRandomColor: ColorType;
begin
  Result := $FF000000 or FromRGB(ColorToRGB(StringToColor(Items[random(16)])))
end;

procedure TbeFillColorBox.SetColor(const Value: ColorType);
begin
  ItemIndex := Items.IndexOf(ColorToString(ToRGB(Value) and not $FF000000));
end;

{ TbeFillAlphaBox =========================================================}

constructor TbeFillAlphaBox.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TbeFillAlphaBox.Destroy;
begin
  inherited;
end;

procedure TbeFillAlphaBox.Change;
begin
  inherited;
  if (FEditor <> nil) and (FEditor.FocusedBlock <> nil) then
  begin
    FEditor.FocusedBlock.Fill.Color := (FEditor.FocusedBlock.Fill.Color and not $FF000000) or (Alpha shl 24);
    FEditor.FocusedBlock.Repaint;
  end;
end;

procedure TbeFillAlphaBox.RebuildList;
begin
  inherited;
  Items.Add('100');
  Items.Add('90');
  Items.Add('80');
  Items.Add('70');
  Items.Add('60');
  Items.Add('50');
  Items.Add('40');
  Items.Add('30');
  Items.Add('20');
  Items.Add('10');
  Items.Add('0');
end;

procedure TbeFillAlphaBox.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
var
  G: TGPGraphics;
  P: TGPPen;
  B: TGPBrush;
  R: TRect;
begin
  with Canvas do
  begin
    if odFocused in State then
    begin
      Brush.Color := clHighlight;
      FillRect(Rect);
      Brush.Color := clWhite;
    end
    else
    begin
      Brush.Color := Color;
      FillRect(Rect);
      Brush.Color := clBlack;
    end;

    { Draw Fill alhpa selection }
    G := TGPGraphics.Create(Canvas.Handle, 0, 0);
    try
      G.SetPageUnit(UnitPixel);
      P := TGPPen.Create(aclBlack, 1);
      B := TGPSolidBrush.Create($0 or (Round((StrToInt(Items[Index]) / 100) * $FF) shl 24));

      R := Rect;
      InflateRect(R, -2, -2);
      R.Right := R.Left + 30;
      with R do
      begin
        G.FillRectangle(B, Left, Top, Right - Left, Bottom - Top);
        G.DrawRectangle(P, Left, Top, Right - Left, Bottom - Top);
      end;
      P.Free;

      
      if (odSelected in State) or (odFocused in State) then
        Canvas.Font.Color := clHighlightText
      else
        Canvas.Font.Color := clWindowText;
      InflateRect(Rect, -4, -2);
      Rect.Left := 40;
      DrawText(Canvas, Items[Index] + '%', Rect, DT_SINGLELINE or DT_VCENTER);
    finally
      G.Free;
    end;
  end;
end;

function TbeFillAlphaBox.GetAlpha: byte;
begin
  if ItemIndex >= 0 then
    Result := Round((StrToInt(Items[ItemIndex]) / 100) * $FF)
  else
    Result := $FF;
end;

procedure TbeFillAlphaBox.SetAlpha(const Value: byte);
begin
  ItemIndex := Round((($FF - Value) / $FF) * 10);
end;

{ TbeFillStyleBox =========================================================}

constructor TbeFillStyleBox.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TbeFillStyleBox.Destroy;
begin
  inherited;
end;

procedure TbeFillStyleBox.Change;
begin
  inherited;
  if (FEditor <> nil) and (FEditor.FocusedBlock <> nil) then
  begin
    FEditor.FocusedBlock.Fill.Style := GetStyle;
    FEditor.FocusedBlock.Fill.Pattern := GetPattern;
    FEditor.FocusedBlock.Fill.GradientAngle := GetGradientAngle;
    FEditor.FocusedBlock.Repaint;
  end;
end;

procedure TbeFillStyleBox.DoChangeFocus(Sender: TObject);
begin
  inherited;
  if (FEditor <> nil) and (FEditor.FocusedBlock <> nil) then
  begin
    GradientAngle := FEditor.FocusedBlock.Fill.GradientAngle;
    Pattern := FEditor.FocusedBlock.Fill.Pattern;
    Style := FEditor.FocusedBlock.Fill.Style;
  end;
end;

procedure TbeFillStyleBox.RebuildList;
begin
  inherited;
    Items.Add('  None');
    Items.Add('  Solid');
    Items.Add('  FillPatternHorizontal,                  // = 0,');
    Items.Add('    FillPatternVertical,                    // = 1,');
    Items.Add('    FillPatternForwardDiagonal,             ');// = 2,
    Items.Add('    FillPatternBackwardDiagonal,            ');// = 3,
    Items.Add('    FillPatternCross,                       ');// = 4,
    Items.Add('    FillPatternDiagonalCross,               ');// = 5,
    Items.Add('    FillPattern05Percent,                   ');// = 6,
    Items.Add('    FillPattern10Percent,                   ');// = 7,
    Items.Add('    FillPattern20Percent,                   ');// = 8,
    Items.Add('    FillPattern25Percent,                   ');// = 9,
    Items.Add('FillPattern30Percent,                   ');// = 10,
    Items.Add('FillPattern40Percent,                   ');// = 11,
    Items.Add('FillPattern50Percent,                   ');// = 12,
    Items.Add('FillPattern60Percent,                   ');// = 13,
    Items.Add('FillPattern70Percent,                   ');// = 14,
    Items.Add('FillPattern75Percent,                   ');// = 15,
    Items.Add('FillPattern80Percent,                   ');// = 16,
    Items.Add('FillPattern90Percent,                   ');// = 17,
    Items.Add('FillPatternLightDownwardDiagonal,       ');// = 18,
    Items.Add('FillPatternLightUpwardDiagonal,         ');// = 19,
    Items.Add('FillPatternDarkDownwardDiagonal,        ');// = 20,
    Items.Add('FillPatternDarkUpwardDiagonal,          ');// = 21,
    Items.Add('FillPatternWideDownwardDiagonal,        ');// = 22,
    Items.Add('FillPatternWideUpwardDiagonal,          ');// = 23,
    Items.Add('FillPatternLightVertical,               ');// = 24,
    Items.Add('FillPatternLightHorizontal,             ');// = 25,
    Items.Add('FillPatternNarrowVertical,              ');// = 26,
    Items.Add('FillPatternNarrowHorizontal,            ');// = 27,
    Items.Add('FillPatternDarkVertical,                ');// = 28,
    Items.Add('FillPatternDarkHorizontal,              ');// = 29,
    Items.Add('FillPatternDashedDownwardDiagonal,      ');// = 30,
    Items.Add('FillPatternDashedUpwardDiagonal,        ');// = 31,
    Items.Add('FillPatternDashedHorizontal,            ');// = 32,
    Items.Add('FillPatternDashedVertical,              ');// = 33,
    Items.Add('FillPatternSmallConfetti,               ');// = 34,
    Items.Add('FillPatternLargeConfetti,               ');// = 35,
    Items.Add('FillPatternZigZag,                      ');// = 36,
    Items.Add('FillPatternWave,                        ');// = 37,
    Items.Add('FillPatternDiagonalBrick,               ');// = 38,
    Items.Add('FillPatternHorizontalBrick,             ');// = 39,
    Items.Add('FillPatternWeave,                       ');// = 40,
    Items.Add('FillPatternPlaid,                       ');// = 41,
    Items.Add('FillPatternDivot,                       ');// = 42,
    Items.Add('FillPatternDottedGrid,                  ');// = 43,
    Items.Add('FillPatternDottedDiamond,               ');// = 44,
    Items.Add('FillPatternShingle,                     ');// = 45,
    Items.Add('FillPatternTrellis,                     ');// = 46,
    Items.Add('FillPatternSphere,                      ');// = 47,
    Items.Add('FillPatternSmallGrid,                   ');// = 48,
    Items.Add('FillPatternSmallCheckerBoard,           ');// = 49,
    Items.Add('FillPatternLargeCheckerBoard,           ');// = 50,
    Items.Add('FillPatternOutlinedDiamond,             ');// = 51,
    Items.Add('FillPatternSolidDiamond                ');// = 52,
    Items.Add('FillLinearGradientHorz');
    Items.Add('FillLinearGradientVert');
    Items.Add('FillLinearGradient45');
    Items.Add('FillLinearGradient225');
end;

procedure TbeFillStyleBox.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
var
  G: TGPGraphics;
  B: TGPBrush;
begin
  with Canvas do
  begin
    if odFocused in State then
    begin
      Brush.Color := clHighlight;
      FillRect(Rect);
      Brush.Color := clWhite;
    end
    else
    begin
      Brush.Color := Color;
      FillRect(Rect);
      Brush.Color := clBlack;
    end;
  end;

  G := TGPGraphics.Create(Canvas.Handle, 0, 0);
  try
    if odFocused in State then
    begin
      case Index of
        0: B := TGPSolidBrush.Create(0);
        1: B := TGPSolidBrush.Create(aclWhite);
        2..54: B := TGPHatchBrush.Create(THatchStyle(Index - 1), aclBlack, aclWhite);
        55: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 0);
        56: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 90);
        57: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 45);
        58: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 135);
      else
      end;
    end
    else
    begin
      case Index of
        0: B := TGPSolidBrush.Create(0);
        1: B := TGPSolidBrush.Create(aclBlack);
        2..54: B := TGPHatchBrush.Create(THatchStyle(Index - 1), aclWhite, aclBlack);
        55: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 0);
        56: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 90);
        57: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 45);
        58: B := TGPLinearGradientBrush.Create(MakeRect(Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top),
          aclBlack, aclWhite, 135);
      else
        B := TGPSolidBrush.Create(aclBlack);
      end;
    end;

    G.FillRectangle(B, Rect.Left + 2, Rect.Top + 2, Rect.Right - Rect.Left - 4, Rect.Bottom - Rect.Top - 4);

    B.Free;
  finally
    G.Free;
  end;
end;

function TbeFillStyleBox.GetStyle: FillStyleType;
begin
  case ItemIndex of
    0: Result := FillNone;
    1: Result := FillSolid;
    2..54: Result := FillPattern;
    55: Result := FillLinearGradient;
    56: Result := FillLinearGradient;
    57: Result := FillLinearGradient;
    58: Result := FillLinearGradient;
  else
    Result := FillSolid;
  end;
end;

procedure TbeFillStyleBox.SetStyle(const Value: FillStyleType);
begin
  case Value of
    FillNone: ItemIndex := 0;
    FillSolid: ItemIndex := 1;
    FillPattern: ItemIndex := 1 + Integer(Pattern);
    FillLinearGradient: ItemIndex := 55;
  end;
end;

function TbeFillStyleBox.GetPattern: FillPatternType;
begin
  if (ItemIndex >= 2) and (ItemIndex <= 54) then
    Result := FillPatternType(ItemIndex - 1)
  else
    Result := FillPatternHorizontal;
end;

procedure TbeFillStyleBox.SetPattern(const Value: FillPatternType);
begin
  ItemIndex := Integer(Value) + 1; 
end;

function TbeFillStyleBox.GetGradientAngle: single;
begin
  case ItemIndex of
    55: Result := 0;
    56: Result := 90;
    57: Result := 45;
    58: Result := 135;
  else
    Result := 0;
  end;
end;

procedure TbeFillStyleBox.SetGradientAngle(const Value: single);
begin

end;

end.

⌨️ 快捷键说明

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