Inno Setup 中的自定义绘制按钮可同时响应鼠标和键盘
Custom drawn button in Inno Setup that responds to both mouse and keyboard
我需要在 Inno 设置页面上创建一个自定义按钮
我需要给这个新控件附加普通事件,比如鼠标悬停事件、按键事件,我还需要检查这个控件是否是页面上的活动控件。
实际自定义绘制的按钮可以处理鼠标点击。至于键盘事件和焦点,可以通过放置在表单客户区之外的按钮来处理。
简单示例:
[Code]
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord;
lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
var
LastFocusedControl: TWinControl;
HiddenButton: TButton;
CustomButton: TBitmapImage;
procedure RedrawCustomButton;
var
Canvas: TCanvas;
Focused: Boolean;
begin
Canvas := CustomButton.Bitmap.Canvas;
Focused := (WizardForm.ActiveControl = HiddenButton);
Canvas.Pen.Style := psClear;
if Focused then Canvas.Brush.Color := clWhite
else Canvas.Brush.Color := clBtnFace;
Canvas.Rectangle(1, 1, CustomButton.Bitmap.Width, CustomButton.Bitmap.Height);
Canvas.Pen.Style := psSolid;
Canvas.Pen.Mode := pmCopy;
Canvas.Pen.Color := clBlack;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(0, 0, CustomButton.Bitmap.Width, CustomButton.Bitmap.Height);
end;
procedure FocusMonitorProc(
H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord);
begin
if LastFocusedControl <> WizardForm.ActiveControl then
begin
if (LastFocusedControl = HiddenButton) or
(WizardForm.ActiveControl = HiddenButton) then
begin
RedrawCustomButton;
end;
LastFocusedControl := WizardForm.ActiveControl;
end;
end;
procedure ButtonOnClick(Sender: TObject);
begin
// When mouse clicked, change focus
WizardForm.ActiveControl := HiddenButton;
RedrawCustomButton;
MsgBox('Button was clicked', mbInformation, MB_OK);
end;
procedure InitializeWizard();
var
Page: TWizardPage;
begin
Log('InitializeWizard');
Page := CreateCustomPage(wpWelcome, '', '');
HiddenButton := TNewButton.Create(WizardForm);
HiddenButton.Parent := Page.Surface;
HiddenButton.Left := -1000;
HiddenButton.OnClick := @ButtonOnClick;
CustomButton := TBitmapImage.Create(WizardForm);
CustomButton.Parent := Page.Surface;
CustomButton.Top := 0;
CustomButton.Left := 0;
CustomButton.Width := ScaleX(128);
CustomButton.Height := ScaleX(32);
CustomButton.Bitmap.Width := CustomButton.Width;
CustomButton.Bitmap.Height := CustomButton.Height;
CustomButton.OnClick := @ButtonOnClick;
RedrawCustomButton;
// Set up 50ms timer to monitor the focus
SetTimer(0, 0, 50, CreateCallback(@FocusMonitorProc));
end;
对于焦点监控,代码使用我对您上一个问题的回答中描述的技术 。
专注时:
不专心时:
我需要在 Inno 设置页面上创建一个自定义按钮
我需要给这个新控件附加普通事件,比如鼠标悬停事件、按键事件,我还需要检查这个控件是否是页面上的活动控件。
实际自定义绘制的按钮可以处理鼠标点击。至于键盘事件和焦点,可以通过放置在表单客户区之外的按钮来处理。
简单示例:
[Code]
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord;
lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
var
LastFocusedControl: TWinControl;
HiddenButton: TButton;
CustomButton: TBitmapImage;
procedure RedrawCustomButton;
var
Canvas: TCanvas;
Focused: Boolean;
begin
Canvas := CustomButton.Bitmap.Canvas;
Focused := (WizardForm.ActiveControl = HiddenButton);
Canvas.Pen.Style := psClear;
if Focused then Canvas.Brush.Color := clWhite
else Canvas.Brush.Color := clBtnFace;
Canvas.Rectangle(1, 1, CustomButton.Bitmap.Width, CustomButton.Bitmap.Height);
Canvas.Pen.Style := psSolid;
Canvas.Pen.Mode := pmCopy;
Canvas.Pen.Color := clBlack;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(0, 0, CustomButton.Bitmap.Width, CustomButton.Bitmap.Height);
end;
procedure FocusMonitorProc(
H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord);
begin
if LastFocusedControl <> WizardForm.ActiveControl then
begin
if (LastFocusedControl = HiddenButton) or
(WizardForm.ActiveControl = HiddenButton) then
begin
RedrawCustomButton;
end;
LastFocusedControl := WizardForm.ActiveControl;
end;
end;
procedure ButtonOnClick(Sender: TObject);
begin
// When mouse clicked, change focus
WizardForm.ActiveControl := HiddenButton;
RedrawCustomButton;
MsgBox('Button was clicked', mbInformation, MB_OK);
end;
procedure InitializeWizard();
var
Page: TWizardPage;
begin
Log('InitializeWizard');
Page := CreateCustomPage(wpWelcome, '', '');
HiddenButton := TNewButton.Create(WizardForm);
HiddenButton.Parent := Page.Surface;
HiddenButton.Left := -1000;
HiddenButton.OnClick := @ButtonOnClick;
CustomButton := TBitmapImage.Create(WizardForm);
CustomButton.Parent := Page.Surface;
CustomButton.Top := 0;
CustomButton.Left := 0;
CustomButton.Width := ScaleX(128);
CustomButton.Height := ScaleX(32);
CustomButton.Bitmap.Width := CustomButton.Width;
CustomButton.Bitmap.Height := CustomButton.Height;
CustomButton.OnClick := @ButtonOnClick;
RedrawCustomButton;
// Set up 50ms timer to monitor the focus
SetTimer(0, 0, 50, CreateCallback(@FocusMonitorProc));
end;
对于焦点监控,代码使用我对您上一个问题的回答中描述的技术
专注时:
不专心时: