控制.捕捉总是正确的

本文关键字:控制 | 更新日期: 2023-09-27 18:02:43

我创建了一个Windows窗体应用程序,但是我从控件的Capture属性中得到奇怪的行为。

在空白表单上,有一个名为"label1"的标签和代码

public Form1()
{
    InitializeComponent();
    label1.MouseDown += pictureBox1_MouseDown;
}
void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    Debug.WriteLine(label1.Capture);
    label1.Capture = !label1.Capture;
    Debug.WriteLine(label1.Capture);
} 

我观察到,当按钮被点击时,第一个WriteLine总是说"True",第二个总是说"False"。即使点击多次。

标签永远不会对其边界外的点击做出反应,即使我使用label1.Capture = true也不会。

我是否误解了"Capture"属性的预期行为?我希望初始值为false,并且标签不会对外部的单击做出反应,在第一次单击之后,我希望该值为true,并且标签对所有鼠标单击做出反应,甚至在其边界之外。

控制.捕捉总是正确的

MouseDown事件中,控件的Capture初始总是设置为true。所以通常情况下,如果你执行MouseDown,然后没有释放鼠标按钮,将鼠标移出控件,然后释放鼠标按钮,控件的MouseUp事件将被触发。

如果在MouseDown中将Capture设置为false,则控件的鼠标向上事件仅在鼠标位于控件上时触发,如果将鼠标移出控件并释放鼠标按钮,则控件的MouseUp事件不会触发。

同样在MouseUp中,捕获将自动释放。

有关更多信息,请查看以下资源:

  • WmMouseDown方法源代码
  • WmMouseUp方法源代码

  • CaptureInternal源代码

  • SetCapture文件

  • ReleaseCapture文件