如果 VCL 控件有子控件,则 LButton-scroll 注册为 Ctrl-scroll

问题描述

如果窗口有窗口子控件,则窗口 VCL 控件似乎将 LButton-scroll 注册为 Ctrl-scroll。如果用户使用罗技 MX Master 鼠标,至少会发生这种情况。

考虑以下最小示例:

unit Unit1;

interface

uses
  Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
  private
    procedure ZoomIn;
    procedure ZoomOut;
  public
  end;

implementation

{$R *.dfm}

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if ssCtrl in Shift then
    ZoomOut;
end;

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if ssCtrl in Shift then
    ZoomIn;
end;

procedure TForm1.ZoomIn;
begin
  Font.Size := Font.Size + 1;
end;

procedure TForm1.ZoomOut;
begin
  if Font.Size >= 6 then
    Font.Size := Font.Size - 1;
end;

end.

这允许我使用 Ctrl+wheel 进行缩放:

Screen recording of a zooming label.

现在,让我们向表单添加一个按钮:

Screenshot of form with a button.

我仍然可以使用 Ctrl+滚轮进行缩放,但现在如果我在按住鼠标左键的同时滚动鼠标滚轮,表单也会缩放:

Screen recording of zooming label

这很烦人。是否有已知的解决方法

解决方法

一个明显的解决方案就是不使用明显不可靠的 Shift 参数:

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if GetKeyState(VK_CONTROL) < 0 then
    ZoomOut;
end;

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if GetKeyState(VK_CONTROL) < 0 then
    ZoomIn;
end;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...