winforms 为什么MouseEventArgs e不会在For()循环中与Mousebuttons.(MouseButton)交互?

drnojrws  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(126)

作为一名新的C#程序员,我有许多问题需要解决,特别是这个问题涉及到MouseEventArgs e及其与MouseButtons.Left的交互似乎不兼容,
我可能对MouseEventArgs的真正功能或用法缺乏了解,这是导致此问题的原因。
有人能解释一下为什么我的尝试是不正确的吗?正确的解决方案是什么?以及我如何才能防止将来遇到类似的问题?

private void BtnSize_MouseDown(object sender, MouseEventArgs e)
{
    // Issue exists here, e == MouseButtons.Left does not work
    // why? Isn't the purpose of MouseEventArgs e to track the 
    // mouse input (aka left click?)
    if (e == MouseButtons.Left)
    {
        // clear canvas
        Ball.Loading = true;

        while (ballsAdded < 25 && ballsRemoved < 1000)
        {
            Ball newBall = new Ball(ballRadiusSet);

            // Contains bool will force balls to spawn apart from one another
            if (!soManyBalls.Contains(newBall))
            {
                soManyBalls.Add(newBall);

                ballsAdded++;
            }

            else
            {
                ballsRemoved++;
            }
        }

        foreach (Ball listBall in soManyBalls)
        {
            listBall.AddBall();
        }

        // render canvas
        Ball.Loading = false;

        Text = $"Loaded {ballsAdded} distinct balls with {ballsRemoved} discards";

        ballsAdded = 0;
        ballsRemoved = 0;
    }

    if (e == MouseButtons.Right)
    {
        // clear canvas
        Ball.Loading = true;

        while (ballsAdded < 25 && ballsRemoved < 1000)
        {
            Ball newBall = new Ball(ballRadiusSet);

            // Invert Contains bool so balls form directly connected to one another
            if (soManyBalls.Contains(newBall))
            {
                soManyBalls.Add(newBall);

                ballsAdded++;
            }

            else
            {
                ballsRemoved++;
            }
        }

        foreach (Ball listBall in soManyBalls)
        {
            listBall.AddBall();
        }

        // render canvas
        Ball.Loading = false;

        Text = $"Loaded {ballsAdded} distinct balls with {ballsRemoved} discards";

        ballsAdded = 0;
        ballsRemoved = 0;
    }
}
zpqajqem

zpqajqem1#

除了比较MouseButtons.Left与事件本身(e == MouseButtons.Lef)之外,您可以使用包含相关鼠标器按钮之事件的属性:

if (e.Button == MouseButtons.Left)
{
  // ...

MouseEventArgs不仅包含按下的按钮,而且包含关于鼠标事件的其它信息,例如位置。
请注意Button属性包含了所有按下按钮的信息。因此,例如,如果左按钮和右按钮都被单击,但您只想检查左按钮,则必须比较位模式,例如:

if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
  // ...

如果左键与其他按钮一起被单击,上述条件也将评估为true。

iih3973s

iih3973s2#

参数eMouseEventArgs类型的对象。MouseButtons.LeftMouseButtons类型的枚举字段。此枚举字段永远不等于MouseEventArgs类型的对象。

private void BtnSize_MouseDown(object sender, MouseEventArgs e)
{
    if (e == MouseButtons.Left)

此等式将始终返回false。

如果检查MouseEventArgs的定义,您会发现它有一个MouseEventArgs.Button属性。此属性的类型为MouseButtons。以下代码可能有效:

if (e.Button == MouseButtons.Left)

警告!MouseButtons是具有flags属性的枚举。这意味着该值可以是多个枚举值的组合。如果操作员同时按下左右按钮,则该值将为:MouseButtons.Left | MouseButtons.Right。因此,语句if (e.Button == MouseButtons.Left)将返回false。

您必须检查要求,如果操作员按下两个按钮,该如何React?忽略右侧按钮,就像只按下左侧按钮一样?

if (e.Button & MouseButtons.Left == MouseButtons.Left)

如果只按下左按钮,但同时按下左按钮和其他按钮,则返回true

相关问题