實現拖放

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

北京十一选五基本走势