📄 cxcontrols.pas
字号:
public
constructor Create(AFrameWidth: Integer = 2); reintroduce; virtual;
destructor Destroy; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
procedure DrawSizeFrame(const ARect: TRect); overload;
procedure DrawSizeFrame(const ARect: TRect; const ARegion: TcxRegion); overload;
property FillSelection: Boolean read FFillSelection write FFillSelection;
end;
{ TcxDragAndDropArrow }
TcxArrowPlace = (apLeft, apTop, apRight, apBottom);
TcxDragAndDropArrowClass = class of TcxDragAndDropArrow;
TcxDragAndDropArrow = class(TcxDragImage)
private
FTransparent: Boolean;
function GetTransparent: Boolean;
protected
function GetImageBackColor: TColor; virtual;
property ImageBackColor: TColor read GetImageBackColor;
public
constructor Create(ATransparent: Boolean); reintroduce; virtual;
procedure Init(AOwner: TControl; const AAreaBounds, AClientRect: TRect;
APlace: TcxArrowPlace);
property Transparent: Boolean read GetTransparent;
end;
{ TcxTimer }
TcxTimer = class (TComponent)
private
FEnabled: Boolean;
FEventID: Cardinal;
FInterval: Cardinal;
FTimerOn: Boolean;
FOnTimer: TNotifyEvent;
function CanSetTimer: Boolean;
procedure KillTimer;
procedure SetEnabled(Value: Boolean);
procedure SetInterval(Value: Cardinal);
procedure SetOnTimer(Value: TNotifyEvent);
procedure SetTimer;
procedure SetTimerOn(Value: Boolean);
procedure UpdateTimer;
property TimerOn: Boolean read FTimerOn write SetTimerOn;
protected
procedure TimeOut; dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Enabled: Boolean read FEnabled write SetEnabled default True;
property Interval: Cardinal read FInterval write SetInterval default 1000;
property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer;
end;
{ TcxDesignController }
TcxDesignState = (dsDesignerModifying);
TcxDesignStates = set of TcxDesignState;
TcxDesignController = class
private
FLockDesignerModifiedCount: Integer;
protected
FState: TcxDesignStates;
public
procedure DesignerModified(AForm: TCustomForm); overload;
function IsDesignerModifiedLocked: Boolean;
procedure LockDesignerModified;
procedure UnLockDesignerModified;
end;
// WINDOW HANDLE
function CanAllocateHandle(AControl: TWinControl): Boolean;
procedure MapWindowPoint(AHandleFrom, AHandleTo: TcxHandle; var P: TPoint);
procedure MapWindowRect(AHandleFrom, AHandleTo: TcxHandle; var R: TRect);
procedure RecreateControlWnd(AControl: TWinControl);
function cxGetClientRect(AHandle: THandle): TRect; overload;
function cxGetClientRect(AControl: TWinControl): TRect; overload;
function cxGetWindowRect(AHandle: THandle): TRect; overload;
function cxGetWindowRect(AControl: TWinControl): TRect; overload;
// MOUSE
function GetMouseKeys: WPARAM;
function GetDblClickInterval: Integer;
function GetMouseCursorPos: TPoint;
function GetPointPosition(const ARect: TRect; const P: TPoint;
AHorzSeparation, AVertSeparation: Boolean): TcxPosition;
// MONITOR
function GetDesktopWorkArea(const P: TPoint): TRect;
function GetMonitorWorkArea(const AMonitor: Integer): TRect;
procedure MakeVisibleOnDesktop(var ABounds: TRect; const ADesktopPoint: TPoint); overload;
procedure MakeVisibleOnDesktop(AControl: TControl); overload;
// PARENT STRAIN
function IsChildClassWindow(AWnd: HWND): Boolean;
function IsChildEx(AParentWnd, AWnd: HWND): Boolean;
function IsMDIChild(AForm: TCustomForm): Boolean;
function IsMDIForm(AForm: TCustomForm): Boolean;
function IsOwner(AOwnerWnd, AWnd: HWND): Boolean;
function IsOwnerEx(AOwnerWnd, AWnd: HWND): Boolean;
function IsWindowEnabledEx(AWindowHandle: HWND): Boolean;
// CHARS
function GetCharFromKeyCode(ACode: Word): Char;
function IsCtrlPressed: Boolean;
function IsEditStartChar(C: Char): Boolean;
function IsIncSearchStartChar(C: Char): Boolean;
function IsNumericChar(C: Char; AType: TcxNumberType): Boolean;
function IsTextChar(C: Char): Boolean;
function RemoveAccelChars(const S: AnsiString; AAppendTerminatingUnderscore: Boolean = True): AnsiString; overload;
function RemoveAccelChars(const S: WideString; AAppendTerminatingUnderscore: Boolean = True): WideString; overload;
function ShiftStateToKeys(AShift: TShiftState): WORD;
function TranslateKey(Key: Word): Word;
// MOUSE TRACKING
procedure BeginMouseTracking(AControl: TWinControl; const ABounds: TRect;
ACaller: IcxMouseTrackingCaller);
procedure EndMouseTracking(ACaller: IcxMouseTrackingCaller);
function IsMouseTracking(ACaller: IcxMouseTrackingCaller): Boolean;
// HOURGLASS
procedure HideHourglassCursor;
procedure ShowHourglassCursor;
// POPUPMENU
function GetPopupMenuHeight(APopupMenu: TPopupMenu): Integer;
function IsPopupMenuShortCut(APopupMenu: TComponent;
var Message: TWMKey): Boolean;
function ShowPopupMenu(ACaller, AComponent: TComponent; X, Y: Integer): Boolean;
function ShowPopupMenuFromCursorPos(ACaller, AComponent: TComponent): Boolean;
// DRAG&DROP
function cxExtractDragObjectSource(ADragObject: TObject): TObject;
function DragDetect(Wnd: HWND): TcxDragDetect;
function GetDragObject: TDragObject;
function IsPointInDragDetectArea(const AMouseDownPos: TPoint; X, Y: Integer): Boolean;
// DRAG&DROP ARROW
function GetDragAndDropArrowBounds(const AAreaBounds, AClientRect: TRect; APlace: TcxArrowPlace): TRect;
procedure GetDragAndDropArrowPoints(const ABounds: TRect; APlace: TcxArrowPlace;
out P: TPointArray; AForRegion: Boolean);
procedure DrawDragAndDropArrow(ACanvas: TcxCanvas; const ABounds: TRect; APlace: TcxArrowPlace);
// WINDOWS
function cxMessageWindow: TcxMessageWindow;
function cxMessageDlg(const AMessage, ACaption: string; ADlgType: TMsgDlgType;
AButtons: TMsgDlgButtons; AHelpCtx: Longint): Integer;
procedure DialogApplyFont(ADialog: TCustomForm; AFont: TFont);
// DESIGNER
function DesignController: TcxDesignController;
procedure SetDesignerModified(AComponent: TComponent);
function cxGetFullComponentName(AComponent: TComponent): string;
function GET_APPCOMMAND_LPARAM(lParam: LPARAM): Integer;
{$EXTERNALSYM GET_APPCOMMAND_LPARAM}
{$IFNDEF DELPHI6}
function CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean;
{$ENDIF}
type
TcxGetParentFormForDockingFunc = function (AControl: TControl): TCustomForm;
TcxGetParentWndForDockingFunc = function (AWnd: HWND): HWND;
var
cxDragAndDropWindowTransparency: Byte = 180;
cxGetParentFormForDocking: TcxGetParentFormForDockingFunc = nil;
cxGetParentWndForDocking: TcxGetParentWndForDockingFunc = nil;
dxISpellChecker: IdxSpellChecker;
dxWMGetSkinnedMessage: WORD;
dxWMSetSkinnedMessage: WORD;
implementation
{$R cxControls.res}
uses
dxUxTheme,
dxThemeConsts,
SysUtils, Math, cxGeometry, cxLibraryConsts;
const
crFullScroll = crBase + 1;
crHorScroll = crBase + 2;
crVerScroll = crBase + 3;
crUpScroll = crBase + 4;
crRightScroll = crBase + 5;
crDownScroll = crBase + 6;
crLeftScroll = crBase + 7;
ScreenHandle = 0;
dxWMGetSkinnedMessageID = '{B2CE3777-44D8-4998-9701-47BBBC10B656}';
dxWMSetSkinnedMessageID = '{B2CE3777-44D8-1321-4656-12C54AA613BB}';
type
TControlAccess = class(TControl);
TCustomFormAccess = class(TCustomForm);
TMenuItemAccess = class(TMenuItem);
TcxTimerWindow = class(TcxMessageWindow)
protected
procedure WndProc(var Message: TMessage); override;
end;
var
FUnitIsFinalized: Boolean;
FDragObject: TDragObject;
FUser32DLL: HMODULE;
FcxMessageWindow: TcxMessageWindow;
FcxTimerWindow: TcxTimerWindow;
FActiveTimerList: TList;
FDesignController: TcxDesignController;
FSystemController: TcxSystemController;
{$IFNDEF DELPHI7}
type
TSetLayeredWindowAttributes = function(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;
var
SetLayeredWindowAttributes: TSetLayeredWindowAttributes = nil;
procedure InitSetLayeredWindowAttributes;
var
AModule: HMODULE;
begin
AModule := GetModuleHandle('User32.dll');
if AModule <> 0 then
@SetLayeredWindowAttributes := GetProcAddress(AModule, 'SetLayeredWindowAttributes');
end;
{$ENDIF}
function CanAllocateHandle(AControl: TWinControl): Boolean;
begin
Result := AControl.HandleAllocated or
not (csDestroying in AControl.ComponentState) and
((AControl.ParentWindow <> 0) or
(AControl.Parent <> nil) and CanAllocateHandle(AControl.Parent) or
((AControl is TCustomForm) or (AControl is TCustomFrame)) and (Application <> nil) and (Application.Handle <> 0));
end;
function cxMessageWindow: TcxMessageWindow;
begin
if (FcxMessageWindow = nil) and not FUnitIsFinalized then
FcxMessageWindow := TcxMessageWindow.Create;
Result := FcxMessageWindow;
end;
function cxMessageDlg(const AMessage, ACaption: string; ADlgType: TMsgDlgType;
AButtons: TMsgDlgButtons; AHelpCtx: Longint): Integer;
begin
with CreateMessageDialog(AMessage, ADlgType, AButtons) do
try
if ACaption <> '' then
Caption := ACaption;
HelpContext := AHelpCtx;
Position := poScreenCenter;
Result := ShowModal;
finally
Free;
end;
end;
function DragDetect(Wnd: HWND): TcxDragDetect;
var
NoDragZone: TRect;
P: TPoint;
Msg: TMsg;
begin
Result := ddCancel;
P := GetMouseCursorPos;
NoDragZone.Right := 2 * Mouse.DragThreshold;//GetSystemMetrics(SM_CXDRAG);
NoDragZone.Bottom := 2 * Mouse.DragThreshold;//GetSystemMetrics(SM_CYDRAG);
NoDragZone.Left := P.X - NoDragZone.Right div 2;
NoDragZone.Top := P.Y - NoDragZone.Bottom div 2;
Inc(NoDragZone.Right, NoDragZone.Left);
Inc(NoDragZone.Bottom, NoDragZone.Top);
SetCapture(Wnd);
try
while GetCapture = Wnd do
begin
case Integer(GetMessage(Msg, 0, 0, 0)) of
-1: Break;
0: begin
PostQuitMessage(Msg.wParam);
Break;
end;
end;
try
case Msg.message of
WM_KEYDOWN, WM_KEYUP:
if Msg.wParam = VK_ESCAPE then Break;
WM_MOUSEMOVE:
if Msg.hwnd = Wnd then
begin
P := Point(LoWord(Msg.lParam), HiWord(Msg.lParam));
ClientToScreen(Msg.hwnd, P);
if not PtInRect(NoDragZone, P) then
begin
Result := ddDrag;
Break;
end;
end;
WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP:
begin
Result := ddNone;
Break;
end;
end;
finally
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
finally
if GetCapture = Wnd then ReleaseCapture;
end;
end;
function GetCharFromKeyCode(ACode: Word): Char;
const
MAPVK_VK_TO_VSC = 0;
var
AScanCode: UINT;
AKeyState: TKeyboardState;
ABufChar: Word;
begin
ABufChar := 0;
AScanCode := MapVirtualKey(ACode, MAPVK_VK_TO_VSC);
GetKeyboardState(AKeyState);
{$IFDEF DELPHI12}
if ToUnicode(ACode, AScanCode, AKeyState, ABufChar, 1, 0) = 1 then
Result := Char(ABufChar)
else
Result := #0;
{$ELSE}
if ToAscii(ACode, AScanCode, AKeyState, @ABufChar, 0) = 1 then
Result := PChar(@ABufChar)^
else
Result := #0;
{$ENDIF}
end;
function GetMouseKeys: WPARAM;
begin
Result := 0;
if GetAsyncKeyState(VK_LBUTTON) < 0 then Inc(Result, MK_LBUTTON);
if GetAsyncKeyState(VK_MBUTTON) < 0 then Inc(Result, MK_MBUTTON);
if GetAsyncKeyState(VK_RBUTTON) < 0 then Inc(Result, MK_RBUTTON);
if GetAsyncKeyState(VK_CONTROL) < 0 then Inc(Result, MK_CONTROL);
if GetAsyncKeyState(VK_SHIFT) < 0 then Inc(Result, MK_SHIFT);
end;
function GetDblClickInterval: Integer;
begin
Result := GetDoubleClickTime;
end;
type
HMONITOR = type Integer;
PMonitorInfo = ^TMonitorInfo;
TMonitorInfo = packed record
cbSize: DWORD;
rcMonitor: TRect;
rcWork: TRect;
dwFalgs: DWORD;
end;
function GetDesktopWorkArea(const P: TPoint): TRect;
const
MONITOR_DEFAULTTONEAREST = $2;
var
AMonitor: Integer;
MonitorFromPoint: function(ptScreenCoords: TPoint; dwFlags: DWORD): HMONITOR; stdcall;
begin
AMonitor := 0;
if FUser32DLL > 32 then
begin
MonitorFromPoint := GetProcAddress(FUser32DLL, 'MonitorFromPoint');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -