1. 程式人生 > >C++ Builder 實現控制元件拖放操作

C++ Builder 實現控制元件拖放操作

5.1 實現控制元件拖放操作
拖放是使用者操縱物件的常用的方法。使用者可拖動整個控制元件,或將某一個控制元件(如列表框或樹狀檢視)中的項拖動到另一個控制元件中。
· 開始拖動操作。
· 接受被拖動的項。
· 放下項。
· 終止拖動操作。
· 通過拖動物件定製拖放操作。
· 改變拖動滑鼠指標。

5.1.1開始拖動操作
每個控制元件都有DragMode屬性用以確定如何初始化。若DragMode值為dmAutomatic,那麼當用戶將游標置於控制元件上並按下滑鼠鍵時拖動操 作自動開始。因為dmAutomatic可能會影響通常的滑鼠活動,所以可把DragMode設為dmManual(預設值),通過處理滑鼠按下事件開始 拖動操作。

為手動開始控制元件拖動操作,可呼叫該控制元件 BeginDrag方法。BeginDrag需要一個布林型引數Immediate。若其為true,拖動操作立即開始;若其為false,則拖動操作在 使用者將滑鼠拖動一段短距離之前不會開始。呼叫BeginDrag(false)允許控制元件接受滑鼠單擊而不開始拖動操作。

可設定其他狀態時開始控制元件拖動操作,如在呼叫BeginDrag方法之前通過檢查其引數確定使用者按下的是哪一個滑鼠鍵。例如,下列程式碼通過將拖動操作初始化為只當滑鼠左鍵被按下時才開始在處理檔案列表框的滑鼠按下事件。



5.1.2接受拖動項
當用戶拖動某項經過一個控制元件上方時,該控制元件收到OnDragOver事件,這時必須指示出,若使用者將拖動項放在此處,控制元件是否能接受拖動項。拖動游標的更 改指示出控制元件是否能接受該拖動項。為接受經過控制元件上方的拖動項,應為控制元件的OnDragOver事件編寫事件處理程式。
drag-over事件有一引數Accept,若需接受拖動項,可在事件處理程式中將其設為true。若Accept為true,應用程式將向控制元件傳送一 個drag-drop事件。drag-over事件還有其他的引數,包括拖動項的源及滑鼠游標的當前位置,這些引數也可供事件處理程式確定是否接受放下操 作。下例中,一個目錄樹檢視只當拖動項來自檔案列表框時才接受它們。


5.1.3放下項
若一個控制元件指示它能接受拖動項,它也應處理要被放下的項。為處理被放下的項,可為接受放下操作的控制元件的OnDragDrop事件編寫事件處理程式。與 drag-over事件相似,drag-drop事件指示拖動項的源及在接受控制元件上方的滑鼠游標的座標。後者允許監視項被拖動的路徑;例如,可使用這個信 息來改變有其他控制元件經過的元件的顏色。

下例中,一目錄樹檢視接受來自檔案列表框的拖動項,對應於移動檔案到某個目錄中並放下檔案。


5.1.4 終止拖動操作
當拖動項被成功地放下或在不能接受它的控制元件上方被釋放時,拖動操作結束。此時end-drag事件被髮給拖動項的源控制元件。為使源控制元件響應拖動結束,應為控制元件的OnEndDrag事件編寫事件處理程式。
OnEndDrag事件中最重要的引數是Target,它指出哪一個控制元件(若存在)接受了放下操作。若
Target為null,則意味著沒有控制元件接受拖動項。OnEndDrag事件還包含接受控制元件的座標。在下例中,檔案列表框通過重新整理其檔案列表處理end-drag事件。
點選放大

5.1.5通過拖動物件定製拖放操作

可 用TDragObject的派生類來定製物件的拖放操作。標準的drag-over和drag-drop事件指出拖動項的源及接受控制元件上方滑鼠游標的坐 標。要得到附加的狀態資訊,可從TDragObject派生一個定製的拖動物件並覆蓋其虛擬方法。可在OnStartDrag事件中建立這個定製物件。
通常,drag-over和drag-drop事件中的源引數是指拖動操作開始的控制元件。若不同型別的控制元件需開始相同的資料的拖動操作,則源需要支援各類控 件。當使用TDragObject的派生物件時,源即是拖動物件本身;若每個控制元件都在其OnStartDrag事件中建立相同型別的拖動物件,則目標只需 處理一種型別的物件。
drag-over和drag-drop事件能通過呼叫IsDragObject函式得知源是拖動物件還是控制元件。拖動物件可使你在應用程式主EXE檔案實現的窗體和DLL實現的窗體之間拖動項,或在不同的DLL實現的窗體之間拖動項。

5.1.6 改變拖動滑鼠指標

通過設定源元件的DragCursor屬性可定製拖動操作期間滑鼠指標的外觀。