3

我尝试了 dragOver 事件处理程序,但它没有按应有的方式工作。

我正在弹钢琴,即使鼠标按下没有发生在那个键上,我也希望能够弹奏音符。

有为此的事件处理程序吗?

下面是我正在制作的钢琴的图片。

钢琴

4

3 回答 3

1

是的,您正在尝试单击并拖动,如下所示

private void MyMouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && e.Clicks == 1)
            {
               //Bla bla bla , do whatever you want 
            }
        }
于 2017-11-17T14:50:22.047 回答
1

您应该能够观察鼠标输入,然后检查鼠标状态以查看它是否被点击

private void object_MouseEnter(object sender, EventArgs e) 
{
    if (Mouse.LeftButton == MouseButtonState.Pressed)
    {
        'Do Something
    }
}
于 2017-11-17T14:43:38.690 回答
0

当 MouseUp 事件关闭时,您可以检查鼠标是否在另一个按钮上。如果是,则单击该按钮。我从这个问题的答案中获取了 GetCursorPosition 代码。

必须将 true 和 false 放入按钮标签中,以便能够判断 ButtonClick 是否已为该按钮处理。

// running as Console window
// output from...
// 1. clicking and releasing on button1
// 2. clicking and holding on button1 and then releasing not over button1 or button2,
// 3. clicking and holding on button1 and then 
// moving mouse to over button2 and releasing mouse.

// button1 Click
// button1 Ding!
// button1 MouseUp
// button1 MouseUp
// button1 Ding!
// button1 MouseUp
// button1 Ding!
// button2 Click
// button2 Ding!

private List<Button> _buttons { get; set; }

public Form1()
{
    InitializeComponent();

    button1.MouseUp += Button_MouseUp;
    button2.MouseUp += Button_MouseUp;

    button1.Click += Button_Click;
    button2.Click += Button_Click;

    button1.Tag = false;
    button2.Tag = false;

    _buttons = new List<Button>()
    {
        button1, button2
    };
}

private void Button_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
    var button = sender as Button;
    Console.WriteLine($"{button.Text} MouseUp");
    if (!(bool)button.Tag)
        ButtonClick(button);
    else
        button.Tag = false;

    Func<Button, bool> ContainsMouse = (b) =>
    {
        var rect = b.RectangleToScreen(b.DisplayRectangle);
        var pos = GetCursorPosition();
        return rect.Contains(pos.X, pos.Y);
    };

    var hoverButton = _buttons.SingleOrDefault(b => ContainsMouse(b));
    if (hoverButton != null && !hoverButton.Equals(button))
        hoverButton.PerformClick();
}

private void Button_Click(object sender, EventArgs e)
{
    var button = sender as Button;
    Console.WriteLine($"{button.Text} Click");
    ButtonClick(button);
    button.Tag = true;
}

private void ButtonClick(Button button)
{
    Console.WriteLine($"{button.Text} Ding!");
}

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public static implicit operator Point(POINT point)
    {
        return new Point(point.X, point.Y);
    }
}

/// <summary>
/// Retrieves the cursor's position, in screen coordinates.
/// </summary>
/// <see>See MSDN documentation for further information.</see>
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);

public static Point GetCursorPosition()
{
    POINT lpPoint;
    GetCursorPos(out lpPoint);
    //bool success = User32.GetCursorPos(out lpPoint);
    // if (!success)

    return lpPoint;
}
于 2017-11-17T15:23:59.467 回答