使用 onmousedown、onmouseup 和 click 事件时无法捕获所有点击
Cannot catch all clicks when using onmousedown, onmouseup and click events
我正在尝试使用 TPanel 组件创建自定义按钮。为此,我为 onmousedown 和 onmouseup 事件提供了覆盖(以进行一些绘图),并且我使用了 onclick 事件来处理点击。
不幸的是,如果我快速点击我的面板,每隔一次点击就是 "lost",但我不明白为什么。
在这方面,即使是最简单的例子也失败了。我创建了一个新的 VCL 应用程序,添加了一个列表框,一个面板,并实现了如下事件:
procedure TForm1.Panel1Click(Sender: TObject);
begin
listbox1.Items.Add('click');
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
listbox1.Items.Add('mouse down');
end;
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
listbox1.Items.Add('mouse up');
end;
结果如下:
mouse down
click
mouse up
mouse down
mouse up
等等...每次点击都被忽略,但我不知道为什么。
有人可以解释一下吗?
当您快速点击面板时,您的面板正在处理双击。使用:
Panel1.ControlStyle := Panel1.ControlStyle - [csDoubleClicks]
将双击映射为点击。 (在您的自定义控件中,在其构造函数中设置 ControlStyle
)。
csDoubleClicks The control can receive and respond to double-click
messages. Otherwise, map double-clicks into clicks.
我正在尝试使用 TPanel 组件创建自定义按钮。为此,我为 onmousedown 和 onmouseup 事件提供了覆盖(以进行一些绘图),并且我使用了 onclick 事件来处理点击。
不幸的是,如果我快速点击我的面板,每隔一次点击就是 "lost",但我不明白为什么。
在这方面,即使是最简单的例子也失败了。我创建了一个新的 VCL 应用程序,添加了一个列表框,一个面板,并实现了如下事件:
procedure TForm1.Panel1Click(Sender: TObject);
begin
listbox1.Items.Add('click');
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
listbox1.Items.Add('mouse down');
end;
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
listbox1.Items.Add('mouse up');
end;
结果如下:
mouse down
click
mouse up
mouse down
mouse up
等等...每次点击都被忽略,但我不知道为什么。
有人可以解释一下吗?
当您快速点击面板时,您的面板正在处理双击。使用:
Panel1.ControlStyle := Panel1.ControlStyle - [csDoubleClicks]
将双击映射为点击。 (在您的自定义控件中,在其构造函数中设置 ControlStyle
)。
csDoubleClicks The control can receive and respond to double-click messages. Otherwise, map double-clicks into clicks.