问题描述
如果窗口有窗口子控件,则窗口 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 进行缩放:
我仍然可以使用 Ctrl+滚轮进行缩放,但现在如果我在按住鼠标左键的同时滚动鼠标滚轮,表单也会缩放:
这很烦人。是否有已知的解决方法?
解决方法
一个明显的解决方案就是不使用明显不可靠的 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;