使用 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.

TControl.ControlStyle