📄 flatctrls.pas
字号:
fLabel.FocusControl := self;
fLabel.Font.Assign(Font);
end;
if (DefaultHasTicket)and(not Assigned(FTicket)) then
begin
FTicket := TFlatTicket.Create(self);
FTicket.FreeNotification(Self);
FTicket.AutoSize := True;
FTicket.Transparent := True;
FTicket.FocusControl := Self;
end;
end;
constructor TDefineEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csFramed];
ParentFont := True;
AutoSize := False;
Ctl3D := False;
BorderStyle := bsNone;
FFocusColor := clWhite;
FBorderColor := DefaultBorderColor;
FFlatColor := DefaultFlatColor;
FParentColor := True;
FAlignment := taLeftJustify;
FTicketPosition := poLeft;
FTicketSpace := 3;
SetupInternalLabel;
end;
destructor TDefineEdit.Destroy;
begin
if Assigned(fLabel) then
fLabel.Free;
if Assigned(FTicket) then
FTicket.Free;
inherited destroy;
end;
procedure TDefineEdit.RedrawBorder(const Clip: HRGN);
var
Attrib:TBorderAttrib;
begin
with Attrib do
begin
Ctrl := self;
FocusColor := ColorFocused;
BorderColor := ColorBorder;
FlatColor := ColorFlat;
MouseState := FMouseIn;
FocusState := Focused;
DesignState := ComponentState;
HasBars := false;
end;
Color := DrawEditBorder(Attrib,Clip);
if (not(csDesigning in ComponentState))and(Assigned(fLabel)) then
begin
if not Focused then
fLabel.Visible := self.Text = ''
else
fLabel.Visible := False;
if fLabel.Visible then
begin
fLabel.Font.Assign(self.Font);
fLabel.Width := self.Width;
fLabel.Top := (self.Height-fLabel.Height) div 2;
fLabel.Left := 0;
fLabel.Caption := self.Hint;
end;
end;
end;
procedure TDefineEdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do begin
Params.Style := Params.Style or ES_MULTILINE or Aligns[FAlignment];
end;
end;
procedure TDefineEdit.KeyPress(var Key: Char);
begin
inherited KeyPress(Key);
if (Key = Char(VK_RETURN)) then
Key := #0;
end;
procedure TDefineEdit.SetParentColor(Value: Boolean);
begin
if Value <> FParentColor then
begin
FParentColor := Value;
if FParentColor then
begin
if Parent <> nil then
FFlatColor := TForm(Parent).Color;
RedrawBorder(0);
end;
end;
end;
procedure TDefineEdit.LabelMouseEnter(Sender: TObject);
begin
if (not(csDesigning in ComponentState))and(Assigned(fLabel)) then begin
fLabel.Visible := false;
self.SetFocus;
end;
end;
procedure TDefineEdit.SetTicketPosition(const Value: TTicketPosition);
begin
if Assigned(FTicket) then
begin
FTicketPosition := Value;
SetTicketPoint(Value,Self,Ticket,FTicketSpace);
end;
end;
procedure TDefineEdit.SetTicketSpace(const Value: Integer);
begin
if Assigned(FTicket) then
begin
FTicketSpace := Value;
SetTicketPosition(FTicketPosition);
end;
end;
procedure TDefineEdit.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited SetBounds(ALeft, ATop, AWidth, AHeight);
SetTicketPosition(FTicketPosition);
end;
procedure TDefineEdit.SetParent(AParent: TWinControl);
begin
if Assigned(FTicket) then
begin
FTicket.Parent := AParent;
FTicket.Visible := Visible;
end;
inherited SetParent(AParent);
end;
procedure TDefineEdit.CMBidimodechanged(var Message: TMessage);
begin
inherited;
if Assigned(FTicket) then FTicket.BiDiMode := BiDiMode;
end;
procedure TDefineEdit.CMVisiblechanged(var Message: TMessage);
begin
inherited;
if Assigned(FTicket) then FTicket.Visible := Visible;
end;
procedure TDefineEdit.SetName(const Value: TComponentName);
begin
if Assigned(FTicket) then
begin
if (csDesigning in ComponentState) and ((FTicket.GetTextLen = 0) or
(CompareText(FTicket.Caption, Name) = 0)) then
FTicket.Caption := Value;
end;
inherited SetName(Value);
if (csDesigning in ComponentState)and(Assigned(FTicket))and
((GetTextLen = 0)or(CompareText(Text, Name) = 0)) then
Text := '';
end;
procedure TDefineEdit.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FTicket) and (Operation = opRemove) then
FTicket := nil;
end;
procedure TDefineEdit.CMSysColorChange(var Message: TMessage);
begin
if (Parent <> nil)and(FParentColor) then
FFlatColor := TForm(Parent).Color;
RedrawBorder(0);
end;
procedure TDefineEdit.CMParentColorChanged(var Message: TWMNoParams);
begin
if (Parent <> nil)and(FParentColor) then
FFlatColor := TForm(Parent).Color;
RedrawBorder(0);
end;
procedure TDefineEdit.SetColors(Index: Integer; Value: TColor);
begin
case Index of
0: FFocusColor := Value;
1: FBorderColor := Value;
2: begin
FFlatColor := Value;
FParentColor := False;
end;
end;
RedrawBorder(0);
end;
procedure TDefineEdit.CMMouseEnter(var Message: TMessage);
begin
inherited;
if (GetActiveWindow <> 0) then
begin
FMouseIn := True;
RedrawBorder(0);
end;
end;
procedure TDefineEdit.CMMouseLeave(var Message: TMessage);
begin
inherited;
FMouseIn := False;
RedrawBorder(0);
end;
procedure TDefineEdit.NewAdjustHeight;
var
DC: HDC;
SaveFont: HFONT;
Metrics: TTextMetric;
begin
DC := GetDC(0);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
Height := Metrics.tmHeight + 6;
end;
procedure TDefineEdit.Loaded;
begin
inherited;
if not(csDesigning in ComponentState) then
begin
NewAdjustHeight;
end;
end;
procedure TDefineEdit.CMTextChanged(var Message: TMessage);
begin
inherited;
if not(csDesigning in ComponentState) and Assigned(fLabel) then
begin
if fLabel.Visible then
fLabel.Visible := false;
if (not fLabel.Visible) and (Text = '') then
fLabel.Visible := True;
end;
end;
procedure TDefineEdit.CMEnabledChanged(var Message: TMessage);
const
EnableColors: array[Boolean] of TColor= (clBtnFace, clWindow);
begin
inherited;
Color := EnableColors[Enabled];
if assigned(FTicket) then FTicket.Enabled := Enabled;
if (not(csDesigning in ComponentState))and(assigned(fLabel)) then
fLabel.Enabled := Enabled;
RedrawBorder(0);
end;
procedure TDefineEdit.CMFontChanged(var Message: TMessage);
begin
inherited;
if not((csDesigning in ComponentState) and (csLoading in ComponentState)) then
NewAdjustHeight;
if (not(csDesigning in ComponentState))and(assigned(fLabel)) then
fLabel.Font.Assign(Font);
end;
procedure TDefineEdit.WMSetFocus(var Message: TWMSetFocus);
begin
inherited;
if not(csDesigning in ComponentState) then
begin
RedrawBorder(0);
SelectAll;
end;
end;
procedure TDefineEdit.WMKillFocus(var Message: TWMKillFocus);
begin
inherited;
if not(csDesigning in ComponentState) then
RedrawBorder(0);
end;
procedure TDefineEdit.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
inherited;
InflateRect(Message.CalcSize_Params^.rgrc[0], -3, -3);
end;
procedure TDefineEdit.WMNCPaint(var Message: TMessage);
begin
inherited;
RedrawBorder(HRGN(Message.WParam));
end;
procedure TDefineEdit.SetAlignment(const Value: TAlignment);
begin
If FAlignment <> Value Then
begin
FAlignment := Value;
RecreateWnd;
end;
end;
{ TFlatInteger }
constructor TFlatInteger.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csSetCaption];
FButton := TDefineSpin.Create(Self);
FButton.Parent := Self;
FButton.Width := 32;
FButton.Height := 10;
FButton.Visible := True;
FButton.FocusControl := Self;
FButton.OnUpClick := UpClick;
FButton.OnDownClick := DownClick;
Text := '0';
FIncrement := 1;
FMaxValue := 0;
FMinValue := 0;
FEditorEnabled := True;
end;
destructor TFlatInteger.Destroy;
begin
FButton := nil;
inherited Destroy;
end;
procedure TFlatInteger.UpClick (Sender: TObject);
begin
if ReadOnly then
MessageBeep(0)
else
Value := Value + FIncrement;
end;
procedure TFlatInteger.DownClick (Sender: TObject);
begin
if ReadOnly then
MessageBeep(0)
else
Value := Value - FIncrement;
end;
procedure TFlatInteger.KeyDown(var Key: Word; Shift: TShiftState);
begin
case Key of
VK_UP: UpClick(Self);
VK_DOWN: DownClick(Self);
end;
inherited KeyDown(Key, Shift);
end;
function TFlatInteger.IsValidChar(Key: Char): Boolean;
begin
Result := (Key in ['0'..'9',#8,#13]);
if not FEditorEnabled and Result then
Result := False;
end;
procedure TFlatInteger.KeyPress(var Key: Char);
begin
if not IsValidChar(Key) then begin
Key := #0;
MessageBeep(0)
end;
if Key <> #0 then
inherited KeyPress(Key);
end;
procedure TFlatInteger.WMSize(var Message: TWMSize);
var
MinHeight: Integer;
begin
inherited;
MinHeight := GetMinHeight;
if Height < MinHeight then
Height := MinHeight
else
if FButton <> nil then
begin
FButton.SetBounds(Width - FButton.Width - 5, 0, FButton.Width, Height - 6);
SetEditRect(Handle, Clientwidth, ClientHeight, FButton.Width);
end;
end;
function TFlatInteger.GetMinHeight: Integer;
var
DC: HDC;
SaveFont: HFont;
SysMetrics, Metrics: TTextMetric;
begin
DC := GetDC(0);
GetTextMetrics(DC, SysMetrics);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
Result := Metrics.tmHeight + 7;
ReleaseDC(0, DC);
end;
function TFlatInteger.CheckValue(NewValue: LongInt): LongInt;
begin
Result := NewValue;
if (FMaxValue <> FMinValue) then
begin
if NewValue < FMinValue then
Result := FMinValue
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -