IDropTarget 封装 让窗口支持拖放(文件,文本,URL...)
来源:互联网 发布:张大千 敦煌破坏 知乎 编辑:程序博客网 时间:2024/06/03 21:51
原文: http://pyhcx.blog.51cto.com/713166/192454
一、窗口支持拖放的实现步骤
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 ;
}
{
*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 ;
}
{
*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)))
{
{
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 ;
}
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
0 0
- IDropTarget 封装 让窗口支持拖放(文件,文本,URL...)
- 让窗口支持拖放(文件,文本,URL...)
- 使用IDropTarget接口同时支持文本和文件拖放
- 使用IDropTarget接口同时支持文本和文件拖放(一)
- 使用IDropTarget接口同时支持文本和文件拖放(二)
- 使用IDropTarget接口同时支持文本和文件拖放
- 使用IDropTarget接口同时支持文本和文件拖放
- [VC]使用IDropTarget接口同时支持文本和文件拖放(1)(zt)
- C#中让ListBox支持文件路径的拖放
- 让listBox支持拖放入文件的路径
- 文件拖放支持
- C++ Builder支持文件拖放
- 支持文件拖放的ListBox
- COleDropTarget类来支持任意窗口拖放
- COleDropTarget类支持任意窗口拖放
- Delphi使窗口支持文件拖放的简单例子,附源代码
- 怎么让你的窗口支持文件拖入功能
- 让文件选择窗口支持多个文件类型
- win平台使用secureCRT通过ssh免密码登陆linux
- ios激情详解之通知
- 【TCO2013 3B】ToastJumping
- 001电商用户行为分析业务整体介绍
- 手势 双击 拖动事件
- IDropTarget 封装 让窗口支持拖放(文件,文本,URL...)
- 同步异步 阻塞非阻塞 事件
- 用PHP做服务器转发层,解决js的ajax跨域访问问题
- 关于SO_LINGER 设置
- 三元运算符
- Java(2)--单例模式
- POJ - 1375
- ConcurrentHashMap实现解析
- hihoCoder 1227 The Cats' Feeding Spots 2015北京赛区网络赛