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

📄 scolordialog.pas

📁 Alpha Controls 5.40,delphi上的alpha开发源码控件包。没有密码。5.40版的最新版。
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  TempValue : real;
begin
  ColorChanging := True;
  SelectedPanel.Color := ColorToRGB(c);
  SelectedPanel.SkinData.Invalidate;
  sColor.C := c;
  if not UseCoords then begin
    SelectedHsv := Rgb2Hsv(sColor);
    InternalColor := Hsv2Rgb(SelectedHsv.h, SelectedHsv.s, 1).C;
  end;
  if not HsvChanging then begin
    sHEdit.Value := Round(SelectedHsv.H);
    if not UseCoords then begin
      sSEdit.Value := SelectedHsv.S * 100;
      sVEdit.Value := SelectedHsv.V * 100
    end
    else begin
      if GradY < GradPanel.Height div 2 then begin
        TempValue := SelectedHsv.S * 100;
        sSEdit.Value := (TempValue * 2) / GradPanel.Height * (GradY + 1);

      end else sVEdit.Value := (1 - abs(GradPanel.Height div 2 - GradY) / (GradPanel.Height div 2)) * 100;
    end;
  end;

  if not RgbChanging then begin
    sREdit.Value := sColor.R;
    sGEdit.Value := sColor.G;
    sBEdit.Value := sColor.B;
  end;

  if not DecChanging then sEditDecimal.Text := IntToStr(sColor.C);
  if not HexChanging then sEditHex.Text := IntToHex(SwapColor(sColor.C), 6);

  SelectedPanel.Color := sColor.C;
  SelectedPanel.SkinData.Invalidate;

  if not UseCoords then ColorCoord := Point(SelectedHsv.h * ColorPanel.Width div 360, Round((1 - SelectedHsv.s) * ColorPanel.Height));
  SetMarker;
  ExitPanels;
  ColorChanging := False;
end;

procedure TsColorDialogForm.PaintCursor(mX, mY: integer; Canvas: TCanvas);
begin
  Canvas.Ellipse(mX - 5, mY - 5, mX + 5, mY + 5);
end;

procedure TsColorDialogForm.MainPalChange(Sender: TObject);
begin
  if (TsColorsPanel(Sender).ItemIndex <> -1) and not ((Sender = AddPal) and (AddPal.Colors[AddPal.ItemIndex]='FFFFFF')) then begin
    SetCurrentColor(TsColorsPanel(Sender).ColorValue);
//    ColorPanel.Perform(WM_PAINT, 0, 0);
    ColorPanel.SkinData.BGChanged := True;
    ColorPanel.Repaint;
  end;
end;

procedure TsColorDialogForm.sEditHexKeyPress(Sender: TObject; var Key: Char);
begin
  if (Key in ['0'..'9', 'A'..'F', 'a'..'f', Chr(27), Chr(13)]) then inherited else Key := #0;
end;

function TsColorDialogForm.GetColorCoord(C: TsColor): integer;
var
  y : integer;
  RStep, GStep, BStep : real;
  R, G, B : real;
  ImgHeight : integer;
begin
  R := 255; G := 255; B := 255;
  ImgHeight := GradPanel.Height - dblWidth;

  RStep := (255 - GetRValue(InternalColor)) / (ImgHeight div 2); GStep := (255 - GetGValue(InternalColor)) / (ImgHeight div 2); BStep := (255 - GetBValue(InternalColor)) / (ImgHeight div 2);

  y := 0;
  Result := 0;
  while y < (ImgHeight - 1) div 2 do begin
    R := R - RStep; G := G - GStep; B := B - BStep;
    if (abs(c.R - R) < 2) and (abs(c.G - G) < 2) and (abs(c.B - B) < 2) then begin
      Result := y;
      Exit;
    end;
    inc(y)
  end;

  RStep := GetRValue(InternalColor) / (ImgHeight div 2); GStep := GetGValue(InternalColor) / (ImgHeight div 2); BStep := GetBValue(InternalColor) / (ImgHeight div 2);
  while y < ImgHeight do begin
    R := R - RStep; G := G - GStep; B := B - BStep;
    if (abs(c.R - R) < 2) and (abs(c.G - G) < 2) and (abs(c.B - B) < 2) then begin
      Result := y;
      Exit;
    end;
    inc(y)
  end;
end;

procedure TsColorDialogForm.SetInternalColor(h : integer; s: real);
var
  sColor, sC : TsColor;
