📄 scolordialog.pas
字号:
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 + -