ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:361.25KB ,
资源ID:5705080      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5705080.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实现drop目标对象.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

实现drop目标对象.docx

1、实现drop目标对象第六部分:实现 Drop目标对象(OLE drag&drop 之旅)欢迎你到OLE拖放操作的第六章!这里将着重于一个实现了 drop-target 的小程序,这就意味着我们的程序能够接收拖到它上面的对象(文件、图片、文本)了。我们实现一个IDropTarget 的COM接口允许 OLE程序拖动数据到我们的程序上; 这里仅仅是一个简单的EDIT控件,所以他将 CF_TEXT数据作为目标。成为一个“ Drop Target为了时窗口可以接收拖放操作的数据,窗口必须注册为 drop目标;有一个 OLE的API调用RegisterDragDrop 来完成这个事情,函数的原型是:WI

2、NOLEAPI RegisterDragDrop (HWND hwn d, IDropTarget * pDropTarget);第一个参数是窗口的 HANDLE,这个窗口是拖动的目标窗口;第二个参数是一个指向IDropTarget COM 对象的指针,COM/OLE 运行时将在拖放操作的过程中调用这个方法。同样有一个OLE API调用来将window 从拖放操作中删除:WINOLEAPI RevokeDragDrop(HWND hwnd);我们所要做的就是在窗口创建的时候调用RegisterDragDrop ,在窗口销毁的时候调用RevokeDragDrop。在我们调用RegisterDra

3、gDrop 之前,我们需要构造一个 COM对象来支不过我们前面已经介绍了。IDropTarget方法描述DragE nter判断是否可以接受一个拖操作,以及接受之后的效果DragOver提供通过DoDragDrop 函数执行的目标反馈DragLeave导致一个drop目标挂起它的返回行为Drop数据放进目标窗口这些函数都由 COM/OLE 运行时在一个对象被拖到我们注册窗口的时候来调用。就象上表显 示的一样,每个函数都有不同的任务,我们需要做的就是实现这些函数。实现 IDropTarget以我的经验,IDropTarget 接口非常难以写为不涉及特定程序的代码,例如:写成可以在所有程序都使用的

4、通用 IDropTarget COM 对象是很难的。这是因为IDropTarget 要求在一个对象拖过你的目标窗口时显示图形效果, 且也只有特定程序代码才可以访问这些数据对象内容。在我们的拖放接口之外,IDropTarget 是最容易被集成到你窗口类的对象。例如:假定你已经用C+类实现了一个自定义的窗口,为这个窗口添加一个多 drop目标支持的最好方法就是从IDropTarget 直接继承,而不需要单独定义一个 CDropTarget 类;这意味着你的drop-target 代码能够访问所有你的窗口状态。然而,我们这里提供完整的 CDropTarget 类:class CDropTarget

5、: public IDropTargetpublic:/ IU nknown impleme ntati onHRESULT _stdcall QueryI nteface (REFIID iid, void * ppvObject);ULONG _stdcall AddRef (void);ULONG _stdcall Release (void);/ IDropTarget impleme ntati onHRESULT _stdcall DragEnter (IDataObject * pDataObject, DWORgrfKeyState, POINTLpt, DWORD * pdw

6、Effect);HRESULT _stdcall DragOver (DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);HRESULT _stdcall DragLeave (void);HRESULT _stdcall Drop (IDataObject * pDataObject, DWORD grfKeyState, POINTL pt,DWORD * pdwEffect);/ Con structorCDropTarget(HWND hwn d);CDropTarget();private:/in ter nal helper fun c

7、ti onDWORD DropEffect (DWORD grfKeyState, POINTL pt, DWORD dwAllowed);bool QueryDataObject(IDataObject *pDataObject);/ Private member variableslong m_lRefCou nt;HWND m_hWnd;bool m_fAllowDrop;/ Other in ternal wi ndow members;除引用记数器外,我们需要存储另外两个变量: m_hWnd 变量是drop-target 窗口的HANDLE,这个在提供可见效果的时候需要; m_fAl

8、lowDrop 用来指示被拖动的数据对象是否包含我们需要的有用数据。因此我们没有连续查询数据对象,这是一个最优的办法。IDropTarget:DragE nter 方法让我们首先看一下IDropTarget 函数,因为这是在一个对象被拖过我们窗口时最先被 COM调用的函数:HRESULT DragE nter (IDataObject * pDataObject,DWORD grfKeyState,POINTL pt,DWORD * pdwEffect);仔细看一下上面函数的原型,因为这对于理解每个参数怎么样使用很重要:IDataObject-第一个参数是拖放操作的源对象通过COM传递来的数据

9、对象指针。IDataObject是拖放操作带来数据的传输媒体,我们在DragE nter 的时候查看数据对象来看是否有我们想要的任何数据。grfKeyState- 保留键盘修饰符的状态,例如: Control 、Alt、和Shift以及鼠标按键的状态。是有一到多个 MK_CONTROL 、MK_SHIFT 、MK_ALT、MK_BUTTON 、MK_LBUTTON 等组成的简单 DWORD 变量pt- 一个POINTL结构体,包含了鼠标进入我们窗口的坐标;在许多程序中,这个参数用来检查鼠标是否放置在允许的 drop区域上,或者用来简单的放置某些插入光标来指示drop数据放在那里。pdwEffe

10、ct- 个DWORD 的指针,指岀 drop 源允许的drop 效果。这个值和 DoDragDrop 的 dwOKEffect 值相同。我们的DragEnter 实现需要做几个通常的工作,另外画一个图形的反馈:1.检查提供的数据对象,然后判断它是否包含任何有用的数据2.检查存储在grfKeyState 的键盘状态,并且计算应该是什么样的 drop效果,例如:如果Control键按下,drop效果应该是复制,如果 Shift被按下,drop效果应该是移动。3.验证这些效果是否与 drop源的效果相兼容4.存储最终的 drop 效果到pdwEffect 的DWORD 指针。不要如此复杂吧! Dra

11、gEnter 的目的就是简单的对拖放操作说 yes还是NO ,指定采用什么drop效果以便于OLE更新鼠标光标。HRESULT_stdcall CDropTarget:DragE nter(IDataObject *pDataObject, DWORDrfKeyState,POINTL pt, DWORD *pdwEffect)/ does the dataobject con tai n data we want?m_fAllowDrop = QueryDataObject (grfKeyState, pdwEffect, pDataObject);if(m_fAllowDrop)/ get

12、 the dropeffect based on keyboard state*pdwEffect = DropEffect (grfKeyState, pt, *pdwEffect);SetFocus (m_hWnd);Positio nCursor (m_hWnd, pt);else*pdwEffect = DROPEFFECT_NONE;return S_OK;除了设置光标下的窗口和设置 EDIT位置外,DragEnter 的功能已经由两个内部协助函数代理而简化了:bool CDropTarget:QueryDataObject(IDataObject *pDataObject)FORM

13、ATETC fmtetc = CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL ;/ does the data object support CF_TEXT using a HGLOBAL?return pDataObject-QueryGetData(&fmtetc) = S_OK ? true : false;QueryDataObject 是一个私有函数,纯粹用来检查提供的数据,然后决定它是否包含对我们的drop目标有用的数据。在我们的例子中,我们仅仅接受 CF_TEXT数据存储为HGLOBAL ,因此这是我们请求的类型。一个私有成员变量

14、m_fAllowDrop 用来记住这个决定。DWORD CDropTarget:DropEffect (DWORD grfKeyState, POINTL pt, DWORD dwAllowed)DWORD dwEffect = 0;/ 1. 检查pt来看是否允许drop操作在某个位置/ 2. 计算岀基于 grfKeyState 的drop效果if(grfKeyState & MK_CONTROL)dwEffect = dwAllowed & DROPEFFECT_COPY;else if(grfKeyState & MK_SHIFT)dwEffect = dwAllowed & DROPEF

15、FECT_MOVE;/ 3. 非键盘修饰符指定(或 drop效果不允许),因此基于 drop源的效果if(dwEffect = 0)if(dwAllowed & DROPEFFECT_COPY) dwEffect = DROPEFFECT_COPY; if(dwAllowed & DROPEFFECT_MOVE) dwEffect = DROPEFFECT_MOVE;return dwEffect;DropEffect 协助函数用来计算基于键盘状态的 drop效果,并且这个效果是达到源允许的。首先grfKeyState 变量用来检查看是否使用了 Control或Shift键;这些键的标准的 O

16、LE行 为是Control应该是复制数据,shift应该是移动数据。如果两个都按下, 数据应该是连接(例如:源应该建立一个到目标的快捷方式),但我们不支持这个功能。主要的事情是使用位与操作符来对 dwEffect 赋drop效果值的时候:dwEffect = dwAllowed & DROPEFFECT_COPY;这个分配的结构很简单 -dwEffect 将拥有DROPEFFECT_COPY ,但只有在dwAllowed 变 量中仅仅包含这个值的时候起作用; 这种逻辑用法防止我们强制执行一个源不允许的 drop效果。下面是看一下在没有键盘修饰符的时候怎么做,例如: Control和Shift没

17、有使用。在这种情况我,我们检查拖放的源对象允许的 drop效果,以及选择使用哪个效果;在我们的实现中,我们是移动数据而不是复制。使用图形返回效果来得到一个机会清理。这个函数在拖放操作的整个生命周期中被多次调用,因此,高效的写这个函数很重要;DragOver 在键盘修饰符改变(shift/control 等)或当鼠标移动的时候被调用。 告诉OLE采用什么样基于键盘状态和鼠标位置的 drop效果是这个函数的责任:HRESULT _stdcall CDropTarget:DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)if(m_fAll

18、owDrop)*pdwEffect = DropEffect(grfKeyState, pt, *pdwEffect);Positio nCursor(m_hWnd, pt);else*pdwEffect = DROPEFFECT_NONE;return S_OK;DragOver 写的很简单,逻辑上与DragEnter 相同,我们使用前面计算过的 m_fAllowDrop和DropEffect 协助函数来通过 pdwEffect 指针返回drop效果。IDropTarget:DragLeave 函数这个函数在鼠标光标移到 drop目标窗口外面的时候调用, 或者按下Escape键来取消拖放操作

19、时。它的原型如下:HRESULT _stdcall CDropTarget:DragLeave (void)return S_OK;这是这个函数的基本写法;这个函数存在的唯一原因是便于程序在鼠标移到窗口外面的时候例如:想象下面的场景,无论什么东西都拖过目标对象,DragE nter 函数用来改变窗口边界的颜色; 在这种情况下,DragLeave 函数用来恢复窗口边界的颜色。IDropTarget:Drop 函数Drop函数的原型与 DragEnter 函数相同:HRESULT _stdcall CDropTarget:Drop (IDataObject *pDataObject, DWORD

20、grfKeyState,POINTL pt, DWORD *pdwEffect)Positio nCursor(m_hWnd, pt);if(m_fAllowDrop)DropData (m_hWnd, pDataObject);*pdwEffect = DropEffect (grfKeyState, pt, *pdwEffect);else*pdwEffect = DROPEFFECT_NONE;return S_OK;在OLE判断拖放操作到头的时候调用该函数,我们得到一个在 DragEnter 同样的IDataObject 的接口指针,我们可以从中得到数据并粘贴到我们的编辑窗口中。Dro

21、pData协助函数用来访问数据对象内部的 CF_TEXT数据,并插入到edit控件中;这个程序是是纯理论的,我们已经知道怎么样访问一个数据对象了, 这里不在不厌其烦的介绍, 你可以看源代码。posted on 2006-03-06 08:51 笨笨 阅读(606) 评论(2) 编辑 收藏 收藏至365Key 所属分类:OLE Drag&Drop评论:#re:第六部分:实现 Drop目标对象(OLE drag&drop 之旅)2006-05-24 20:11 | 王鴻杰您好我是來自台灣的讀者, 想要請教您,如果我想要寫一個 ActiveX元件,嵌入IE中作為一個檔案拖放的接受器,是否可行呢?以我

22、的經驗,我將程式寫在一般的桌面應用程式,是可以實現 OLE拖放,可是嵌到網頁裡面以後,我將檔案拖進IE當中,我的ActiveX 元件卻沒有反應。您是否有可以參考的 ActiveX 程序呢?ps.我是使用Borland C+ Builder 去開發 Active Control 和Active Form ,結果都沒有用。 回复#re: 第六部分:实现 Drop目标对象(OLE drag&drop 之旅)2006-05-25 13:19 | 笨笨我没有相关的程序我想你因看一下IE是如何处理DRAG OVER 等事件的,我试验发现他已经是一个 TARGET。你的ACTIVEX control 有窗口吗? 回复

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2