欢迎来到天天文库
浏览记录
ID:11386325
大小:54.50 KB
页数:14页
时间:2018-07-11
《vcl中dragdrop功能的底层实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、VCL中DragDrop功能的底层实现前段时间在论坛里看了一篇关于剖析VCL结构的文件,其中不少高手的开怀畅谈让小辈们心里感觉非常的痛快!看完余又觉得不能光看,也该将自己的心得拿出来与大家分享,于是就边夜翻看VCL源码,终于将VCL如何实现DragDrop功能的过程弄个“基本明白”,其中可能会有不当之处,再加上小弟的文学水平也只是初中毕业,有些地方也许会表达不当,但其意思也基本上八九不离十了,故也请大家开怀畅言、批评指正,都是为了进步嘛!哈哈…… 虽然DragDock操作与DragDrop操作是密切相关,并且很大一部分操作是相同的,
2、但本文暂且不讨论与DragDock有关的部分,留待下回分解或也给大家表现表现……………… 一、与DragDrop操作相关的属性、事件、函数 VCL的DragDrop功能是在TControl类中现的,因此所有从TControl类派生出来的控件类者继承了这些属性、事件和函数,包括: 属性:DragCursor:Drag时的鼠标类型:(TCursor); DragKind: Drag的类型:(dkDrag,dkDock); DragMode: Drag的方式:手动(dmManual)或自动(dmAutomatic);
3、 事件:OnStartDrag:Drag开始事件; OnDragOver:Drag经过某个控件; OnDragDrop:Drag到某个控件并放开; OnEndDrag: Drag动作结束; 函数:BeginDrag: 开始控件的Drag动作; Dragging: 返回控件是否正被Dragging; CancelDrag: 取消正在执行的Drag操作; EndDrag: 结束正在执行的Drag操作,与CancelDrag不同,EndDrag允许操作指定是否产生Drop操作(由Dr
4、op参数决定)。 此外还有一些与DragDrop相关的函数,在随后的介绍中将逐一说明。 二、DragDrop操作产生与执行的过程 1、自动产生过程。 我们知道在控件上单击鼠标左键时便会产生WM_LBUTTONDOWN消息,TControl类的WinProc消息处理方法捕捉到该消息时,便判断控件的DragMode是否为dmAutomatic,即是否自动执行DragDrop操作,如果是则调用类保护函数BeginAutoDrag,立即进入DragDrop状态,详见下面代码: procedureTControl.WndProc(va
5、rMessage:TMessage); begin ... caseMessage.Msgof WM_LBUTTONDOWN,WM_LBUTTONDBLCLK: begin ifFDragMode=dmAutomaticthen begin BeginAutoDrag; //进行DragDrop操作 Exit; end; Include(FControlState,csLButtonDown); end; ... else...end;
6、 ... end; procedureTControl.BeginAutoDrag; begin BeginDrag(Mouse.DragImmediate,Mouse.DragThreshold); end; 从上面代码可知它只是简单的调用了BeginDrag函数,具体开始DragDrop是由BeginDrag函数执行的。 2、手动产生过程。 当DragMode为dmManual时,将由程序在代码中显式调用BeginDrag方法产生。如: procedureTForm1.Panel1MouseDown(Send
7、er:TObject;Button:TMouseButton; Shift:TShiftState;X,Y:Integer); begin Panel1.BeginDrag(True,-1); end; 3、BeginDrag函数 分析前请先留意在Controls单元中声明的几个全局变量: var DragControl:TControl; //被Drag的控件 DragObject:TDragObject; //管理整个DragDrop过程的TDragObject对象 DragInternal
8、Object:Boolean; //TDragObject对象是否由内部创建 DragCapture:HWND; //管理DragDrop过程的Wnd实例句柄 DragStartPos:TPoint;
此文档下载收益归作者所有