Inno Setup 中的自定义绘制按钮可同时响应鼠标和键盘

Custom drawn button in Inno Setup that responds to both mouse and keyboard

我需要在 Inno 设置页面上创建一个自定义按钮

我需要给这个新控件附加普通事件,比如鼠标悬停事件、按键事件,我还需要检查这个控件是否是页面上的活动控件。

像这里问的问题:http://www.delphigroups.info/2/92/498054.html

实际自定义绘制的按钮可以处理鼠标点击。至于键盘事件和焦点,可以通过放置在表单客户区之外的按钮来处理。

简单示例:

[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;

对于焦点监控,代码使用我对您上一个问题的回答中描述的技术

专注时:

不专心时: