Private Sub Form_Load()
'Picture1.OLEDragMode = 0  '手动拖动
'Picture1.OLEDropMode = 0  '不可放下
Command1.OLEDropMode = 1  '手动放下
End Sub
'常用的方法有OLEGrag 方法。
'通过调用OLEGrag 方法来启动手工拖动。
'OLEGrag 方法没有参数,用于启动手工拖动,然后触发OLEstartDrag 事件来设置拖动的条件。
'OLEGrag 方法的调用通常在拖动源的MouseMove事件过程中,当用户选定数据并按住鼠标时就会触发OLEstartDrag 事件。
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture1.OLEDrag '启动手工拖动
End Sub
'(1)OLEStartDrag 事件
'   OLEStartDrag 事件是在拖放源选定数据并按下鼠标键拖动数据时触发的
'语法:
'   Private Sub 对象_OLEStartDrag(Data As DataObject, Allowedeffects As Long)
'其中:
'·Data:      确定拖动源所提供的数据格式以及相应的数据?
'·Allowedeffects :确定允许的放下效果,目标可以通过向拖动源查询此信息来作相应的响应。
'       0(vbDropEffectNone)为不允许放下,
'       1(vbDropEffectcopy)为允许复制,
'       2(vbDropEffectMove )为允许移动。
Private Sub picture1_OLEStartDrag(Data As DataObject, Allowedeffects As Long) '指定拖动效果和数据格式
Allowedeffects = 2 Or 1                 ' 确定放下效果=允许移动、允许复制
Data.SetData , 2                        ' 确定拖动源所提供的数据格式及相应的数据(其中1:代表文本,2代表位图BMP)
End Sub
'(2)OLEDragover 事件
'  OLEDragover 事件是当拖动源在目标上拖动时由目标触发的,在拖放期间OLE拖放自动提供鼠标指针形状。如果想对鼠标指针形状进行控制,在目标的OLEDragover 事件和拖放源的OLEGiveFeedback 事件中编程实现。
'语法:
'    Private Sub 对象_OLEDragover(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
'其中:
'·Data:     含有拖动源提供的数据格式?
'·Effect:通知拖动源目标支持的放下效果。0(vbDropEffectNone)为不支持放下,1(vbDropEffectCopy)为支持复制,2(vbDropEffectMove)为支持移动,&H80000000&(vbDropEffectScroll)为滚动正在或将要发生。
'    ·Button?Shift?X?Y参数与前面介绍的相同?
Private Sub Command1_OLEDragover(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer) '设置放下效果
If Data.GetFormat(vbCFBitmap) Then
   Effect = vbDropEffectCopy And Effect '显示可以放下的图标,是带小加号的那种
Else
   Effect = vbDropEffectNone            '否则显示不可放下的图标,是园圈加斜线那种
End If
End Sub
'(3)OLEGiveFeedback事件
'  当触发目标的OLEDragOver事件时,
'    OLEDrapOver事件的Effect参数通知拖动源支持那种放下操作,然后触发拖动源的OLEGiveFeedback事件。
'语法:
'  Pivate Sub对象OLEGiveFeedback(Effect As Long,Defaultcursors As Boolean)
'其中:
'  ·Effect:指出目标支持的操作类型,与OLEDragOver事件中参数含义相同。
'  ·Defaultcursors:表示是否使用默认的鼠标图标。True则使用,False则不使用鼠标图标而用MousePointer来设定。
Private Sub Picture1_OLEGiveFedback(Effect As Long, DefaultCursors As Boolean) '设置鼠标形状支持哪种放下操作
DefaultCursors = True  '鼠标图标用MousePointer来设定
'Select Case Effect
'     Case 0
'          Screen.MousePoint = 12
'     Case 1
'          Screen.MousePoint = 4
'     Case 2
'          Screen.MousePointer = 4
'     Case Else
'          Default Cursors = True
'End Select
End Sub'(4)OLEDrapDrop事件
'  OLEDragDrop事件是当拖动源放到放下目标时触发的,目标将根据拖动源所含有的数居格式查询拖动源,然后获取数据或拒绝数据。
'语法:
'  Private Sub对象OLEDragDrop(Data As DataObject,Effect As Long,Button As Integer,Shift As Integer, X As Single ,Y As Single)
'其中:
'  Data包含源所提供的数据格式,
'    Effect通知源目标执行的操作类型,
'    Button确定鼠标键为状态,
'    Shift确定是否按下Shift、Ctrl、Alt键。
Private Sub Command1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) '将拖动内容送到Text2
If Data.GetFormat(vbCFBitmap) Then
   Command1.Picture = Data.GetData(vbCFBitmap)    ' 语法  对象.GetData (格式)
   Effect = 1
End If
End Sub
'(5)OLESetData事件
'  当目标用GetData方法从拖动源获取数据,还未加载数据时拖动源触发OLESetData事件。
'语法:
'  Private Sub对象_OLESetData(Data As DataObject,Dataformat As Integer)
Private Sub Command1_OLESetData(Data As DataObject, DataFormat As Integer) '将选定内容传送到DataObject 对象中
'If DataFormat = 2 Then
    Data.SetData Picture1.Picture, 2               ' 语法  对象.SetData [数据] , [格式]
'End If
End Sub
'(6)OLEComplete事件
'  OLEComplete事件是当拖动源放到目标上或取消OLE拖放时触发的,这是拖放操作中的最后一个事件。
'语法:
'    Private Sub对象_MLECompleteDrag([Effect As Long])
Private Sub Picture1_OLECompleteDrag(Effect As Long)
'If Effect = 2 Then
'End If
'Screen.MousePointer = 0
End Sub**********************
运行后显示:
  实时错误‘676’
  所需数据在OLESetData事件过程中未提供给DataObject。
  我已经在事件Command1_OLESetData()中设置了呀!

解决方案 »

  1.   

    我把注释去掉,程序如下:
    Private Sub Form_Load()
    'Picture1.OLEDragMode = 0  '手动拖动
    'Picture1.OLEDropMode = 0  '不可放下
    Command1.OLEDropMode = 1  '手动放下
    End SubPrivate Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Picture1.OLEDrag '启动手工拖动
    End SubPrivate Sub picture1_OLEStartDrag(Data As DataObject, Allowedeffects As Long) '指定拖动效果和数据格
    Allowedeffects = 2 Or 1       ' 确定放下效果=允许移动、允许复制
    Data.SetData , 2              ' 确定拖动源所提供的数据格式及相应的数据(其中1:代表文本,2代表位图BMP)
    End SubPrivate Sub Command1_OLEDragover(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer) '设置放下效果
    If Data.GetFormat(vbCFBitmap) Then
       Effect = vbDropEffectCopy And Effect '显示可以放下的图标,是带小加号的那种
    Else
       Effect = vbDropEffectNone            '否则显示不可放下的图标,是园圈加斜线那种
    End If
    End SubPrivate Sub Picture1_OLEGiveFedback(Effect As Long, DefaultCursors As Boolean) '设置鼠标形状支持哪
    DefaultCursors = True 
    End SubPrivate Sub Command1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) '将拖动内容送到Text2
    If Data.GetFormat(vbCFBitmap) Then
       Command1.Picture = Data.GetData(vbCFBitmap)    ' 语法  对象.GetData (格式)
       Effect = 1
    End If
    End SubPrivate Sub Command1_OLESetData(Data As DataObject, DataFormat As Integer) '将选定内容传送到DataObject 对象中
    'If DataFormat = 2 Then
        Data.SetData Picture1.Picture, 2               ' 语法  对象.SetData [数据] , [格式]
    'End If
    End SubPrivate Sub Picture1_OLECompleteDrag(Effect As Long)
    'If Effect = 2 Then
    'End If
    'Screen.MousePointer = 0
    End Sub**********************
    运行后显示:
      实时错误‘676’
      所需数据在OLESetData事件过程中未提供给DataObject。
      我已经在事件Command1_OLESetData()中设置了呀!
      

  2.   

    Private Sub picture1_OLEStartDrag(Data As DataObject, Allowedeffects As Long)                 '指定拖动效果和数据格式
    Allowedeffects = 2 Or 1                                           '   确定放下效果=允许移动、允许复制
    Data.SetData Picture1.Picture, 2          '此条有修改                                            '   确定拖动源所提供的数据格式及相应的数据(其中1:代表文本,2代表位图BMP)
    End Sub
      

  3.   

    当然 command1的style要设为高级的哪种
      

  4.   

    谢谢,将事件修改后,就可以了。但是,目前我的鼠标形状不对,我想实现:
         按住PICTURE在拖放过程中一直显示“不可放下的图标,是园圈加斜线那种”
    进入COMMAND后,“'显示可以放下的图标,是带小加号的那种”。松开鼠标后
    “显示系统默认图标”。
      请问如何实现。
      

  5.   

    Option Explicit
    Dim Flag As BooleanPrivate Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Flag Then Me.MousePointer = 0: Flag = FalseEnd SubPrivate Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Me.MousePointer = 0
    End SubPrivate Sub Form_Load()
    'Picture1.OLEDragMode   =   0     '手动拖动
    'Picture1.OLEDropMode   =   0     '不可放下
    Command1.OLEDropMode = 1         '手动放下
    End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Flag = True
    End SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Flag Then Me.MousePointer = 12
    End Sub'常用的方法有OLEGrag   方法。
    '通过调用OLEGrag   方法来启动手工拖动。
    'OLEGrag   方法没有参数,用于启动手工拖动,然后触发OLEstartDrag   事件来设置拖动的条件。
    'OLEGrag   方法的调用通常在拖动源的MouseMove事件过程中,当用户选定数据并按住鼠标时就会触发OLEstartDrag   事件。
    Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Picture1.OLEDrag   '启动手工拖动
    End Sub
    '(1)OLEStartDrag   事件
    '       OLEStartDrag   事件是在拖放源选定数据并按下鼠标键拖动数据时触发的
    '语法:
    '       Private   Sub   对象_OLEStartDrag(Data   As   DataObject,   Allowedeffects   As   Long)
    '其中:
    '·Data:             确定拖动源所提供的数据格式以及相应的数据?
    '·Allowedeffects   :确定允许的放下效果,目标可以通过向拖动源查询此信息来作相应的响应。
    '               0(vbDropEffectNone)为不允许放下,
    '               1(vbDropEffectcopy)为允许复制,
    '               2(vbDropEffectMove   )为允许移动。
    Private Sub picture1_OLEStartDrag(Data As DataObject, Allowedeffects As Long)                 '指定拖动效果和数据格式
    Allowedeffects = 2 Or 1                                           '   确定放下效果=允许移动、允许复制
    Data.SetData Picture1.Picture, 2                                                      '   确定拖动源所提供的数据格式及相应的数据(其中1:代表文本,2代表位图BMP)
    End Sub
    '(2)OLEDragover   事件
    '  OLEDragover   事件是当拖动源在目标上拖动时由目标触发的,在拖放期间OLE拖放自动提供鼠标指针形状。如果想对鼠标指针形状进行控制,在目标的OLEDragover   事件和拖放源的OLEGiveFeedback   事件中编程实现。
    '语法:
    '         Private   Sub   对象_OLEDragover(Data   As   DataObject,   Effect   As   Long,   Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single,   State   As   Integer)
    '其中:
    '·Data:           含有拖动源提供的数据格式?
    '·Effect:通知拖动源目标支持的放下效果。0(vbDropEffectNone)为不支持放下,1(vbDropEffectCopy)为支持复制,2(vbDropEffectMove)为支持移动,&H80000000&(vbDropEffectScroll)为滚动正在或将要发生。
    '         ·Button?Shift?X?Y参数与前面介绍的相同?
    Private Sub Command1_OLEDragover(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)                                               '设置放下效果
    If Data.GetFormat(vbCFBitmap) Then
          Effect = vbDropEffectCopy And Effect           '显示可以放下的图标,是带小加号的那种
    Else
          Effect = vbDropEffectNone                             '否则显示不可放下的图标,是园圈加斜线那种
    End If
    End Sub
    '(3)OLEGiveFeedback事件
    '  当触发目标的OLEDragOver事件时,
    '         OLEDrapOver事件的Effect参数通知拖动源支持那种放下操作,然后触发拖动源的OLEGiveFeedback事件。
    '语法:
    '  Pivate   Sub对象OLEGiveFeedback(Effect   As   Long,Defaultcursors   As   Boolean)
    '其中:
    '  ·Effect:指出目标支持的操作类型,与OLEDragOver事件中参数含义相同。
    '  ·Defaultcursors:表示是否使用默认的鼠标图标。True则使用,False则不使用鼠标图标而用MousePointer来设定。
    Private Sub Picture1_OLEGiveFedback(Effect As Long, DefaultCursors As Boolean)                 '设置鼠标形状支持哪种放下操作
    DefaultCursors = True         '鼠标图标用MousePointer来设定
    'Select   Case   Effect
    '           Case   0
    '                     Screen.MousePoint   =   12
    '           Case   1
    '                     Screen.MousePoint   =   4
    '           Case   2
    '                     Screen.MousePointer   =   4
    '           Case   Else
    '                     Default   Cursors   =   True
    'End   Select
    End Sub'(4)OLEDrapDrop事件
    '  OLEDragDrop事件是当拖动源放到放下目标时触发的,目标将根据拖动源所含有的数居格式查询拖动源,然后获取数据或拒绝数据。
    '语法:
    '  Private   Sub对象OLEDragDrop(Data   As   DataObject,Effect   As   Long,Button   As   Integer,Shift   As   Integer,   X   As   Single   ,Y   As   Single)
    '其中:
    '  Data包含源所提供的数据格式,
    '         Effect通知源目标执行的操作类型,
    '         Button确定鼠标键为状态,
    '         Shift确定是否按下Shift、Ctrl、Alt键。
    Private Sub Command1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)                                         '将拖动内容送到Text2
    If Data.GetFormat(vbCFBitmap) Then
          Command1.Picture = Data.GetData(vbCFBitmap)             '   语法     对象.GetData   (格式)
          Effect = 1
    End If
    End Sub
    '(5)OLESetData事件
    '  当目标用GetData方法从拖动源获取数据,还未加载数据时拖动源触发OLESetData事件。
    '语法:
    '  Private   Sub对象_OLESetData(Data   As   DataObject,Dataformat   As   Integer)
    Private Sub Command1_OLESetData(Data As DataObject, DataFormat As Integer)                 '将选定内容传送到DataObject   对象中
    'If   DataFormat   =   2   Then
            Data.SetData Picture1.Picture, 2                                   '   语法     对象.SetData   [数据]   ,   [格式]
    'End   If
    End Sub
    '(6)OLEComplete事件
    '  OLEComplete事件是当拖动源放到目标上或取消OLE拖放时触发的,这是拖放操作中的最后一个事件。
    '语法:
    '         Private   Sub对象_MLECompleteDrag([Effect   As   Long])
    Private Sub Picture1_OLECompleteDrag(Effect As Long)
    'If   Effect   =   2   Then
    'End   If
    'Screen.MousePointer   =   0
    End Sub