以下代码为何不能实现从PICTURE控件通过人工OLE拖放到图形按钮1上呢?
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