Visual Basic Tips


ドラッグドロップ


ドラッグモードに移行するには「自動」と「手動」の二つがあり、「自動」はコントロールを掴むと勝手にドラッグに移行してくれます。対して「手動」ではコードを記述しないと移行してくれません。
「手動」の場合、ドラッグ移行のコードをMouseDownイベントに記述するか、MouseMoveに記述するかは意見の分かれる所かと思いますがMouseDownイベントに他の処理が追加される場合の事を考えてMouseMoveイベントの方がいいのではと思います。

下記のサンプルコードは、左のテキストボックスをドラッグし、ラベルの上を通り、右のテキストボックズでドロップすると、ラベルに現在発生しているイベント+ドラッグしたテキストボックスのテキスト(Textプロパティ)+x座標+y座標+ステータス(後述)が表示されます。右のテキストボックスも現在のイベント+ドラッグしたテキストボックスのテキストが表示されます。
 ステータスですが、ドラッグされたコントロールがターゲット上に来た時0、ターゲットの上を移動中の場合1、ターゲットの範囲から外れた場合2、となります。


Private Sub Form_Load()
  TxtDragAuto.DragMode = vbAutomatic
  TxtDragManual.DragMode = vbManual
'デフォルトでは「マニュアル」なので本来は必要ありません。
  TxtDragAuto.DragIcon = LoadPicture(App.Path & "\Drag.ico")
'プロパティに設定しておけばここでアイコンを設定しなくても構いません
  TxtDragManual.DragIcon = LoadPicture(App.Path & "\Drag.ico")
'プロパティに設定しておけばここでアイコンを設定しなくても構いません
End Sub

Private Sub LblDragOverAuto_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
  LblDragOverAuto.Caption = "[DragOver] " & Source.Text & " x = " & X & " y = " & Y & " State = " & DragOverState(State)
End Sub

Private Sub LblDragOverManual_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
  LblDragOverManual.Caption = "[DragOver] " & Source.Text & " x = " & X & " y = " & Y & " State = " & DragOverState(State)
End Sub

Private Sub TxtDragManual_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  
If Button = vbLeftButton Then 'マウスの左ボタン押下
    TxtDragManual.Drag vbBeginDrag
  
End If
End Sub

Private Sub TxtDropAuto_DragDrop(Source As Control, X As Single, Y As Single)
  TxtDropAuto.Text = "[Drop] " & Source.Text
End Sub

Private Sub TxtDropAuto_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
  TxtDropAuto.Text = "[DragOver] " & Source.Text
End Sub

Private Sub TxtDropManual_DragDrop(Source As Control, X As Single, Y As Single)
  TxtDropManual.Text = "[Drop] " & Source.Text
End Sub

Private Sub TxtDropManual_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
  TxtDropManual.Text = "[DragOver] " & Source.Text
End Sub

Function DragOverState(State As Integer)
  
Dim str As String

  
Select Case State
    
Case 0: str = "In"
    
Case 1: str = "Out"
    
Case 2: str = "Move"
    
Case Else: str = ""
  
End Select
  DragOverState = str
End Function


DownLoad vbtips032.lzh 3KB (VB6.0)