Control.DragOver 이벤트
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
개체를 컨트롤의 범위 위로 끌 때 발생합니다.
public:
event System::Windows::Forms::DragEventHandler ^ DragOver;
public event System.Windows.Forms.DragEventHandler DragOver;
public event System.Windows.Forms.DragEventHandler? DragOver;
member this.DragOver : System.Windows.Forms.DragEventHandler
Public Custom Event DragOver As DragEventHandler
이벤트 유형
예제
다음 코드 예제에서는 두 ListBox 컨트롤 간의 끌어서 놓기 작업을 보여 줍니다. 이 예제에서는 끌기 작업이 시작될 때 DoDragDrop 메서드를 호출합니다. 마우스가 MouseDown 이벤트 중에 마우스 위치에서 SystemInformation.DragSize 이상 이동한 경우 끌기 작업이 시작됩니다.
IndexFromPoint 메서드는 MouseDown
이벤트 중에 끌 항목의 인덱스 확인에 사용됩니다.
또한 이 예제에서는 끌어서 놓기 작업에 사용자 지정 커서를 사용하는 방법을 보여 줍니다. 이 예제에서는 3dwarro.cur
및 3dwno.cur
두 개의 커서 파일이 각각 사용자 지정 끌어서 놓기 커서에 대해 애플리케이션 디렉터리에 있어야 합니다.
UseCustomCursorsCheck
CheckBox 선택하면 사용자 지정 커서가 사용됩니다. 사용자 지정 커서는 GiveFeedback 이벤트 처리기에 설정됩니다.
키보드 상태는 오른쪽 ListBox
대한 DragOver 이벤트 처리기에서 평가되어 Shift, Ctrl, Alt 또는 Ctrl+Alt 키의 상태를 기준으로 끌기 작업을 결정합니다. 드롭이 발생하는 ListBox
위치도 DragOver
이벤트 중에 결정됩니다. 삭제할 데이터가 String
아닌 경우 DragEventArgs.EffectDragDropEffectsNone
설정됩니다. 마지막으로 드롭 상태가 DropLocationLabel
Label표시됩니다.
오른쪽 ListBox
대해 삭제할 데이터는 DragDrop 이벤트 처리기에서 결정되며 String
값은 ListBox
적절한 위치에 추가됩니다. 끌기 작업이 폼의 범위 밖으로 이동하면 QueryContinueDrag 이벤트 처리기에서 끌어서 놓기 작업이 취소됩니다.
이 코드 발췌에서는 DragOver 이벤트를 사용하는 방법을 보여 줍니다. 전체 코드 예제는 DoDragDrop 메서드를 참조하세요.
void ListDragTarget_DragOver( Object^ /*sender*/, System::Windows::Forms::DragEventArgs^ e )
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if ( !e->Data->GetDataPresent( System::String::typeid ) )
{
e->Effect = DragDropEffects::None;
DropLocationLabel->Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ( (e->KeyState & (8 + 32)) == (8 + 32) && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 32) == 32 && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// ALT KeyState for link.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 4) == 4 && ((e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move) )
{
// SHIFT KeyState for move.
e->Effect = DragDropEffects::Move;
}
else
if ( (e->KeyState & 8) == 8 && ((e->AllowedEffect & DragDropEffects::Copy) == DragDropEffects::Copy) )
{
// CTRL KeyState for copy.
e->Effect = DragDropEffects::Copy;
}
else
if ( (e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move )
{
// By default, the drop action should be move, if allowed.
e->Effect = DragDropEffects::Move;
}
else
e->Effect = DragDropEffects::None;
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop = ListDragTarget->IndexFromPoint( ListDragTarget->PointToClient( Point(e->X,e->Y) ) );
// Updates the label text.
if ( indexOfItemUnderMouseToDrop != ListBox::NoMatches )
{
DropLocationLabel->Text = String::Concat( "Drops before item # ", (indexOfItemUnderMouseToDrop + 1) );
}
else
DropLocationLabel->Text = "Drops at the end.";
}
private void ListDragTarget_DragOver(object sender, DragEventArgs e)
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if (!e.Data.GetDataPresent(typeof(System.String)))
{
e.Effect = DragDropEffects.None;
DropLocationLabel.Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ((e.KeyState & (8 + 32)) == (8 + 32) &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 32) == 32 &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// ALT KeyState for link.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 4) == 4 &&
(e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// SHIFT KeyState for move.
e.Effect = DragDropEffects.Move;
}
else if ((e.KeyState & 8) == 8 &&
(e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
{
// CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy;
}
else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(new Point(e.X, e.Y)));
// Updates the label text.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
{
DropLocationLabel.Text = "Drops before item #" + (indexOfItemUnderMouseToDrop + 1);
}
else
{
DropLocationLabel.Text = "Drops at the end.";
}
}
Private Sub ListDragTarget_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles ListDragTarget.DragOver
' Determine whether string data exists in the drop data. If not, then
' the drop effect reflects that the drop cannot occur.
If Not (e.Data.GetDataPresent(GetType(System.String))) Then
e.Effect = DragDropEffects.None
DropLocationLabel.Text = "None - no string data."
Return
End If
' Set the effect based upon the KeyState.
If ((e.KeyState And (8 + 32)) = (8 + 32) And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' KeyState 8 + 32 = CTRL + ALT
' Link drag-and-drop effect.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 32) = 32 And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' ALT KeyState for link.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 4) = 4 And
(e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' SHIFT KeyState for move.
e.Effect = DragDropEffects.Move
ElseIf ((e.KeyState And 8) = 8 And
(e.AllowedEffect And DragDropEffects.Copy) = DragDropEffects.Copy) Then
' CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy
ElseIf ((e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If
' Gets the index of the item the mouse is below.
' The mouse locations are relative to the screen, so they must be
' converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(New Point(e.X, e.Y)))
' Updates the label text.
If (indexOfItemUnderMouseToDrop <> ListBox.NoMatches) Then
DropLocationLabel.Text = "Drops before item #" & (indexOfItemUnderMouseToDrop + 1)
Else
DropLocationLabel.Text = "Drops at the end."
End If
End Sub
설명
마우스 커서가 끌어서 놓기 작업 중에 컨트롤 범위 내에서 이동할 때 DragOver 이벤트가 발생합니다.
다음은 끌어서 놓기 작업과 관련된 이벤트가 발생하는 방법과 시기에 대해 설명합니다.
DoDragDrop 메서드는 현재 커서 위치 아래의 컨트롤을 결정합니다. 그런 다음 컨트롤이 유효한 놓기 대상인지 확인합니다.
컨트롤이 유효한 놓기 대상인 경우 끌어서 놓기 효과가 지정된 GiveFeedback 이벤트가 발생합니다. 끌어서 놓기 효과 목록은 DragDropEffects 열거형을 참조하세요.
마우스 커서 위치, 키보드 상태 및 마우스 단추 상태의 변경 내용이 추적됩니다.
사용자가 창 밖으로 이동하면 DragLeave 이벤트가 발생합니다.
마우스가 다른 컨트롤에 들어가면 해당 컨트롤의 DragEnter 발생합니다.
마우스가 이동하지만 동일한 컨트롤 내에 있으면 DragOver 이벤트가 발생합니다.
키보드 또는 마우스 단추 상태가 변경되면 QueryContinueDrag 이벤트가 발생하고 끌기를 계속할지, 데이터를 삭제할지, 아니면 이벤트 QueryContinueDragEventArgsAction 속성 값에 따라 작업을 취소할지 결정합니다.
DragAction 값 값이
Continue
경우 작업을 계속하기 위해 DragOver 이벤트가 발생하고 GiveFeedback 이벤트가 새 효과와 함께 발생하므로 적절한 시각적 피드백을 설정할 수 있습니다. 유효한 드롭 효과 목록은 DragDropEffects 열거형을 참조하세요.메모
DragOver 및 GiveFeedback 이벤트는 마우스가 놓기 대상을 가로질러 이동할 때 마우스 위치에 대한 가장 up-to날짜 피드백을 받도록 쌍을 이립니다.
DragAction 값이
Drop
경우 원본 애플리케이션이 원본 데이터에 대해 적절한 작업을 수행할 수 있도록 놓기 효과 값이 원본에 반환됩니다. 예를 들어 작업이 이동인 경우 데이터를 잘라냅니다.DragAction 값이
Cancel
경우 DragLeave 이벤트가 발생합니다.메모
DragEventArgs X 및 Y 속성은 클라이언트 좌표가 아닌 화면 좌표에 있습니다. 다음 C# 코드 줄은 속성을 클라이언트 Point변환합니다.
Point clientPoint = targetControl.PointToClient(new Point(de. X, de. Y));
이벤트 처리에 대한 자세한 내용은 이벤트
적용 대상
추가 정보
.NET