📄 forms.pas
字号:
FOnRestore: TNotifyEvent;
FOnShortCut: TShortCutEvent;
FOnShowHint: TShowHintEvent;
FOnSettingChange: TSettingChangeEvent;
function CheckIniChange(var Message: TMessage): Boolean;
function DispatchAction(Msg: Longint; Action: TBasicAction): Boolean;
procedure DoActionIdle;
function DoMouseIdle: TControl;
procedure DoNormalizeTopMosts(IncludeMain: Boolean);
function GetCurrentHelpFile: string;
function GetDialogHandle: HWND;
function GetExeName: string;
function GetIconHandle: HICON;
function GetTitle: string;
procedure HintTimerExpired;
procedure IconChanged(Sender: TObject);
function InvokeHelp(Command: Word; Data: Longint): Boolean;
procedure NotifyForms(Msg: Word);
function ProcessMessage(var Msg: TMsg): Boolean;
procedure SetBiDiMode(Value: TBiDiMode);
procedure SetDialogHandle(Value: HWnd);
procedure SetHandle(Value: HWnd);
procedure SetHint(const Value: string);
procedure SetHintColor(Value: TColor);
procedure SetIcon(Value: TIcon);
procedure SetShowHint(Value: Boolean);
procedure SetTitle(const Value: string);
procedure SettingChange(var Message: TWMSettingChange);
procedure StartHintTimer(Value: Integer; TimerMode: TTimerMode);
procedure StopHintTimer;
procedure WndProc(var Message: TMessage);
procedure UpdateVisible;
function ValidateHelpSystem: Boolean;
procedure WakeMainThread(Sender: TObject);
protected
procedure Idle(const Msg: TMsg);
function IsDlgMsg(var Msg: TMsg): Boolean;
function IsHintMsg(var Msg: TMsg): Boolean;
function IsKeyMsg(var Msg: TMsg): Boolean;
function IsMDIMsg(var Msg: TMsg): Boolean;
function IsShortCut(var Message: TWMKey): Boolean;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ActivateHint(CursorPos: TPoint);
procedure BringToFront;
procedure ControlDestroyed(Control: TControl);
procedure CancelHint;
procedure CreateForm(InstanceClass: TComponentClass; var Reference);
procedure CreateHandle;
function ExecuteAction(Action: TBasicAction): Boolean; reintroduce;
procedure HandleException(Sender: TObject);
procedure HandleMessage;
function HelpCommand(Command: Integer; Data: Longint): Boolean;
function HelpContext(Context: THelpContext): Boolean;
function HelpJump(const JumpID: string): Boolean;
function HelpKeyword(const Keyword: String): Boolean;
procedure HideHint;
procedure HintMouseMessage(Control: TControl; var Message: TMessage);
procedure HookMainWindow(Hook: TWindowHook);
procedure HookSynchronizeWakeup;
procedure Initialize;
function IsRightToLeft: Boolean;
function MessageBox(const Text, Caption: PChar; Flags: Longint = MB_OK): Integer;
procedure Minimize;
procedure ModalStarted;
procedure ModalFinished;
procedure NormalizeAllTopMosts;
procedure NormalizeTopMosts;
procedure ProcessMessages;
procedure Restore;
procedure RestoreTopMosts;
procedure Run;
procedure ShowException(E: Exception);
procedure Terminate;
procedure UnhookMainWindow(Hook: TWindowHook);
procedure UnhookSynchronizeWakeup;
function UpdateAction(Action: TBasicAction): Boolean; reintroduce;
function UseRightToLeftAlignment: Boolean;
function UseRightToLeftReading: Boolean;
function UseRightToLeftScrollBar: Boolean;
property Active: Boolean read FActive;
property AllowTesting: Boolean read FAllowTesting write FAllowTesting;
property AutoDragDocking: Boolean read FAutoDragDocking write FAutoDragDocking default True;
property HelpSystem : IHelpSystem read FHelpSystem;
property CurrentHelpFile: string read GetCurrentHelpFile;
property DialogHandle: HWnd read GetDialogHandle write SetDialogHandle;
property ExeName: string read GetExeName;
property Handle: HWnd read FHandle write SetHandle;
property HelpFile: string read FHelpFile write FHelpFile;
property Hint: string read FHint write SetHint;
property HintColor: TColor read FHintColor write SetHintColor;
property HintHidePause: Integer read FHintHidePause write FHintHidePause;
property HintPause: Integer read FHintPause write FHintPause;
property HintShortCuts: Boolean read FHintShortCuts write FHintShortCuts;
property HintShortPause: Integer read FHintShortPause write FHintShortPause;
property Icon: TIcon read FIcon write SetIcon;
property MainForm: TForm read FMainForm;
property BiDiMode: TBiDiMode read FBiDiMode
write SetBiDiMode default bdLeftToRight;
property BiDiKeyboard: string read FBiDiKeyboard write FBiDiKeyboard;
property NonBiDiKeyboard: string read FNonBiDiKeyboard write FNonBiDiKeyboard;
property ShowHint: Boolean read FShowHint write SetShowHint;
property ShowMainForm: Boolean read FShowMainForm write FShowMainForm;
property Terminated: Boolean read FTerminate;
property Title: string read GetTitle write SetTitle;
property UpdateFormatSettings: Boolean read FUpdateFormatSettings
write FUpdateFormatSettings;
property UpdateMetricSettings: Boolean read FUpdateMetricSettings
write FUpdateMetricSettings;
property OnActionExecute: TActionEvent read FOnActionExecute write FOnActionExecute;
property OnActionUpdate: TActionEvent read FOnActionUpdate write FOnActionUpdate;
property OnActivate: TNotifyEvent read FOnActivate write FOnActivate;
property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate;
property OnException: TExceptionEvent read FOnException write FOnException;
property OnIdle: TIdleEvent read FOnIdle write FOnIdle;
property OnHelp: THelpEvent read FOnHelp write FOnHelp;
property OnHint: TNotifyEvent read FOnHint write FOnHint;
property OnMessage: TMessageEvent read FOnMessage write FOnMessage;
property OnMinimize: TNotifyEvent read FOnMinimize write FOnMinimize;
property OnModalBegin: TNotifyEvent read FOnModalBegin write FOnModalBegin;
property OnModalEnd: TNotifyEvent read FOnModalEnd write FOnModalEnd;
property OnRestore: TNotifyEvent read FOnRestore write FOnRestore;
property OnShowHint: TShowHintEvent read FOnShowHint write FOnShowHint;
property OnShortCut: TShortCutEvent read FOnShortCut write FOnShortCut;
property OnSettingChange: TSettingChangeEvent read FOnSettingChange write FOnSettingChange;
end;
{ Global objects }
var
Application: TApplication;
Screen: TScreen;
Ctl3DBtnWndProc: Pointer = nil; { obsolete }
Ctl3DDlgFramePaint: function(Window: HWnd; Msg, wParam, lParam: Longint): Longint stdcall = nil; { obsolete }
Ctl3DCtlColorEx: function(Window: HWnd; Msg, wParam, lParam: Longint): Longint stdcall = nil; { obsolete }
HintWindowClass: THintWindowClass = THintWindow;
function GetParentForm(Control: TControl): TCustomForm;
function ValidParentForm(Control: TControl): TCustomForm;
function DisableTaskWindows(ActiveWindow: HWnd): Pointer;
procedure EnableTaskWindows(WindowList: Pointer);
function MakeObjectInstance(Method: TWndMethod): Pointer; deprecated; { moved to Classes.pas }
{$EXTERNALSYM MakeObjectInstance}
procedure FreeObjectInstance(ObjectInstance: Pointer); deprecated; { moved to Classes.pas }
{$EXTERNALSYM FreeObjectInstance}
function IsAccel(VK: Word; const Str: string): Boolean;
function Subclass3DWnd(Wnd: HWnd): Boolean; deprecated; { obsolete }
procedure Subclass3DDlg(Wnd: HWnd; Flags: Word); deprecated; { obsolete }
procedure SetAutoSubClass(Enable: Boolean); deprecated; { obsolete }
function AllocateHWnd(Method: TWndMethod): HWND; deprecated; { moved to Classes.pas }
{$EXTERNALSYM AllocateHWnd}
procedure DeallocateHWnd(Wnd: HWND); deprecated; { moved to Classes.pas }
{$EXTERNALSYM DeallocateHWnd}
procedure DoneCtl3D; deprecated; { obsolete }
procedure InitCtl3D; deprecated; { obsolete }
function KeysToShiftState(Keys: Word): TShiftState;
function KeyDataToShiftState(KeyData: Longint): TShiftState;
function KeyboardStateToShiftState(const KeyboardState: TKeyboardState): TShiftState; overload;
function KeyboardStateToShiftState: TShiftState; overload;
function ForegroundTask: Boolean;
type
TFocusState = type Pointer;
function SaveFocusState: TFocusState;
procedure RestoreFocusState(FocusState: TFocusState);
type
TSetLayeredWindowAttributes = function (Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;
var
SetLayeredWindowAttributes: TSetLayeredWindowAttributes = nil;
implementation
uses
ActiveX, Math, Printers, Consts, RTLConsts, CommCtrl, FlatSB,
StdActns{$IFDEF MSWINDOWS}, WinHelpViewer{$ENDIF}, Themes;
var
FocusMessages: Boolean = True;
FocusCount: Integer = 0;
{ RM_TaskbarCreated is a registered window message that the OS sends to
top-level windows of running UI interactive services when a new user logs
onto the local workstation desktop.
VCL listens for this message to send around color, font, and settings
change notifications to controls in the app so that UI interactive
service apps built with VCL will conform to the new user's UI preferences. }
var
RM_TaskbarCreated: DWORD;
// The focus state is just the focus count for now. To save having to allocate
// anything, I just map the Integer to the TFocusState.
function SaveFocusState: TFocusState;
begin
Result := TFocusState(FocusCount);
end;
procedure RestoreFocusState(FocusState: TFocusState);
begin
FocusCount := Integer(FocusState);
end;
const
DefHintColor = clInfoBk; { default hint window color }
DefHintPause = 500; { default pause before hint window displays (ms)}
DefHintShortPause = 0; { default reshow pause to 0, was DefHintPause div 10 }
DefHintHidePause = DefHintPause * 5;
procedure ShowMDIClientEdge(ClientHandle: THandle; ShowEdge: Boolean);
var
Style: Longint;
begin
if ClientHandle <> 0 then
begin
Style := GetWindowLong(ClientHandle, GWL_EXSTYLE);
if ShowEdge then
if Style and WS_EX_CLIENTEDGE = 0 then
Style := Style or WS_EX_CLIENTEDGE
else
Exit
else if Style and WS_EX_CLIENTEDGE <> 0 then
Style := Style and not WS_EX_CLIENTEDGE
else
Exit;
SetWindowLong(ClientHandle, GWL_EXSTYLE, Style);
SetWindowPos(ClientHandle, 0, 0,0,0,0, SWP_FRAMECHANGED or SWP_NOACTIVATE or
SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
end;
end;
{ Task window management }
type
PTaskWindow = ^TTaskWindow;
TTaskWindow = record
Next: PTaskWindow;
Window: HWnd;
end;
var
TaskActiveWindow: HWnd = 0;
TaskFirstWindow: HWnd = 0;
TaskFirstTopMost: HWnd = 0;
TaskWindowList: PTaskWindow = nil;
procedure DoneApplication;
begin
with Application do
begin
if Handle <> 0 then ShowOwnedPopups(Handle, False);
ShowHint := False;
Destroying;
DestroyComponents;
end;
end;
function DoDisableWindow(Window: HWnd; Data: Longint): Bool; stdcall;
var
P: PTaskWindow;
begin
if (Window <> TaskActiveWindow) and IsWindowVisible(Window) and
IsWindowEnabled(Window) then
begin
New(P);
P^.Next := TaskWindowList;
P^.Window := Window;
TaskWindowList := P;
EnableWindow(Window, False);
end;
Result := True;
end;
function DisableTaskWindows(ActiveWindow: HWnd): Pointer;
var
SaveActiveWindow: HWND;
SaveWindowList: Pointer;
begin
Result := nil;
SaveActiveWindow := TaskActiveWindow;
SaveWindowList := TaskWindowList;
TaskActiveWindow := ActiveWindow;
TaskWindowList := nil;
try
try
EnumThreadWindows(GetCurrentThreadID, @DoDisableWindow, 0);
Result := TaskWindowList;
except
EnableTaskWindows(TaskWindowList);
raise;
end;
finally
TaskWindowList := SaveWindowList;
TaskActiveWindow := SaveActiveWindow;
end;
end;
procedure EnableTaskWindows(WindowList: Pointer);
var
P: PTaskWindow;
begin
while WindowList <> nil do
begin
P := WindowList;
if IsWindow(P^.Window) then EnableWindow(P^.Window, True);
WindowList := P^.Next;
Dispose(P);
end;
end;
function DoFindWindow(Window: HWnd; Param: Longint): Bool; stdcall;
begin
if (Window <> TaskActiveWindow) and (Window <> Application.FHandle) and
IsWindowVisible(Window) and IsWindowEnabled(Window) then
if GetWindowLong(Window, GWL_EXSTYLE) and WS_EX_TOPMOST = 0 then
begin
if TaskFirstWindow = 0 then TaskFirstWindow := Window;
end else
begin
if TaskFirstTopMost = 0 then TaskFirstTopMost := Window;
end;
Result := True;
end;
function FindTopMostWindow(ActiveWindow: HWnd): HWnd;
begin
TaskActiveWindow := ActiveWindow;
TaskFirstWindow := 0;
TaskFirstTopMost := 0;
EnumThreadWindows(GetCurrentThreadID, @DoFindWindow, 0);
if TaskFirstWindow <> 0 then
Result := TaskFirstWindow else
Result := TaskFirstTopMost;
end;
function SendFocusMessage(Window: HWnd; Msg: Word): Boolean;
var
Count: Integer;
begin
Count := FocusCount;
SendMessage(Window, Msg, 0, 0);
Result := FocusCount = Count;
end;
{ Check if this is the active Windows task }
type
PCheckTaskInfo = ^TCheckTaskInfo;
TCheckTaskInfo = record
FocusWnd: HWnd;
Found: Boolean;
end;
function CheckTaskWindow(Window: HWnd; Data: Longint): Bool; stdcall;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -