如果想要指定所支持的是哪種數(shù)據(jù)格式或拖放效果(復(fù)制、移動(dòng)或不放),或者,如果想從中拖出數(shù)據(jù)來(lái)的控件不支持自動(dòng)拖動(dòng),則需使用手工的 OLE 拖動(dòng)操作。
手工拖放操作的第一階段是調(diào)用 OLEDrag 方法,設(shè)置允許的拖放效果,指定支持的數(shù)據(jù)格式,以及有選擇地將數(shù)據(jù)放到 DataObject 對(duì)象中。
使用 OLEDrag 方法手工啟動(dòng)拖動(dòng)操作,并使用 OLEStartDrag 事件指定允許的拖放操作效果及所支持的數(shù)據(jù)格式。
OLEDrag 方法
一般來(lái)說(shuō),在選定數(shù)據(jù)后,按住鼠標(biāo)左按鈕并移動(dòng)鼠標(biāo)時(shí),從對(duì)象的 MouseMove 事件調(diào)用 OLEDrag 方法。
OLEDrag 方法未提供任何參數(shù)。其主要目的是啟動(dòng)手工拖動(dòng),然后允許 OLEStartDrag 事件設(shè)置拖動(dòng)操作的條件(例如,指定在將數(shù)據(jù)拖動(dòng)到另一個(gè)控件時(shí)發(fā)生的事情)。
如果源控件支持 OLEDragMode 屬性,則為了手工控制拖動(dòng)操作,必須將此屬性設(shè)置為“手工”并在控件處使用 OLEDrag 方法。如果控件支持手工 OLE 拖動(dòng)而不支持自動(dòng) OLE 拖動(dòng),則其不具有 OLEDragMode 屬性,但支持 OLEDrag 方法和 OLE 拖放事件。
注意 如果將源控件 OLEDragMode 屬性設(shè)置為“自動(dòng)化”,則 OLEDrag 方法仍有效。
指定拖放效果和數(shù)據(jù)格式
在手工 OLE 拖動(dòng)操作中,當(dāng)用戶開(kāi)始拖動(dòng)源并調(diào)用 OLEDrag 方法時(shí),控件的 OLEStartDrag 事件將會(huì)發(fā)生。用此事件指定拖放效果和源所支持的數(shù)據(jù)格式。
OLEStartDrag 事件用兩個(gè)參數(shù)指定支持的數(shù)據(jù)格式,和放下數(shù)據(jù)時(shí)指定是復(fù)制數(shù)據(jù)還是移動(dòng)數(shù)據(jù)(放下效果)。
注意 若未在 OLEStartDrag 事件中指定放下效果和數(shù)據(jù)格式,則將不啟動(dòng)手工拖動(dòng)。
AllowedEffects 參數(shù)
allowedeffects 參數(shù)指定拖動(dòng)源所支持的拖放效果。例如:
Private Sub txtSource_OLEStartDrag(Data As _ VB.DataObject, AllowedEffects As Long) AllowedEffects = vbDropEffectMove Or _ vbDropEffectCopyEnd Sub
然后,目標(biāo)可向拖動(dòng)源查詢此信息并作相應(yīng)的響應(yīng)。
allowedeffects 參數(shù)使用下述數(shù)值指定放下效果:
常數(shù)值描述
VbDropEffectNone0放下目標(biāo)無(wú)法接受數(shù)據(jù)。
VbDropEffectCopy1放下的結(jié)果為復(fù)制。拖動(dòng)源未改變?cè)紨?shù)據(jù)。
VbDropEffectMove2拖動(dòng)源刪除了數(shù)據(jù)。
Format 參數(shù)
可通過(guò)設(shè)置 OLEStartDrag 事件的format 參數(shù)指定對(duì)象支持的數(shù)據(jù)格式。為此應(yīng)使用 SetData 方法。例如,用豐富文本框控件作源,并用文本框控件作目標(biāo),就可指定下述支持格式:
Private Sub rtbSource_OLEStartDrag(Data As _ VB.DataObject, AllowedEffects As Long) AllowedEffects = vbDropEffectMove Or _ vbDropEffectCopy Data.SetData , vbCFText Data.SetData , vbCFRTFEnd Sub
目標(biāo)可查詢?cè)矗瑥亩膳袛嘀С趾畏N數(shù)據(jù)格式并作出相應(yīng)的響應(yīng)─ 舉例來(lái)說(shuō),若目標(biāo)不支持所放下數(shù)據(jù)的格式,它就會(huì)拒絕放下的數(shù)據(jù)。在這種情況下,只有源所支持的數(shù)據(jù)格式才是文本格式與豐富文本格式。
詳細(xì)信息 關(guān)于 SetData 方法的格式值的詳細(xì)信息,請(qǐng)參閱“OLE 拖放 DataObject 對(duì)象”。
將數(shù)據(jù)放到 DataObject 對(duì)象中
在多數(shù)情況下,特別是在源支持兩種以上的格式或花費(fèi)大量時(shí)間創(chuàng)建數(shù)據(jù)時(shí),可能會(huì)希望只在目標(biāo)請(qǐng)求數(shù)據(jù)時(shí)再將數(shù)據(jù)放入 DataObject 對(duì)象。但是,可在開(kāi)始拖動(dòng)操作時(shí)使用 OLEStartDrag 事件中的 SetData 方法將數(shù)據(jù)放入 DataObject 對(duì)象。例如:
Private Sub txtSource_OLEStartDrag(Data As _ VB.DataObject, AllowedEffects As Long) Data.Clear Data.SetData txtSource.SelText, vbCFTextEnd Sub
此例用 Clear 方法清除 DataObject 對(duì)象中的缺省數(shù)據(jù)格式,并指定所選定數(shù)據(jù)的數(shù)據(jù)格式(文本),然后又用 SetData 方法將數(shù)據(jù)放入 DataObject 對(duì)象。
手工拖放操作的第一階段是調(diào)用 OLEDrag 方法,設(shè)置允許的拖放效果,指定支持的數(shù)據(jù)格式,以及有選擇地將數(shù)據(jù)放到 DataObject 對(duì)象中。
使用 OLEDrag 方法手工啟動(dòng)拖動(dòng)操作,并使用 OLEStartDrag 事件指定允許的拖放操作效果及所支持的數(shù)據(jù)格式。
OLEDrag 方法
一般來(lái)說(shuō),在選定數(shù)據(jù)后,按住鼠標(biāo)左按鈕并移動(dòng)鼠標(biāo)時(shí),從對(duì)象的 MouseMove 事件調(diào)用 OLEDrag 方法。
OLEDrag 方法未提供任何參數(shù)。其主要目的是啟動(dòng)手工拖動(dòng),然后允許 OLEStartDrag 事件設(shè)置拖動(dòng)操作的條件(例如,指定在將數(shù)據(jù)拖動(dòng)到另一個(gè)控件時(shí)發(fā)生的事情)。
如果源控件支持 OLEDragMode 屬性,則為了手工控制拖動(dòng)操作,必須將此屬性設(shè)置為“手工”并在控件處使用 OLEDrag 方法。如果控件支持手工 OLE 拖動(dòng)而不支持自動(dòng) OLE 拖動(dòng),則其不具有 OLEDragMode 屬性,但支持 OLEDrag 方法和 OLE 拖放事件。
注意 如果將源控件 OLEDragMode 屬性設(shè)置為“自動(dòng)化”,則 OLEDrag 方法仍有效。
指定拖放效果和數(shù)據(jù)格式
在手工 OLE 拖動(dòng)操作中,當(dāng)用戶開(kāi)始拖動(dòng)源并調(diào)用 OLEDrag 方法時(shí),控件的 OLEStartDrag 事件將會(huì)發(fā)生。用此事件指定拖放效果和源所支持的數(shù)據(jù)格式。
OLEStartDrag 事件用兩個(gè)參數(shù)指定支持的數(shù)據(jù)格式,和放下數(shù)據(jù)時(shí)指定是復(fù)制數(shù)據(jù)還是移動(dòng)數(shù)據(jù)(放下效果)。
注意 若未在 OLEStartDrag 事件中指定放下效果和數(shù)據(jù)格式,則將不啟動(dòng)手工拖動(dòng)。
AllowedEffects 參數(shù)
allowedeffects 參數(shù)指定拖動(dòng)源所支持的拖放效果。例如:
Private Sub txtSource_OLEStartDrag(Data As _ VB.DataObject, AllowedEffects As Long) AllowedEffects = vbDropEffectMove Or _ vbDropEffectCopyEnd Sub
然后,目標(biāo)可向拖動(dòng)源查詢此信息并作相應(yīng)的響應(yīng)。
allowedeffects 參數(shù)使用下述數(shù)值指定放下效果:
常數(shù)值描述
VbDropEffectNone0放下目標(biāo)無(wú)法接受數(shù)據(jù)。
VbDropEffectCopy1放下的結(jié)果為復(fù)制。拖動(dòng)源未改變?cè)紨?shù)據(jù)。
VbDropEffectMove2拖動(dòng)源刪除了數(shù)據(jù)。
Format 參數(shù)
可通過(guò)設(shè)置 OLEStartDrag 事件的format 參數(shù)指定對(duì)象支持的數(shù)據(jù)格式。為此應(yīng)使用 SetData 方法。例如,用豐富文本框控件作源,并用文本框控件作目標(biāo),就可指定下述支持格式:
Private Sub rtbSource_OLEStartDrag(Data As _ VB.DataObject, AllowedEffects As Long) AllowedEffects = vbDropEffectMove Or _ vbDropEffectCopy Data.SetData , vbCFText Data.SetData , vbCFRTFEnd Sub
目標(biāo)可查詢?cè)矗瑥亩膳袛嘀С趾畏N數(shù)據(jù)格式并作出相應(yīng)的響應(yīng)─ 舉例來(lái)說(shuō),若目標(biāo)不支持所放下數(shù)據(jù)的格式,它就會(huì)拒絕放下的數(shù)據(jù)。在這種情況下,只有源所支持的數(shù)據(jù)格式才是文本格式與豐富文本格式。
詳細(xì)信息 關(guān)于 SetData 方法的格式值的詳細(xì)信息,請(qǐng)參閱“OLE 拖放 DataObject 對(duì)象”。
將數(shù)據(jù)放到 DataObject 對(duì)象中
在多數(shù)情況下,特別是在源支持兩種以上的格式或花費(fèi)大量時(shí)間創(chuàng)建數(shù)據(jù)時(shí),可能會(huì)希望只在目標(biāo)請(qǐng)求數(shù)據(jù)時(shí)再將數(shù)據(jù)放入 DataObject 對(duì)象。但是,可在開(kāi)始拖動(dòng)操作時(shí)使用 OLEStartDrag 事件中的 SetData 方法將數(shù)據(jù)放入 DataObject 對(duì)象。例如:
Private Sub txtSource_OLEStartDrag(Data As _ VB.DataObject, AllowedEffects As Long) Data.Clear Data.SetData txtSource.SelText, vbCFTextEnd Sub
此例用 Clear 方法清除 DataObject 對(duì)象中的缺省數(shù)據(jù)格式,并指定所選定數(shù)據(jù)的數(shù)據(jù)格式(文本),然后又用 SetData 方法將數(shù)據(jù)放入 DataObject 對(duì)象。

