vcl中dragdrop功能的底層實(shí)現(xiàn)_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、VCL中Drag功能的底層實(shí)現(xiàn)前段時(shí)間在論壇里看了一篇關(guān)于剖析VCL結(jié)構(gòu)的文件,其中不少高手的開懷暢談讓小輩們心里感覺非常的痛快!看完余又覺得不能光看,也該將自己的心得拿出來與大家分享,于是就邊夜翻看VCL源碼,終于將VCL如何實(shí)現(xiàn)Drag功能的過程弄個(gè)“基本明白”,其中可能會(huì)有不當(dāng)之處,再加上小弟的文學(xué)水平也只是初中畢業(yè),有些地方也許會(huì)表達(dá)不當(dāng),但其意思也基本上八九不離十了,故也請(qǐng)大家開懷暢言、批評(píng)指正,都是為了進(jìn)步嘛!哈哈……雖然D

2、ragDock操作與Drag操作是密切相關(guān),并且很大一部分操作是相同的,但本文暫且不討論與DragDock有關(guān)的部分,留待下回分解或也給大家表現(xiàn)表現(xiàn)………………一、與Drag操作相關(guān)的屬性、事件、函數(shù)VCL的Drag功能是在TControl類中現(xiàn)的,因此所有從TControl類派生出來的控件類者繼承了這些屬性、事件和函數(shù),包括:屬性:DragCurs:Drag時(shí)的鼠標(biāo)類型:(TCurs)DragKind:Drag的類型:(dkDragd

3、kDock)DragMode:Drag的方式:手動(dòng)(dmManual)或自動(dòng)(dmAutomatic)事件:OnStartDrag:Drag開始事件;OnDragOver:Drag經(jīng)過某個(gè)控件;OnDrag:Drag到某個(gè)控件并放開;OnEndDrag:Drag動(dòng)作結(jié)束;函數(shù):BeginDrag:開始控件的Drag動(dòng)作;Dragging:返回控件是否正被Dragging;CancelDrag:取消正在執(zhí)行的Drag操作;EndDrag:

4、結(jié)束正在執(zhí)行的Drag操作,與CancelDrag不同,EndDrag允許操作指定是否產(chǎn)生操作(由參數(shù)決定)。此外還有一些與Drag相關(guān)的函數(shù),在隨后的介紹中將逐一說明。二、Drag操作產(chǎn)生與執(zhí)行的過程1、自動(dòng)產(chǎn)生過程。我們知道在控件上單擊鼠標(biāo)左鍵時(shí)便會(huì)產(chǎn)生WM_LBUTTONDOWN消息,TControl類的WinProc消息處理方法捕捉到該消息時(shí),便判斷控件的DragMode是否為dmAutomatic,即是否自動(dòng)執(zhí)行Drag操作,

5、如果是則調(diào)用類保護(hù)函數(shù)BeginAutoDrag,立即進(jìn)入分析前請(qǐng)先留意在Controls單元中聲明的幾個(gè)全局變量:varDragControl:TControl被Drag的控件DragObject:TDragObject管理整個(gè)Drag過程的TDragObject對(duì)象DragInternalObject:BooleanTDragObject對(duì)象是否由內(nèi)部創(chuàng)建DragCapture:HWND管理Drag過程的Wnd實(shí)例句柄DragSta

6、rtPos:TPointDrag開始時(shí)的鼠標(biāo)位置DragSaveCurs:HCURSDrag開始的的鼠標(biāo)類型DragThreshold:IntegerDrag操作延遲位置ActiveDrag:TDragOperation正在執(zhí)行的Drag操作:(dopNonedopDragdopDock)DragImageList:TDragImageListDrag過程中代替鼠標(biāo)顯示的圖像列表BeginDrag的函數(shù)原型聲明為:procedureBe

7、ginDrag(Immediate:BooleanThreshold:Integer=1)參數(shù):Immediate:是否直接進(jìn)入Drag狀態(tài);Threshold:若Immediate參數(shù)為False,當(dāng)鼠標(biāo)移動(dòng)量超過Threshold給出的值時(shí)進(jìn)入Drag狀態(tài);且先看其實(shí)現(xiàn)代碼:procedureTControl.BeginDrag(Immediate:BooleanThreshold:Integer)varP:TPointbeginD

8、rag操作的對(duì)象不允許是窗體if(SelfisTCustomFm)(FDragKinddkDock)thenraiseEInvalidOperation.CreateRes(@SCannotDragFm)前面提過暫且不討論DragDock相關(guān)部分,所以對(duì)CalcDockSizes的函數(shù)調(diào)用不作分析。CalcDockSizesDragControl不為nil或Pointer($FFFFFFFF)說明已經(jīng)進(jìn)入了Drag狀態(tài)這里的判斷避免了遞

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論