實現拖放

2017-09-15 14:58:24
黃善超
498
最後編輯: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