2017-11-17 218 views
3

dragOver 이벤트 핸들러를 시도했지만 정상적으로 작동하지 않았습니다.C#에서 onclick() 이벤트를 트리거하고 마우스 클릭을 계속 누른 상태에서 onDrag() 이벤트를 감지 할 수있는 방법이 있습니까

나는 피아노를 작업 중이며 mousedown이 해당 키에서 발생하지 않았더라도 음을 재생할 수 있기를 원합니다.

여기에 이벤트 핸들러가 있습니까?

아래는 제가 작업하고있는 피아노의 그림입니다.

Piano

+0

버튼 밖? 좀 더 명확 해 질 수 있니? – napi15

+0

button1을 클릭 한 다음 (마우스를 계속 누르고 있으면) button2로 드래그합니다. 나는 또한 button2의 소리를 연주하고 싶습니다. 이 사건이 있습니까? –

+0

@KurtCamilleri 당신을 위해 일할 나의 대답이 있는지 알고 싶습니다. 필자의 테스트와 결과는 완벽하게 기능을 발휘했다. –

답변

1

private void object_MouseEnter(object sender, EventArgs e) 
{ 
    if (Mouse.LeftButton == MouseButtonState.Pressed) 
    { 
     'Do Something 
    } 
} 
+0

마우스 용 가져 오기가 필요합니까? –

+0

그것은 System.Windows.Forms에 있습니다. – SteveB

+0

그 가져 오기가 있지만 현재 컨텍스트에 마우스가 존재하지 않는다고 말하고 있습니다. –

1

예를 클릭하고 여기 like을 끌어하려는 클릭 않다면 당신은 볼 마우스를 감시 입력 한 후 마우스의 상태를 확인 할 수 있어야한다 :

private void MyMouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left && e.Clicks == 1) 
      { 
       //Bla bla bla , do whatever you want 
      } 
     } 
+0

myWrapper에 대한 가져 오기가 필요합니까? 코드를 친절하게 설명해 주시겠습니까? –

+0

@KurtCamilleri 아니, 너는 필요 없어 ............. 나는 대답의 모양을 다시 편집했습니다 – napi15

+0

도움을 주셔서 감사합니다. 그러나 작동하지 않습니다. –

0

MouseUp 이벤트가 해제되면 마우스가 다른 단추 위에 있는지 확인할 수 있습니다. 그럴 경우 해당 버튼을 클릭하십시오. 나는 this 질문에있는 답변에서 GetCursorPosition 코드를 가져갔습니다.

buttonClick이 이미 해당 버튼에 대해 처리되었는지 여부를 알 수 있도록 버튼 태그에 true 및 false를 넣어야했습니다.

// 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; 
} 
+0

고맙습니다. 왼쪽 버튼 위로 버튼이 발생한 후에 작동합니다.나는 다음 버튼 위로 마우스를 가져 가면 작업 할 무언가를 원했고, 그 버튼을 즉시 누를 수있게했다. @Blake –

+0

@ KurtCamilleri 더 구체적으로 할 수 있습니까? 무슨 뜻인지 잘 모르겠다. 나는이 목적이 동시에 두 개의 키를 연주 할 수 있다고 상상하고있었습니다. –

+0

@KurtCamilleri 다음 설명은 정확합니까? 버튼 1을 클릭 한 상태에서 "Dings!" MouseDown에서 button2로 드래그하고 "Dings!" MouseUp에? Btw, 그것이 정확하다면, 나는 그것이 직관적이라고 확신하지 못합니다. 사용자로서 그렇게 될 것이라고 추측하지는 않습니다. –