《 ドラッグ&ドロップ処理例 》 ※異なるフォーム間もOK

ドラッグ&ドロップ処理では、3つのマウスイベントを利用します。
ドラッグ開始時は、開始されたコントロールに「MouseDown」イベントが発生
ドロップ時は、開始されたコントロールに「MouseUp」イベントが発生します。
ここで注意。マウスが放された時、マウスポインタが開始したコントロール上になくても
開始コントロールにMouseUpイベントが発生するということです。
したがって、ドロップ処理をする唯一のイベントは、MouseMoveしかありません。
マウスが開放された時、必ず「MouseUp」⇒「MouseMove」と連続してイベントが発生することをうまく利用します。

==============================================================================
’どのフォーム間もドラッグ&ドロップ出来るように標準モジュールへパブリック変数を用意

Public DDBUF1 'コピーバッファ
Public DDBUF2 'コピーバッファ
Public DDBUF3 'コピーバッファ
Public DDSTATUS 'マウスの状態フラグ 0…何もしない 1…ドロップ処理をさせる
Public DDCONTROL '開始コントロールの名前保存(自分自身へのDDをさせないため)

==============================================================================
'@マウスボタンクリック時(ドラッグ開始場所の情報をコピーバッファ変数に格納)

Private Sub B1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    DDCONTROL = Me.Name & "/" & Me.ActiveControl.Name 'フォーム名と自分自身のコントロール名を保存
    DDBUF1 =  'コピー情報
    DDBUF2 =  'コピー情報
    DDBUF3 =  'コピー情報
                    '      :
End Sub

==============================================================================
'Aマウスボタン開放時(ボタン開放時はフラグを立てるだけ)

Private Sub B1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    DDSTATUS= 1
End Sub

==============================================================================
'Bマウスボタン移動時(ボタン開放のフラグがある場合、ドロップ処理をする)

Private Sub B2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If DDSTATUS<> 1 Then Exit Sub Else DDSTATUS= 0
    If DDCONTROL = Me.Name & "/" & Me.ActiveControl.Name Then Exit Sub '自分自身へのDDなら処理しない
    ’【ドロップ処理】
    ’    :
    ’    :
    ’    :
End Sub

==============================================================================
'C詳細エリア等マウスボタン移動時(無関係な場所で開放されたらDDをキャンセルさせるため)

Private Sub 詳細_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    DDSTATUS= 0
End Sub

==============================================================================