📄 cxcontrols.pas
字号:
if Assigned(MonitorFromPoint) then
begin
AMonitor := MonitorFromPoint(P, MONITOR_DEFAULTTONEAREST);
end;
end;
Result := GetMonitorWorkArea(AMonitor);
end;
function GetMonitorWorkArea(const AMonitor: Integer): TRect;
var
Info: TMonitorInfo;
GetMonitorInfo: function(hMonitor: HMONITOR;
lpMonitorInfo: PMonitorInfo): Boolean; stdcall;
begin
if FUser32DLL > 32 then
GetMonitorInfo := GetProcAddress(FUser32DLL,{$IFDEF DELPHI12} 'GetMonitorInfoW' {$ELSE} 'GetMonitorInfoA' {$ENDIF})
else
GetMonitorInfo := nil;
if (AMonitor = 0) or not Assigned(GetMonitorInfo) then
SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0)
else
begin
Info.cbSize := SizeOf(Info);
GetMonitorInfo(AMonitor, @Info);
Result := Info.rcWork;
end;
end;
function GetMouseCursorPos: TPoint;
begin
if not Windows.GetCursorPos(Result) then
Result := cxInvalidPoint;
end;
function GetPointPosition(const ARect: TRect; const P: TPoint;
AHorzSeparation, AVertSeparation: Boolean): TcxPosition;
const
Positions: array[Boolean, Boolean] of TcxPosition =
((posBottom, posRight), (posLeft, posTop));
type
TCorner = (BottomLeft, TopLeft, TopRight, BottomRight);
function GetCornerCoords(ACorner: TCorner): TPoint;
begin
case ACorner of
BottomLeft:
Result := Point(ARect.Left, ARect.Bottom);
TopLeft:
Result := ARect.TopLeft;
TopRight:
Result := Point(ARect.Right, ARect.Top);
BottomRight:
Result := ARect.BottomRight;
end;
end;
function GetSign(const P1, P2, P: TPoint): Integer;
begin
Result := (P.X - P1.X) * (P2.Y - P1.Y) - (P.Y - P1.Y) * (P2.X - P1.X);
end;
var
ASign1, ASign2: Integer;
begin
if AHorzSeparation and AVertSeparation then
begin
ASign1 := GetSign(GetCornerCoords(BottomLeft), GetCornerCoords(TopRight), P);
ASign2 := GetSign(GetCornerCoords(TopLeft), GetCornerCoords(BottomRight), P);
Result := Positions[ASign1 >= 0, ASign2 >= 0];
end
else
if AHorzSeparation then
if P.X < GetRangeCenter(ARect.Left, ARect.Right) then
Result := posLeft
else
Result := posRight
else
if AVertSeparation then
if P.Y < GetRangeCenter(ARect.Top, ARect.Bottom) then
Result := posTop
else
Result := posBottom
else
Result := posNone;
end;
function IsChildClassWindow(AWnd: HWND): Boolean;
begin
Result := GetWindowLong(AWnd, GWL_STYLE) and WS_CHILD = WS_CHILD;
end;
function IsChildEx(AParentWnd, AWnd: HWND): Boolean;
begin
Result := (AParentWnd <> 0) and ((AParentWnd = AWnd) or IsChild(AParentWnd, AWnd));
end;
function FormStyle(AForm: TCustomForm): TFormStyle;
begin
Result := TCustomFormAccess(AForm).FormStyle;
end;
function IsMDIChild(AForm: TCustomForm): Boolean;
begin
Result := (AForm <> nil) and not (csDesigning in AForm.ComponentState) and
(FormStyle(AForm) = fsMDIChild);
end;
function IsMDIForm(AForm: TCustomForm): Boolean;
begin
Result := (AForm <> nil) and not (csDesigning in AForm.ComponentState) and
(FormStyle(AForm) = fsMDIForm);
end;
function IsCtrlPressed: Boolean;
begin
Result := GetAsyncKeyState(VK_CONTROL) < 0;
end;
function IsEditStartChar(C: Char): Boolean;
begin
Result := IsTextChar(C) or (C = #8) or (C = ^V) or (C = ^X);
end;
function IsIncSearchStartChar(C: Char): Boolean;
begin
Result := IsTextChar(C) or (C = #8);
end;
function IsOwner(AOwnerWnd, AWnd: HWND): Boolean;
begin
if AOwnerWnd <> 0 then
repeat
AWnd := GetParent(AWnd);
Result := AWnd = AOwnerWnd;
until Result or (AWnd = 0)
else
Result := False;
end;
function IsOwnerEx(AOwnerWnd, AWnd: HWND): Boolean;
begin
Result := (AOwnerWnd <> 0) and ((AOwnerWnd = AWnd) or IsOwner(AOwnerWnd, AWnd));
end;
function IsWindowEnabledEx(AWindowHandle: HWND): Boolean;
begin
Result := IsWindowEnabled(AWindowHandle);
if IsChildClassWindow(AWindowHandle) then
Result := Result and IsWindowEnabledEx(GetParent(AWindowHandle))
end;
function IsPointInDragDetectArea(const AMouseDownPos: TPoint; X, Y: Integer): Boolean;
begin
Result :=
(Abs(X - AMouseDownPos.X) < Mouse.DragThreshold) and
(Abs(Y - AMouseDownPos.Y) < Mouse.DragThreshold);
end;
function IsNumericChar(C: Char; AType: TcxNumberType): Boolean;
begin
{$IFDEF DELPHI12}
Result := (C = '-') or (C = '+') or
(dxGetWideCharCType1(C) and C1_DIGIT > 0);
{$ELSE}
Result := C in ['-', '+', '0'..'9'];
{$ENDIF}
if AType in [ntFloat, ntExponent] then
begin
Result := Result or (C = DecimalSeparator);
if AType = ntExponent then
Result := Result or (C = 'e') or (C = 'E');
end;
end;
function IsTextChar(C: Char): Boolean;
begin
{$IFDEF DELPHI12}
Result := not (dxGetWideCharCType1(C) and C1_CNTRL > 0);
{$ELSE}
Result := C in [#32..#255];
{$ENDIF}
end;
procedure MakeVisibleOnDesktop(var ABounds: TRect; const ADesktopPoint: TPoint);
var
ADesktopBounds: TRect;
begin
ADesktopBounds := GetDesktopWorkArea(ADesktopPoint);
if ABounds.Right > ADesktopBounds.Right then
Offsetrect(ABounds, ADesktopBounds.Right - ABounds.Right, 0);
if ABounds.Bottom > ADesktopBounds.Bottom then
OffsetRect(ABounds, 0, ADesktopBounds.Bottom - ABounds.Bottom);
if ABounds.Left < ADesktopBounds.Left then
OffsetRect(ABounds, ADesktopBounds.Left - ABounds.Left, 0);
if ABounds.Top < ADesktopBounds.Top then
OffsetRect(ABounds, 0, ADesktopBounds.Top - ABounds.Top);
end;
procedure MakeVisibleOnDesktop(AControl: TControl);
var
ABounds: TRect;
begin
ABounds := AControl.BoundsRect;
MakeVisibleOnDesktop(ABounds, ABounds.TopLeft);
AControl.BoundsRect := ABounds;
end;
procedure MapWindowPoint(AHandleFrom, AHandleTo: TcxHandle; var P: TPoint);
begin {10}
MapWindowPoints(AHandleFrom, AHandleTo, P, 1);
end;
procedure MapWindowRect(AHandleFrom, AHandleTo: TcxHandle; var R: TRect);
var
p: TPoint;
begin
p := R.TopLeft;
MapWindowPoint(AHandleFrom, AHandleTo, p);
R.TopLeft := p;
p := R.BottomRight;
MapWindowPoint(AHandleFrom, AHandleTo, p);
R.BottomRight := p;
end;
procedure RecreateControlWnd(AControl: TWinControl);
begin
if AControl.HandleAllocated then
AControl.Perform(CM_RECREATEWND, 0, 0);
end;
function cxGetClientRect(AHandle: THandle): TRect;
begin
if not GetClientRect(AHandle, Result) then
Result := cxEmptyRect;
end;
function cxGetClientRect(AControl: TWinControl): TRect;
begin
if not AControl.HandleAllocated or not GetClientRect(AControl.Handle, Result) then
Result := cxEmptyRect;
end;
function cxGetWindowRect(AHandle: THandle): TRect;
begin
if not GetWindowRect(AHandle, Result) then
Result := cxEmptyRect;
end;
function cxGetWindowRect(AControl: TWinControl): TRect;
begin
if not AControl.HandleAllocated or not GetWindowRect(AControl.Handle, Result) then
Result := cxEmptyRect;
end;
function RemoveAccelChars(const S: AnsiString;
AAppendTerminatingUnderscore: Boolean = True): AnsiString;
var
ALastIndex, I: Integer;
begin
Result := '';
I := 1;
ALastIndex := Length(S);
while I <= ALastIndex do
begin
if S[I] = '&' then
if (I < ALastIndex) or not AAppendTerminatingUnderscore then
Inc(I)
else
begin
Result := Result + '_';
Break;
end;
Result := Result + S[I];
Inc(I);
end;
end;
function RemoveAccelChars(const S: WideString;
AAppendTerminatingUnderscore: Boolean = True): WideString;
var
ALastIndex, I: Integer;
begin
Result := '';
I := 1;
ALastIndex := Length(S);
while I <= ALastIndex do
begin
if S[I] = '&' then
if (I < ALastIndex) or not AAppendTerminatingUnderscore then
Inc(I)
else
begin
Result := Result + '_';
Break;
end;
Result := Result + S[I];
Inc(I);
end;
end;
procedure SetDesignerModified(AComponent: TComponent);
var
ADesigner: IDesignerNotify;
//AParentForm: TCustomForm;
begin
if (AComponent is TcxControl) and not TcxControl(AComponent).IsDesigning or
not (AComponent is TcxControl) and not (csDesigning in AComponent.ComponentState) then
Exit;
ADesigner := nil;
{if AComponent is TControl then
begin
AParentForm := GetParentForm(TControl(AComponent));
if AParentForm <> nil then
ADesigner := AParentForm.Designer;
end
else}
ADesigner := FindRootDesigner(AComponent);
if ADesigner <> nil then
ADesigner.Modified;
end;
function cxGetFullComponentName(AComponent: TComponent): string;
begin
if AComponent = nil then
Result := ''
else
if AComponent.Owner = nil then
Result := AComponent.Name
else
Result := cxGetFullComponentName(AComponent.Owner) + '.' + AComponent.Name;
end;
function ShiftStateToKeys(AShift: TShiftState): WORD;
begin
Result := 0;
if ssShift in AShift then Inc(Result, MK_SHIFT);
if ssCtrl in AShift then Inc(Result, MK_CONTROL);
if ssLeft in AShift then Inc(Result, MK_LBUTTON);
if ssRight in AShift then Inc(Result, MK_RBUTTON);
if ssMiddle in AShift then Inc(Result, MK_MBUTTON);
end;
function TranslateKey(Key: Word): Word;
begin
Result := Key;
end;
{$IFDEF USETCXSCROLLBAR}
{ TcxSettingsController }
type
TcxSettingsController = class
private
FList: TList;
protected
FWindow: HWND;
procedure MainWndProc(var Message: TMessage);
procedure WndProc(var Message: TMessage); virtual;
public
constructor Create;
destructor Destroy; override;
procedure AddListener(AListener: TcxControl);
procedure NotifyListeners;
procedure RemoveListener(AListener: TcxControl);
end;
constructor TcxSettingsController.Create;
begin
inherited Create;
FList := TList.Create;
end;
destructor TcxSettingsController.Destroy;
begin
FList.Free;
inherited Destroy;
end;
procedure TcxSettingsController.AddListener(AListener: TcxControl);
begin
with FList do
if IndexOf(AListener) = -1 then
begin
if Count = 0 then
FWindow := AllocateHWnd(MainWndProc);
Add(AListener);
end;
end;
procedure TcxSettingsController.RemoveListener(AListener: TcxControl);
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -