实现拖放

2017-09-15 14:58:24
黄善超
3063
最后编辑:tmtony8 于 2017-09-15 15:24:52

拖进控件

如果主语言支持在OLE控件内拖放,ctTree控件只支持施放操作。象VB和Delphi这类语言将自动对一个OLE控件捆绑DragOver和DragDrop事件。在控件内这些事件用于支持拖放。

 

拖放消息必须由主语言提供然后发送至控件拖放方法。

例如, 开始一个拖放操作,我们一定首先开始主语言控件提供的拖动事件。下例使用VB作为主语言。

Private Sub ctTree1_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
    ctTree1.DragOver (Y / Screen.TwipsPerPixelY), State
End Sub


在这例中,我们把鼠标指针的Y坐标与当前拖动状态变量发送给拖动方法,这将让控件在适当的节点周围画拖拽线。我们也能把Y值从点值转为像素值。依靠你的开发语言,这也许是必需的. ctTree 使用像素决定该如何绘制自身。

 注意:拖动方法不需要鼠标指标的X坐标,因为节点是水平方式放置的 (一个在另一个的顶端)。 因因此项目放入控件与X坐标是无关的,在拖放事件中我们必须截获消息。例:

Private Sub ctTree1_DragDrop(Source As Control, X As Single, Y As Single)
    ctTree1.DragDrop (Y / Screen.TwipsPerPixelY)
End Sub

由这段消息,我们告知控件在某个Y坐标一个项目拖进控件。 当我们执行它时,控件将触发控件自已的DropNode(拖放节点)事件,那儿会报告在什么节点项目被拖入。

 

 注意:在上例的代码段中,Y坐标总是被Screen.TwipsPerPixelY除。这是因为VB使用逻辑单元传递所有消息,此处控件使用像素作为它的大小单元。大小消息来自诸如高,宽,顶端与左端等。因此, 我们不得不在发送它至控件前把所有大小消息从逻辑单元转换为像素。在象Delphi这类的语言中,不需要这么做因为它也能以像素传大小消息。参考主语言用户手册以决定是否OLE控件支技拖放,并且语言如何传递它的大小消息。

 

注意: 在示例或代码中,在用到"DragDrop" 与 "DragOver"作为保留字的地方,ctDragDrop 和 ctDragOver 方法可以分别代替DragDrop与DragOver。

 

拖出控件

也有可能从控件中拖出列表项。为实现它,在一个列表项目上点击并拖动, 一旦拖动发生,StartDragOut 事件将会被触发。那时你就能把控件置于拖动模式并开始拖动操作。以下VB代码示范如何处理它:

Private Sub ctTree_StartDragOut()
    ctTree.Drag vbBeginDrag
End Sub