您的位置:首页 > 运维架构

IDropTarget 封装 让窗口支持拖放(文件,文本,URL...)

2015-09-24 16:25 459 查看
原文: /article/7353497.html

一、窗口支持拖放的实现步骤

1. 初始化OLE, ::OleInitialize(NULL);

2. 实现接口 : IDropTarget

二、IDropTarget接口内容

1. DragEnter

在拖放进入窗口区域的时候触发调用,可以在这里获取拖放数据,判断数据是否是需要支持的拖放类型,根据返回值,系统显示相应的拖放图标。

2. DragOver

在拖放操作在窗口区域内移动的时候,触发调用,可以在这里根据鼠标的位置来判断是否某区域支持该拖放。

3. DragLeave

在拖放操作离开窗口的时候触发调用,可以在这里做一些拖放操作的资源释放的动作。

4. Drop

拖放操作在窗口区域释放的时候触发调用,完成一次拖放。在这里获取拖放数据,实现窗口定义的拖放功能。

三、举例实现文件/文本/URL的拖放

1. DragEnter

STDMETHOD(DragEnter)(IDataObject * pDataObject,DWORD grfKeyState, POINTL pt,DWORD * pdwEffect)

{

*pdwEffect = DROPEFFECT_LINK|DROPEFFECT_COPY ;

return S_OK ;

}

2. DragOver

STDMETHOD(DragOver)(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)

{

*pdwEffect = DROPEFFECT_LINK|DROPEFFECT_COPY ;

return S_OK ;

}

3. DragLeave

STDMETHOD(DragLeave)(){ return S_OK ;}

4. Drop

STDMETHOD(Drop)(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect)

{

FORMATETC cFmt = {(CLIPFORMAT) CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};

STGMEDIUM stgMedium;

if(SUCCEEDED(pDataObj->GetData(&cFmt, &stgMedium)))

{

char *pBuff = NULL;

pBuff=(LPSTR)GlobalLock(stgMedium.hGlobal);

GlobalUnlock(stgMedium.hGlobal);

USES_CONVERSION;

// 触发文本/URL的Drop,内容(A2T(pBuff))

::ReleaseStgMedium(&stgMedium);

}

FORMATETC cFmt2 = {(CLIPFORMAT) CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};

if(SUCCEEDED(pDataObj->GetData(&cFmt2, &stgMedium)))

{
// 触发文件拖放,hDrop=(HDROP)stgMedium.hGlobal

if(m_pTarget) m_pTarget->OnDropFile((HDROP)stgMedium.hGlobal);

::ReleaseStgMedium(&stgMedium);

}

return S_OK ;

}

5. 扩展

在获取数据的时候,可以参考获取文本/文件数据,获取其它类型的数据,来实现支持其他数据的拖放功能。

四、使用附件

1. 附件中封装了支持文件/文本/URL的拖放支持代码 IDropTargetImpl.h

2. 使用步骤

1.) Include “IDropTargetImpl.h”

2.) 为需要实现拖放的窗口添加继承列表,如下:

class CDropWnd : public IDropTargetImpl<CDropWnd >

3.) 在窗口初始化过程中(OnInitDialog/OnCreate)调用RegisterDragDrop();

4.) 根据需要实现的拖放功能,选择性的重载虚函数:

virtual void OnDropText(LPCTSTR ptszText);

virtual void OnDropFile(HDROP hDrop);

============================================================

IDropTargetImpl.h

http://pyhcx.blog.51cto.com/ext/down_att.php?aid=15545&code=3159
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: