📄 toolctrlseh.pas
字号:
var
DC: HDC;
SysMetrics: TTextMetric;
begin
DC := GetDC(0);
GetTextMetrics(DC, SysMetrics);
ReleaseDC(0, DC);
Result := Round(SysMetrics.tmHeight / 3 * 2);
if Result mod 2 = 0 then Dec(Result);
if Result > GetSystemMetrics(SM_CXVSCROLL)
then Result := GetSystemMetrics(SM_CXVSCROLL);
end;
//{$DEBUGINFO OFF}
function VarEquals(const V1, V2: Variant): Boolean;
var i: Integer;
begin
Result := not (VarIsArray(V1) xor VarIsArray(V2));
if not Result then Exit;
Result := False;
try
if VarIsArray(V1) and VarIsArray(V2) and
(VarArrayDimCount(V1) = VarArrayDimCount(V2)) and
(VarArrayLowBound(V1, 1) = VarArrayLowBound(V2, 1)) and
(VarArrayHighBound(V1, 1) = VarArrayHighBound(V2, 1))
then
for i := VarArrayLowBound(V1, 1) to VarArrayHighBound(V1, 1) do
begin
Result := V1[i] = V2[i];
if not Result then Exit;
end
else
Result := V1 = V2;
except
end;
end;
//{$DEBUGINFO ON}
function GetRGBColor(Value: TColor): DWORD;
begin
Result := ColorToRGB(Value);
case Result of
clNone: Result := CLR_NONE;
clDefault: Result := CLR_DEFAULT;
end;
end;
procedure DrawImage(DC: HDC; ARect: TRect; Images: TCustomImageList;
ImageIndex: Integer; Selected: Boolean);
const
ImageTypes: array[TImageType] of Longint = (0, ILD_MASK);
ImageSelTypes: array[Boolean] of Longint = (0, ILD_SELECTED);
var CheckedRect, AUnionRect: TRect;
OldRectRgn, RectRgn: HRGN;
r, x, y: Integer;
procedure DrawIm;
var ABlendColor: TColor;
begin
with Images do
if HandleAllocated then
begin
if Selected then ABlendColor := clHighlight
else ABlendColor := BlendColor;
ImageList_DrawEx(Handle, ImageIndex, DC, x, y, 0, 0,
GetRGBColor(BkColor), GetRGBColor(ABlendColor),
ImageTypes[ImageType] or ImageSelTypes[Selected]);
end;
end;
begin
with Images do
begin
x := (ARect.Right + ARect.Left - Images.Width) div 2;
y := (ARect.Bottom + ARect.Top - Images.Height) div 2;
CheckedRect := Rect(X, Y, X + Images.Width, Y + Images.Height);
UnionRect(AUnionRect, CheckedRect, ARect);
if EqualRect(AUnionRect, ARect) then // ARect containt image
DrawIm
else
begin // Need clip
OldRectRgn := CreateRectRgn(0, 0, 0, 0);
r := GetClipRgn(DC, OldRectRgn);
RectRgn := CreateRectRgn(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
SelectClipRgn(DC, RectRgn);
DeleteObject(RectRgn);
DrawIm;
if r = 0
then SelectClipRgn(DC, 0)
else SelectClipRgn(DC, OldRectRgn);
DeleteObject(OldRectRgn);
end;
end;
end;
function AlignDropDownWindowRect(MasterAbsRect: TRect; DropDownWin: TWinControl; Align: TDropDownAlign): TPoint;
var
P: TPoint;
Y: Integer;
WorkArea: TRect;
MonInfo: TMonitorInfo;
begin
P := MasterAbsRect.TopLeft;
Y := P.Y + (MasterAbsRect.Bottom - MasterAbsRect.Top);
MonInfo.cbSize := SizeOf(MonInfo);
GetMonitorInfo(MonitorFromRect(@MasterAbsRect, MONITOR_DEFAULTTONEAREST), @MonInfo);
WorkArea := MonInfo.rcWork;
// SystemParametersInfo(SPI_GETWORKAREA, 0, Pointer(@WorkArea), 0);
if ((Y + DropDownWin.Height > WorkArea.Bottom) and (P.Y - DropDownWin.Height >= WorkArea.Top)) or
((P.Y - DropDownWin.Height < WorkArea.Top) and (WorkArea.Bottom - Y < P.Y - WorkArea.Top))
then
begin
if P.Y - DropDownWin.Height < WorkArea.Top then
DropDownWin.Height := P.Y - WorkArea.Top;
Y := P.Y - DropDownWin.Height;
DropDownWin.Perform(cm_SetSizeGripChangePosition, Ord(sgcpToTop), 0);
end else
begin
if Y + DropDownWin.Height > WorkArea.Bottom then
DropDownWin.Height := WorkArea.Bottom - Y;
DropDownWin.Perform(cm_SetSizeGripChangePosition, Ord(sgcpToBottom), 0);
end;
case Align of
daRight: Dec(P.X, DropDownWin.Width - (MasterAbsRect.Right - MasterAbsRect.Left));
daCenter: Dec(P.X, (DropDownWin.Width - (MasterAbsRect.Right - MasterAbsRect.Left)) div 2);
end;
if (DropDownWin.Width > WorkArea.Right - WorkArea.Left) then
DropDownWin.Width := WorkArea.Right - WorkArea.Left;
if (P.X + DropDownWin.Width > WorkArea.Right) then
begin
P.X := WorkArea.Right - DropDownWin.Width;
DropDownWin.Perform(cm_SetSizeGripChangePosition, Ord(sgcpToLeft), 0);
end
else if P.X < WorkArea.Left then
begin
P.X := WorkArea.Left;
DropDownWin.Perform(cm_SetSizeGripChangePosition, Ord(sgcpToRight), 0);
end else if Align = daRight then
DropDownWin.Perform(cm_SetSizeGripChangePosition, Ord(sgcpToLeft), 0)
else
DropDownWin.Perform(cm_SetSizeGripChangePosition, Ord(sgcpToRight), 0);
Result := Point(P.X, Y);
end;
function AlignDropDownWindow(MasterWin, DropDownWin: TWinControl; Align: TDropDownAlign): TPoint;
var
MasterAbsRect: TRect;
begin
MasterAbsRect.TopLeft := MasterWin.Parent.ClientToScreen(Point(MasterWin.Left, MasterWin.Top));
MasterAbsRect.Bottom := MasterAbsRect.Top + MasterWin.Height;
MasterAbsRect.Right := MasterAbsRect.Left + MasterWin.Width;
Result := AlignDropDownWindowRect(MasterAbsRect, DropDownWin, Align);
end;
{ TButtonsBitmapCache }
function TButtonsBitmapCache.GetButtonBitmap(ButtonBitmapInfo: TButtonBitmapInfoEh): TBitmap;
var i: Integer;
BitmapInfoBitmap: PButtonBitmapInfoBitmapEh;
begin
if ButtonBitmapInfo.Size.X < 0 then ButtonBitmapInfo.Size.X := 0;
if ButtonBitmapInfo.Size.Y < 0 then ButtonBitmapInfo.Size.Y := 0;
for i := 0 to Count - 1 do
if CompareMem(@ButtonBitmapInfo, Items[i], SizeOf(TButtonBitmapInfoEh)) then
begin
Result := Items[i].Bitmap;
Exit;
end;
New(BitmapInfoBitmap);
Add(BitmapInfoBitmap);
BitmapInfoBitmap.BitmapInfo := ButtonBitmapInfo;
BitmapInfoBitmap.Bitmap := TBitmap.Create;
BitmapInfoBitmap.Bitmap.Width := ButtonBitmapInfo.Size.X;
BitmapInfoBitmap.Bitmap.Height := ButtonBitmapInfo.Size.Y;
case ButtonBitmapInfo.BitmapType of
bcsCheckboxEh:
DrawCheck(BitmapInfoBitmap.Bitmap.Canvas.Handle,
Rect(0, 0, ButtonBitmapInfo.Size.X, ButtonBitmapInfo.Size.Y),
ButtonBitmapInfo.CheckState,
ButtonBitmapInfo.Enabled,
ButtonBitmapInfo.Flat,
ButtonBitmapInfo.Pressed,
ButtonBitmapInfo.Active
);
bcsEllipsisEh, bcsUpDownEh, bcsDropDownEh, bcsPlusEh, bcsMinusEh:
DrawOneButton(BitmapInfoBitmap.Bitmap.Canvas.Handle, ButtonBitmapInfo.BitmapType,
Rect(0, 0, ButtonBitmapInfo.Size.X, ButtonBitmapInfo.Size.Y),
ButtonBitmapInfo.Enabled, ButtonBitmapInfo.Flat,
ButtonBitmapInfo.Active, ButtonBitmapInfo.Pressed,
ButtonBitmapInfo.DownDirect);
end;
Result := BitmapInfoBitmap.Bitmap;
end;
function TButtonsBitmapCache.Get(Index: Integer): PButtonBitmapInfoBitmapEh;
begin
Result := inherited Items[Index];
end;
{procedure TButtonsBitmapCache.Put(Index: Integer; const Value: PButtonBitmapInfoBitmapEh);
begin
inherited Items[Index] := Value;
end;}
procedure TButtonsBitmapCache.Clear;
var i: Integer;
begin
for i := 0 to Count - 1 do
begin
Items[i].Bitmap.Free;
Dispose(Items[i]);
end;
inherited Clear;
end;
{ TEditButtonControlEh }
procedure TEditButtonControlEh.EditButtonDown(TopButton: Boolean; var AutoRepeat: Boolean);
var Handled: Boolean;
begin
if Assigned(FOnDown) then
FOnDown(Self, TopButton, AutoRepeat, Handled);
end;
procedure TEditButtonControlEh.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var AutoRepeat: Boolean;
// OldState: TButtonState;
begin
if Style = ebsUpDownEh
then AutoRepeat := True
else AutoRepeat := False;
// OldState := FState;
inherited MouseDown(Button, Shift, X, Y);
if (Button = mbLeft) then
begin
UpdateDownButtonNum(X, Y);
if FButtonNum > 0 then
begin
EditButtonDown(FButtonNum = 1, AutoRepeat);
if AutoRepeat then ResetTimer(InitRepeatPause);
end;
end;
end;
procedure TEditButtonControlEh.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
inherited MouseMove(Shift, X, Y);
if MouseCapture and (FStyle = ebsUpDownEh) and (FState = bsDown) then
begin
if ((FButtonNum = 2) and (Y < (Height div 2))) or
((FButtonNum = 1) and (Y > (Height - Height div 2))) then
begin
FState := bsUp;
Invalidate;
end;
end;
end;
procedure TEditButtonControlEh.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (FStyle = ebsUpDownEh) and (FState <> bsDown) then
FNoDoClick := True;
try
inherited MouseUp(Button, Shift, X, Y);
finally
FNoDoClick := False;
end;
UpdateDownButtonNum(X, Y);
if (FTimer <> nil) and FTimer.Enabled then
FTimer.Enabled := False;
end;
procedure TEditButtonControlEh.UpdateDownButtonNum(X, Y: Integer);
var OldButtonNum: Integer;
begin
OldButtonNum := FButtonNum;
if FState in [bsDown, bsExclusive] then
if FStyle = ebsUpDownEh then
begin
if Y < (Height div 2) then
FButtonNum := 1
else if Y > (Height - Height div 2) then
FButtonNum := 2
else
FButtonNum := 0;
end
else FButtonNum := 1
else
FButtonNum := 0;
if FButtonNum <> OldButtonNum then
Invalidate;
end;
procedure TEditButtonControlEh.Paint;
const
StyleFlags: array[TEditButtonStyleEh] of TDrawButtonControlStyleEh =
(bcsDropDownEh, bcsEllipsisEh, bcsUpDownEh, bcsUpDownEh, bcsPlusEh, bcsMinusEh);
DownStyles: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
var Rgn, SaveRgn: HRgn;
r: Integer;
BRect: TRect;
IsClipRgn: Boolean;
AButtonNum: Integer;
begin
AButtonNum := FButtonNum;
{$IFDEF EH_LIB_7}
IsClipRgn := False;
SaveRgn := 0;
r := 0;
{$ENDIF}
if not (FState in [bsDown, bsExclusive]) then
AButtonNum := 0;
//else if AButtonNum = 0 then
// AButtonNum := 1;
if not (Style = ebsGlyphEh) then
PaintButtonControlEh(Canvas.Handle, Rect(0, 0, Width, Height),
TWinControlCracker(Parent).Color, StyleFlags[Style], AButtonNum,
Flat, FActive, Enabled, cbUnchecked)
else
begin
{$IFDEF EH_LIB_7}
if not ThemeServices.ThemesEnabled then
{$ENDIF}
begin
IsClipRgn := Flat {and not FActive};
BRect := BoundsRect;
r := 0;
SaveRgn := 0;
if IsClipRgn then
begin
SaveRgn := CreateRectRgn(0, 0, 0, 0);
r := GetClipRgn(Canvas.Handle, SaveRgn);
with BRect do
Rgn := CreateRectRgn(Left + 1, Top + 1, Right - 1, Bottom - 1);
SelectClipRgn(Canvas.Handle, Rgn);
DeleteObject(Rgn);
end;
end;
inherited Paint;
{$IFDEF EH_LIB_7}
if not ThemeServices.ThemesEnabled then
{$ENDIF}
begin
if IsClipRgn then
begin
if r = 0 then
SelectClipRgn(Canvas.Handle, 0)
else
SelectClipRgn(Canvas.Handle, SaveRgn);
DeleteObject(SaveRgn);
OffsetRect(BRect, -Left, -Top);
if FActive then
DrawEdge(Canvas.Handle, BRect, DownStyles[FState in [bsDown, bsExclusive]], BF_RECT)
else
begin
Canvas.Brush.Color := TWinControlCracker(Parent).Color;
Canvas.FrameRect(BRect);
end;
end;
end;
end;
end;
procedure TEditButtonControlEh.SetState(NewState: TButtonState; IsActive: Boolean; ButtonNum: Integer);
begin
if (FState <> NewState) or (IsActive <> FActive) or (ButtonNum <> FButtonNum) then
begin
FActive := IsActive;
FState := NewState;
FButtonNum := ButtonNum;
//Invalidate;
Repaint;
end;
end;
procedure TEditButtonControlEh.SetStyle(const Value: TEditButtonStyleEh);
begin
if FStyle <> Value then
begin
FStyle := Value;
Invalidate;
end;
end;
procedure TEditButtonControlEh.SetWidthNoNotify(AWidth: Integer);
begin
inherited Width := AWidth;
end;
procedure TEditButtonControlEh.SetActive(const Value: Boolean);
begin
if Active <> Value then
begin
FActive := Value;
Invalidate;
end;
end;
procedure TEditButtonControlEh.Click;
begin
if not FNoDoClick then
begin
inherited Click;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -