📄 jvqexforms.pas
字号:
{ QWinControl }
private
FInternalFontChanged: TNotifyEvent;
FOnEvent: TEventEvent;
procedure DoOnFontChanged(Sender: TObject);
procedure CMDesignHitTest(var Mesg: TJvMessage); message CM_DESIGNHITTEST;
protected
procedure CreateWidget; override;
procedure CreateWnd; virtual;
procedure CursorChanged; override;
procedure DoEnter; override;
function DoPaintBackground(Canvas: TCanvas; Param: Integer): Boolean; virtual;
procedure DoExit; override;
procedure DoKillFocus(NextWnd: HWND); dynamic;
procedure DoSetFocus(PreviousWnd: HWND); dynamic;
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; override;
procedure PaintWindow(PaintDevice: QPaintDeviceH);
procedure RecreateWnd;
procedure ShowingChanged; override;
function WidgetFlags: Integer; override;
public
function ColorToRGB(Value: TColor): TColor;
procedure PaintTo(PaintDevice: QPaintDeviceH; X, Y: Integer);
published
property OnEvent: TEventEvent read FOnEvent write FOnEvent;
{ QWinControl }
private
FCanvas: TCanvas;
FDoubleBuffered: Boolean;
protected
procedure Paint; virtual;
procedure Painting(Sender: QObjectH; EventRegion: QRegionH); override;
property DoubleBuffered: Boolean read FDoubleBuffered write FDoubleBuffered;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Canvas: TCanvas read FCanvas;
end;
{ QWinControl Begin }
TJvExToolWindow = class(TToolWindow)
{ QControl }
private
FAboutJVCL: TJVCLAboutInfo;
FDesktopFont: Boolean;
FDragCursor: TCursor;
FDragKind: TDragKind;
FHintColor: TColor;
FMouseOver: Boolean;
FOnParentColorChanged: TNotifyEvent;
FWindowProc: TWndMethod;
procedure SetDesktopFont(Value: Boolean);
procedure CMHitTest(var Mesg: TJvMessage); message CM_HITTEST;
procedure CMHintShow(var Mesg: TJvMessage); message CM_HINTSHOW;
procedure CMSysFontChanged(var Mesg: TMessage); message CM_SYSFONTCHANGED;
protected
procedure ColorChanged; override;
procedure EnabledChanged; override;
procedure FocusChanged; dynamic;
function HitTest(X, Y: integer): Boolean; override;
procedure MouseEnter(AControl: TControl); override;
procedure MouseLeave(AControl: TControl); override;
procedure ParentColorChanged; override;
procedure TextChanged; override;
procedure VisibleChanged; override;
function HintShow(var HintInfo : THintInfo): Boolean; override;
procedure WndProc(var Mesg: TMessage); dynamic;
property DragCursor: TCursor read FDragCursor write FDragCursor stored False; { not implemented }
property DragKind: TDragKind read FDragKind write FDragKind stored false; { not implemented }
property OnParentColorChange: TNotifyEvent read FOnParentColorChanged write FOnParentColorChanged;
property DesktopFont: Boolean read FDesktopFont write SetDesktopFont default false;
public
procedure Dispatch(var Mesg); override;
function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
function IsRightToLeft: Boolean;
property WindowProc: TWndMethod read FWindowProc write FWindowProc;
property MouseOver: Boolean read FMouseOver write FMouseOver;
published
property AboutJVCLX: TJVCLAboutInfo read FAboutJVCL write FAboutJVCL stored False;
property HintColor: TColor read FHintColor write FHintColor default clDefault;
{ QWinControl }
private
FInternalFontChanged: TNotifyEvent;
FOnEvent: TEventEvent;
procedure DoOnFontChanged(Sender: TObject);
procedure CMDesignHitTest(var Mesg: TJvMessage); message CM_DESIGNHITTEST;
protected
procedure CreateWidget; override;
procedure CreateWnd; virtual;
procedure CursorChanged; override;
procedure DoEnter; override;
function DoPaintBackground(Canvas: TCanvas; Param: Integer): Boolean; virtual;
procedure DoExit; override;
procedure DoKillFocus(NextWnd: HWND); dynamic;
procedure DoSetFocus(PreviousWnd: HWND); dynamic;
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; override;
procedure PaintWindow(PaintDevice: QPaintDeviceH);
procedure RecreateWnd;
procedure ShowingChanged; override;
function WidgetFlags: Integer; override;
public
function ColorToRGB(Value: TColor): TColor;
procedure PaintTo(PaintDevice: QPaintDeviceH; X, Y: Integer);
published
property OnEvent: TEventEvent read FOnEvent write FOnEvent;
private
FDoubleBuffered: Boolean;
protected
property DoubleBuffered: Boolean read FDoubleBuffered write FDoubleBuffered;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
implementation
{$IFDEF UNITVERSIONING}
uses
JclUnitVersioning;
{$ENDIF UNITVERSIONING}
const
UISF_HIDEFOCUS = 1;
UISF_HIDEACCEL = 2;
UIS_SET = 1;
UIS_CLEAR = 2;
UIS_INITIALIZE = 3;
{ QWinCustomControl Create }
constructor TJvExCustomForm.CreateNew(AOwner: TComponent; Dummy: Integer);
begin
inherited CreateNew(AOwner, Dummy);
FWindowProc := WndProc;
FHintColor := clDefault;
FDesktopFont := True;
end;
{ QWinCustomControl Create }
constructor TJvExCustomForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowProc := WndProc;
FInternalFontChanged := Font.OnChange;
Font.OnChange := DoOnFontChanged;
FHintColor := clDefault;
end;
destructor TJvExCustomForm.Destroy;
begin
inherited Destroy;
end;
procedure TJvExCustomForm.WndProc(var Mesg: TMessage);
begin
//OutputDebugString(PAnsiChar(Format('WINCONTROL %s: %s Msg $%x',[Name, ClassName, Mesg.Msg])));
with TJvMessage(Mesg) do
begin
case Msg of
{ WinControl Messages }
WM_KILLFOCUS : DoKillFocus(FocusedWnd);
WM_SETFOCUS : DoSetFocus(FocusedWnd);
CM_FONTCHANGED : FInternalFontChanged(Font);
CM_HINTSHOW : HintInfo^.HintColor := GetHintcolor(Self);
WM_GETDLGCODE:
begin
Result := InputKeysToDlgCodes(InputKeys);
Exit;
end;
WM_ERASEBKGND:
begin
Canvas.Start;
try
Handled := DoPaintBackGround(Canvas, LParam);
finally
Canvas.Stop;
end;
Exit;
end;
{ Control Messages }
CM_FOCUSCHANGED: FocusChanged;
CM_MOUSEENTER: FMouseOver := True;
CM_MOUSELEAVE: FMouseOver := False;
end;
end;
inherited Dispatch(Mesg);
end;
{ QWinControl Common }
procedure TJvExCustomForm.CMDesignHitTest(var Mesg: TJvMessage);
begin
with Mesg do
begin
Handled := inherited HitTest(XPos, YPos);
if Handled then
Result := HTCLIENT;
end;
end;
procedure TJvExCustomForm.CMHitTest(var Mesg: TJvMessage);
begin
with Mesg do
begin
if csDesigning in ComponentState then
Result := Perform(CM_DESIGNHITTEST, XPos, YPos)
else
begin
Handled := inherited HitTest(XPos, YPos);
if Handled then
Result := HTCLIENT;
end;
end;
end;
function TJvExCustomForm.DoPaintBackground(Canvas: TCanvas; Param: Integer): Boolean;
begin
Result := false;
end;
procedure TJvExCustomForm.ShowingChanged;
begin
Perform(CM_SHOWINGCHANGED, 0 ,0);
inherited;
end;
procedure TJvExCustomForm.ColorChanged;
begin
Perform(CM_COLORCHANGED, 0, 0);
inherited;
end;
procedure TJvExCustomForm.CursorChanged;
begin
Perform(CM_CURSORCHANGED, 0, 0);
inherited;
end;
procedure TJvExCustomForm.DoSetFocus(PreviousWnd: QWidgetH);
begin
{ notification }
end;
procedure TJvExCustomForm.DoKillFocus(NextWnd: QWidgetH);
begin
{ notification }
end;
procedure TJvExCustomForm.DoEnter;
begin
Perform(CM_ENTER, 0 ,0);
inherited DoEnter;
end;
procedure TJvExCustomForm.DoExit;
begin
Perform(CM_EXIT, 0 ,0);
inherited DoExit;
end;
function TJvExCustomForm.EventFilter(Sender: QObjectH; Event: QEventH): Boolean;
begin
Result := False;
if Assigned(FOnEvent) then
FOnEvent(Sender, Event, Result);
if not Result then
Result := inherited EventFilter(Sender, Event);
end;
procedure TJvExCustomForm.FocusChanged;
begin
NotifyControls(CM_FOCUSCHANGED);
end;
procedure TJvExCustomForm.DoOnFontChanged(Sender: TObject);
begin
ParentFont := False;
PostMessage(Self, CM_FONTCHANGED, 0, 0);
end;
procedure TJvExCustomForm.CreateWidget;
begin
CreateWnd;
end;
procedure TJvExCustomForm.CreateWnd;
begin
inherited CreateWidget;
end;
procedure TJvExCustomForm.RecreateWnd;
begin
if not (csRecreating in ControlState) then
RecreateWidget;
end;
procedure TJvExCustomForm.PaintTo(PaintDevice: QPaintDeviceH; X, Y: Integer);
begin
WidgetControl_PaintTo(self, PaintDevice, X, Y);
end;
procedure TJvExCustomForm.PaintWindow(PaintDevice: QPaintDeviceH);
begin
PaintTo(PaintDevice, 0, 0);
end;
function TJvExCustomForm.WidgetFlags: Integer;
begin
Result := inherited WidgetFlags or
Integer(WidgetFlags_WRepaintNoErase) or
Integer(WidgetFlags_WMouseNoMask);
end;
function TJvExCustomForm.ColorToRGB(Value: TColor): TColor;
begin
Result := QWindows.ColorToRGB(Value, self);
end;
{ QControl Common}
function TJvExCustomForm.HitTest(X, Y: integer): Boolean;
begin
Result := Perform(CM_HITTEST, 0, 0) <> HTNOWHERE;
end;
procedure TJvExCustomForm.CMHintShow(var Mesg: TJvMessage);
begin
with Mesg do
begin
Handled := inherited HintShow(HintInfo^);
end;
end;
procedure TJvExCustomForm.CMSysFontChanged(var Mesg: TMessage);
begin
if FDesktopFont then
begin
Font.Assign(Application.Font);
FDesktopFont := True;
end;
end;
procedure TJvExCustomForm.EnabledChanged;
begin
Perform(CM_ENABLEDCHANGED, 0, 0);
inherited EnabledChanged;
end;
procedure TJvExCustomForm.TextChanged;
begin
Perform(CM_TEXTCHANGED, 0, 0);
inherited TextChanged;
end;
procedure TJvExCustomForm.VisibleChanged;
begin
Perform(CM_VISIBLECHANGED, 0, 0);
inherited VisibleChanged;
end;
function TJvExCustomForm.HintShow(var HintInfo : THintInfo): Boolean;
begin
Result := Perform(CM_HINTSHOW, 0, Integer(@HintInfo)) <> 0;
end;
procedure TJvExCustomForm.MouseEnter(AControl: TControl);
begin
Perform(CM_MOUSEENTER, 0, 0);
inherited MouseEnter(AControl);
end;
procedure TJvExCustomForm.MouseLeave(AControl: TControl);
begin
Perform(CM_MOUSELEAVE, 0, 0);
inherited MouseLeave(AControl);
end;
procedure TJvExCustomForm.ParentColorChanged;
begin
inherited ParentColorChanged;
if Assigned(FOnParentColorChanged) then
FOnParentColorChanged(Self);
end;
procedure TJvExCustomForm.SetDesktopFont(Value: Boolean);
begin
if FDesktopFont <> Value then
begin
FDesktopFont := Value;
Perform(CM_SYSFONTCHANGED, 0, 0);
end;
end;
procedure TJvExCustomForm.Dispatch(var Mesg);
begin
if Assigned(FWindowProc) then
FWindowProc(TMessage(Mesg))
else
inherited Dispatch(Mesg);
end;
function TJvExCustomForm.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
var
Mesg: TMessage;
begin
Mesg.Msg := Msg;
Mesg.WParam := WParam;
Mesg.LParam := LParam;
Mesg.Result := 0;
Dispatch(Mesg);
Result := Mesg.Result;
end;
function TJvExCustomForm.IsRightToLeft: Boolean;
begin
Result := False;
end;
{ QWinCustomControl Create }
constructor TJvExForm.CreateNew(AOwner: TComponent; Dummy: Integer);
begin
inherited CreateNew(AOwner, Dummy);
FWindowProc := WndProc;
FHintColor := clDefault;
FDesktopFont := True;
end;
{ QWinCustomControl Create }
constructor TJvExForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowProc := WndProc;
FInternalFontChanged := Font.OnChange;
Font.OnChange := DoOnFontChanged;
FHintColor := clDefault;
end;
destructor TJvExForm.Destroy;
begin
inherited Destroy;
end;
procedure TJvExForm.WndProc(var Mesg: TMessage);
begin
//OutputDebugString(PAnsiChar(Format('WINCONTROL %s: %s Msg $%x',[Name, ClassName, Mesg.Msg])));
with TJvMessage(Mesg) do
begin
case Msg of
{ WinControl Messages }
WM_KILLFOCUS : DoKillFocus(FocusedWnd);
WM_SETFOCUS : DoSetFocus(FocusedWnd);
CM_FONTCHANGED : FInternalFontChanged(Font);
CM_HINTSHOW : HintInfo^.HintColor := GetHintcolor(Self);
WM_GETDLGCODE:
begin
Result := InputKeysToDlgCodes(InputKeys);
Exit;
end;
WM_ERASEBKGND:
begin
Canvas.Start;
try
Handled := DoPaintBackGround(Canvas, LParam);
finally
Canvas.Stop;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -