끌어서 놓기 마우스 동작 개요(Windows Forms .NET)

Windows Forms에는 끌어서 놓기 동작을 구현하는 메서드, 이벤트 및 클래스 집합이 포함되어 있습니다. 이 항목에서는 Windows Forms의 끌어서 놓기 지원에 대해 개괄적으로 설명합니다.

중요

.NET 7 및 .NET 6에 관한 데스크톱 가이드 설명서는 제작 중입니다.

끌어서 놓기 이벤트

끌어서 놓기 작업에는 두 가지 범주의 이벤트가 있습니다. 하나는 끌어서 놓기 작업의 현재 대상에서 발생하는 이벤트이고, 다른 하나는 끌어서 놓기 작업의 소스에서 발생하는 이벤트입니다. 끌어서 놓기 작업을 수행하려면 해당 이벤트를 처리해야 합니다. 이러한 이벤트의 이벤트 인수에서 제공하는 정보를 사용하면 끌어서 놓기 작업을 쉽게 구현할 수 있습니다.

현재 놓기 대상의 이벤트

다음 표에서는 끌어서 놓기 작업의 현재 대상에서 발생하는 이벤트를 보여 줍니다.

마우스 이벤트 Description
DragEnter 이 이벤트는 개체를 컨트롤의 범위로 끌어올 때 발생합니다. 이 이벤트의 처리기는 DragEventArgs 형식의 인수를 받습니다.
DragOver 이 이벤트는 마우스 포인터가 컨트롤의 범위 내에 있는 동안 개체를 끌 때 발생합니다. 이 이벤트의 처리기는 DragEventArgs 형식의 인수를 받습니다.
DragDrop 이 이벤트는 끌어서 놓기 작업이 완료될 때 발생합니다. 이 이벤트의 처리기는 DragEventArgs 형식의 인수를 받습니다.
DragLeave 이 이벤트는 컨트롤의 범위 밖으로 개체를 끌 때 발생합니다. 이 이벤트의 처리기는 EventArgs 형식의 인수를 받습니다.

DragEventArgs 클래스는 마우스 포인터의 위치, 마우스 단추의 현재 상태 및 키보드의 한정자 키, 끄는 데이터, 끌기 이벤트의 소스에서 허용되는 작업과 작업의 대상 놓기 효과를 지정하는 DragDropEffects 값을 제공합니다.

놓기 소스의 이벤트

다음 표에서는 끌어서 놓기 작업의 소스에서 발생하는 이벤트를 보여 줍니다.

마우스 이벤트 Description
GiveFeedback 이 이벤트는 끌기 작업 중에 발생합니다. 마우스 포인터 변경 등 끌어서 드롭 작업이 발생하고 있음을 알리는 시각 신호를 사용자에게 제공할 수 있습니다. 이 이벤트의 처리기는 GiveFeedbackEventArgs 형식의 인수를 받습니다.
QueryContinueDrag 이 이벤트는 끌어서 놓기 작업 중에 발생하며 끌기 소스가 끌어서 놓기 작업을 취소해야 할지를 결정하도록 합니다. 이 이벤트의 처리기는 QueryContinueDragEventArgs 형식의 인수를 받습니다.

QueryContinueDragEventArgs 클래스는 마우스 단추의 현재 상태 및 키보드의 한정자 키, Esc 키를 눌렀는지 여부를 지정하는 값, 끌어서 놓기 작업을 계속할지 여부를 지정하기 위해 설정할 수 있는 DragAction 값을 제공합니다.

끌어서 놓기 수행

끌어서 놓기 작업에는 항상 두 가지 구성 요소인 끌기 소스놓기 대상이 포함됩니다. 끌어서 놓기 작업을 시작하려면 컨트롤을 소스로 지정하고 MouseDown 이벤트를 처리합니다. 이벤트 처리기에서 DoDragDrop 메서드를 호출하여 놓기와 연결된 데이터 및 DragDropEffects 값을 제공합니다.

대상 컨트롤의 AllowDrop 속성을 true로 설정하여 해당 컨트롤이 끌어서 놓기 작업을 허용하도록 합니다. 대상은 두 이벤트를 처리하며, 첫 번째 이벤트는 컨트롤 위에 있는 끌기에 응답으로 발생하는 이벤트입니다(예: DragOver). 두 번째 이벤트는 놓기 작업 자체입니다(DragDrop).

다음 예제에서는 Label 컨트롤에서 TextBox로 끌기를 보여 줍니다. 끌기가 완료되면 TextBox는 레이블의 텍스트를 자신에게 할당하여 응답합니다.

// Initiate the drag
private void label1_MouseDown(object sender, MouseEventArgs e) =>
    DoDragDrop(((Label)sender).Text, DragDropEffects.All);

// Set the effect filter and allow the drop on this control
private void textBox1_DragOver(object sender, DragEventArgs e) =>
    e.Effect = DragDropEffects.All;

// React to the drop on this control
private void textBox1_DragDrop(object sender, DragEventArgs e) =>
    textBox1.Text = (string)e.Data.GetData(typeof(string));
' Initiate the drag
Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs)
    DoDragDrop(DirectCast(sender, Label).Text, DragDropEffects.All)
End Sub

' Set the effect filter and allow the drop on this control
Private Sub TextBox1_DragOver(sender As Object, e As DragEventArgs)
    e.Effect = DragDropEffects.All
End Sub

' React to the drop on this control
Private Sub TextBox1_DragDrop(sender As Object, e As DragEventArgs)
    TextBox1.Text = e.Data.GetData(GetType(String))
End Sub

끌기 효과에 관한 자세한 내용은 DataAllowedEffect를 참조하세요.

참고 항목