vcl中dragdrop功能的底层实现

vcl中dragdrop功能的底层实现

ID:11386325

大小:54.50 KB

页数:14页

时间:2018-07-11

vcl中dragdrop功能的底层实现_第1页
vcl中dragdrop功能的底层实现_第2页
vcl中dragdrop功能的底层实现_第3页
vcl中dragdrop功能的底层实现_第4页
vcl中dragdrop功能的底层实现_第5页
资源描述:

《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; 

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。