begin
  ColorChanging := True;
  SelectedHsv.h := h;
  SelectedHsv.s := s;
  sColor := Hsv2Rgb(h, s, 1);
  InternalColor := sColor.C;

  sHEdit.Value := Round(SelectedHsv.H);
  sSEdit.Value := SelectedHsv.S * 100;
  if GradY < GradPanel.Height div 2
    then sVEdit.Value := 100
    else sVEdit.Value := (1 - abs(GradPanel.Height div 2 - GradY) / (GradPanel.Height div 2)) * 100;

  GradPanel.SkinData.BGChanged := True;
  GradPanel.Repaint;
  sC.C := GradToColor(GradY);

  sREdit.Value := sC.R;
  sGEdit.Value := sC.G;
  sBEdit.Value := sC.B;

  sEditDecimal.Text := IntToStr(sC.C);
  sEditHex.Text := IntToHex(SwapColor(sC.C), 6);

  SelectedPanel.Color := sC.C;
  SelectedPanel.SkinData.Invalidate;

  ColorCoord := Point(SelectedHsv.h * ColorPanel.Width div 360, Round((1 - SelectedHsv.s) * ColorPanel.Height));

  ExitPanels;
  ColorChanging := False;
end;

procedure TsColorDialogForm.FormPaint(Sender: TObject);
var
  x, y, mx, my : integer;
begin
  mx := GradPanel.Left + GradPanel.Width;
  my := GradPanel.top + GradY;
  for y := 0 to 5 do for x := 0 to 5 do if x > 5 - y then Canvas.Pixels[mX + X, my + Y - 5] := 0;
  for y := 0 to 5 do for x := 0 to 5 do if x > y then Canvas.Pixels[mX + X, my + Y] := 0;
end;

procedure TsColorDialogForm.sEditHexChange(Sender: TObject);
begin
  SetColorFromEdit(SwapColor(HexToInt(ExtractWord(1, sEditHex.Text, [' ']))), HexChanging);
end;

procedure TsColorDialogForm.sEditDecimalChange(Sender: TObject);
begin
  SetColorFromEdit(sEditDecimal.AsInteger, DecChanging);
end;

procedure TsColorDialogForm.sHEditChange(Sender: TObject);
begin
  SetColorFromEdit(Hsv2Rgb(sHEdit.asInteger, sSEdit.Value / 100, sVEdit.Value / 100).C, HsvChanging);
end;

procedure TsColorDialogForm.SetColorFromEdit(Color: TColor; var Flag: boolean);
begin
  if not ColorChanging then begin
    Flag := True;
    SetCurrentColor(Color);
    MainPal.ItemIndex := -1;
//    ColorPanel.Perform(WM_PAINT, 0, 0);
    ColorPanel.SkinData.BGChanged := True;
    ColorPanel.Repaint;
    Flag := False;
  end;
end;

procedure TsColorDialogForm.sREditChange(Sender: TObject);
var c : TsColor; begin
  c.R := sREdit.AsInteger; c.G := sGEdit.AsInteger; c.B := sBEdit.AsInteger;
  SetColorFromEdit(c.C, RgbChanging);
end;

procedure TsColorDialogForm.FormCreate(Sender: TObject);
begin
  CurrCustomIndex := 0;
  CreateExtBmp;
end;

procedure TsColorDialogForm.sBitBtn4Click(Sender: TObject);
begin
  Width := Constraints.MaxWidth;
  sBitBtn4.Enabled := False;
end;

procedure TsColorDialogForm.sBitBtn5Click(Sender: TObject);
begin
  Application.HelpContext(Owner.Helpcontext);
end;

procedure TsColorDialogForm.sBitBtn3Click(Sender: TObject);
begin
  if AddPal.ItemIndex <> -1 then AddPal.Colors[AddPal.ItemIndex] := sEditHex.Text else begin
    AddPal.Colors[CurrCustomIndex] := sEditHex.Text;
    inc(CurrCustomIndex)
  end;
  AddPal.GenerateColors;
  AddPal.SkinData.Invalidate;
end;

procedure TsColorDialogForm.ExitPanels;
begin
  if MainPal.ItemIndex <> - 1 then if MainPal.ColorValue <> SelectedPanel.Color then MainPal.ItemIndex := -1;
  if AddPal.ItemIndex <> - 1 then if AddPal.ColorValue <> SelectedPanel.Color then begin
    CurrCustomIndex := AddPal.ItemIndex;
    AddPal.ItemIndex := -1;
  end;
end;

procedure TsColorDialogForm.sSpeedButton1Click(Sender: TObject);
var
  DC, SavedDC : hdc;
  PickForm : TForm;
  p : TPoint;
