實(shí)現(xiàn)拖放

2017-09-15 14:58:24
黃善超
3524
最后編輯:tmtony8 于 2017-09-15 15:24:52

拖進(jìn)控件

如果主語言支持在OLE控件內(nèi)拖放,ctTree控件只支持施放操作。象VB和Delphi這類語言將自動(dòng)對(duì)一個(gè)OLE控件捆綁DragOver和DragDrop事件。在控件內(nèi)這些事件用于支持拖放。

 

拖放消息必須由主語言提供然后發(fā)送至控件拖放方法。

例如, 開始一個(gè)拖放操作,我們一定首先開始主語言控件提供的拖動(dòng)事件。下例使用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


在這例中,我們把鼠標(biāo)指針的Y坐標(biāo)與當(dāng)前拖動(dòng)狀態(tài)變量發(fā)送給拖動(dòng)方法,這將讓控件在適當(dāng)?shù)墓?jié)點(diǎn)周圍畫拖拽線。我們也能把Y值從點(diǎn)值轉(zhuǎn)為像素值。依靠你的開發(fā)語言,這也許是必需的. ctTree 使用像素決定該如何繪制自身。

 注意:拖動(dòng)方法不需要鼠標(biāo)指標(biāo)的X坐標(biāo),因?yàn)楣?jié)點(diǎn)是水平方式放置的 (一個(gè)在另一個(gè)的頂端)。 因因此項(xiàng)目放入控件與X坐標(biāo)是無關(guān)的,在拖放事件中我們必須截獲消息。例:

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

由這段消息,我們告知控件在某個(gè)Y坐標(biāo)一個(gè)項(xiàng)目拖進(jìn)控件。 當(dāng)我們執(zhí)行它時(shí),控件將觸發(fā)控件自已的DropNode(拖放節(jié)點(diǎn))事件,那兒會(huì)報(bào)告在什么節(jié)點(diǎn)項(xiàng)目被拖入。

 

 注意:在上例的代碼段中,Y坐標(biāo)總是被Screen.TwipsPerPixelY除。這是因?yàn)閂B使用邏輯單元傳遞所有消息,此處控件使用像素作為它的大小單元。大小消息來自諸如高,寬,頂端與左端等。因此, 我們不得不在發(fā)送它至控件前把所有大小消息從邏輯單元轉(zhuǎn)換為像素。在象Delphi這類的語言中,不需要這么做因?yàn)樗材芤韵袼貍鞔笮∠ⅰ⒖贾髡Z言用戶手冊(cè)以決定是否OLE控件支技拖放,并且語言如何傳遞它的大小消息。

 

注意: 在示例或代碼中,在用到"DragDrop" 與 "DragOver"作為保留字的地方,ctDragDrop 和 ctDragOver 方法可以分別代替DragDrop與DragOver。

 

拖出控件

也有可能從控件中拖出列表項(xiàng)。為實(shí)現(xiàn)它,在一個(gè)列表項(xiàng)目上點(diǎn)擊并拖動(dòng), 一旦拖動(dòng)發(fā)生,StartDragOut 事件將會(huì)被觸發(fā)。那時(shí)你就能把控件置于拖動(dòng)模式并開始拖動(dòng)操作。以下VB代碼示范如何處理它:

Private Sub ctTree_StartDragOut()
    ctTree.Drag vbBeginDrag
End Sub

移動(dòng)訪問