begin
  b := TBitmap.Create;
  b.Width := Screen.Width;
  b.Height := Screen.Height;
  DC := GetDC(0);
  SavedDC := SaveDC(DC);
  try
    BitBlt(b.Canvas.Handle, 0, 0, b.width, b.height, dc, 0, 0, SRCCOPY);
    PickForm := TForm.Create(Application);
    PickForm.Visible := False;
    PickForm.DoubleBuffered := True;
    PickPanel := TPanel.Create(PickForm);
    PickPanel.BorderStyle := bsSingle;
    PickPanel.BevelOuter := bvNone;
    PickPanel.ParentCtl3D := False;
    PickPanel.Ctl3D := False;
    PickPanel.Width := SelectedPanel.Width;
    PickPanel.Height := SelectedPanel.Height;
    PickPanel.Color := SelectedPanel.Color;
    p := SelectedPanel.ClientToScreen(Point(0, 0));
    PickPanel.Left := p.x - 1;
    PickPanel.Top := p.y - 1;
    PickPanel.Parent := PickForm;
    PickPanel.Visible := True;

    PickForm.OnMouseMove := PickFormMouseMove;

    PickForm.Cursor := crHandPoint;
    PickForm.Cursor := crCross;
    PickForm.BorderStyle := bsNone;
    PickForm.WindowState := wsMaximized;
    PickForm.OnPaint := PickFormPaint;
    PickForm.OnMouseDown := PickFormMouseDown;
    PickForm.OnKeyDown := PickFormKeyDown;
    PickForm.ShowModal;
    FreeAndNil(PickPanel);
    FreeAndNil(PickForm);
  finally
    RestoreDC(DC, SavedDC);
    FreeAndNil(b);
  end;
end;

procedure TsColorDialogForm.PickFormPaint(Sender: TObject);
begin
  BitBlt(TForm(Sender).Canvas.Handle, 0, 0, b.width, b.height, b.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TsColorDialogForm.PickFormMouseDown(Sender: TObject;  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PickColor := b.Canvas.Pixels[x, y];
  SetCurrentColor(PickColor);
  TForm(Sender).Close;
end;

procedure TsColorDialogForm.PickFormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = 27 then TForm(Sender).Close
end;

procedure TsColorDialogForm.PickFormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if PickPanel <> nil then begin
    PickColor := b.Canvas.Pixels[x, y];
    PickPanel.Color := PickColor;
//    SetCurrentColor(PickColor);
  end;
end;

procedure TsColorDialogForm.InitLngCaptions;
begin
  sBitBtn1.Caption := LoadStr(s_MsgDlgOK);
  sBitBtn2.Caption := LoadStr(s_MsgDlgCancel);
  sBitBtn3.Caption := LoadStr(s_ColorDlgAdd);
  sBitBtn4.Caption := LoadStr(s_ColorDlgDefine);
  sBitBtn5.Caption := LoadStr(s_MsgDlgHelp);

  sLabel1.Caption  :=  LoadStr(s_ColorDlgMainPal);
  sLabel2.Caption  :=  LoadStr(s_ColorDlgAddPal);

  Caption                   := LoadStr(s_ColorDlgTitle);
  sREdit.BoundLabel.Caption := LoadStr(s_ColorDlgRed);
  sGEdit.BoundLabel.Caption := LoadStr(s_ColorDlgGreen);
  sBEdit.BoundLabel.Caption := LoadStr(s_ColorDlgBlue);
  sEditHex.BoundLabel.Caption := LoadStr(s_ColorDlgHex);
  sEditDecimal.BoundLabel.Caption := LoadStr(s_ColorDlgDecimal);
end;

function TsColorDialogForm.MarkerRect: TRect;
begin
  Result := Rect(GradPanel.Left + GradPanel.Width, 0, Width, GradPanel.Top + GradPanel.Height + 4);
end;

procedure TsColorDialogForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  R : TRect;
begin
  R := MarkerRect;
  inc(R.Top, GradPanel.Top);
  R.Bottom := GradPanel.Top + GradPanel.Height;
  if PtInRect(R, Point(x, y)) then begin
    GradPanel.OnMouseDown(GradPanel, Button, Shift, X - GradPanel.Left - GradPanel.Width, Y - GradPanel.Top);
  end;
end;

procedure TsColorDialogForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  R : TRect;
begin
  R := MarkerRect;
  inc(R.Top, GradPanel.Top);
  R.Bottom := GradPanel.Top + GradPanel.Height;
  if PtInRect(R, Point(x, y)) then begin
    GradPanel.OnMouseMove(GradPanel, Shift, X - GradPanel.Left - GradPanel.Width, Y - GradPanel.Top);
  end;
end;

procedure TsColorDialogForm.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  R : TRect;
begin
  R := MarkerRect;
  inc(R.Top, GradPanel.Top);
  R.Bottom := GradPanel.Top + GradPanel.Height;
  if PtInRect(R, Point(x, y)) then begin
    GradPanel.OnMouseUp(GradPanel, Button, Shift, X - GradPanel.Left - GradPanel.Width, Y - GradPanel.Top);
  end;
end;

procedure TsColorDialogForm.MainPalDblClick(Sender: TObject);
begin
  sBitBtn1.Click
end;

procedure TsColorDialogForm.AddPalDblClick(Sender: TObject);
begin
  sBitBtn1.Click
end;

end.

⌨️ 快捷键说明

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