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

转载 2012年03月23日 17:18:29
一、窗口支持拖放的实现步骤
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);

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

原文: http://pyhcx.blog.51cto.com/713166/192454 一、窗口支持拖放的实现步骤 1. 初始化OLE, ::OleInitialize(NULL)...
  • bible521125
  • bible521125
  • 2015年09月24日 16:25
  • 614

支持文件拖拽功能的windows窗口

----------------------------------------------------------------------------------------------------...
  • wang03989
  • wang03989
  • 2016年08月22日 11:22
  • 854

VS2012 MFC 对话框支持文件拖拽功能

1- 新建一个基于对话框的MFC工程; 2- 多余控件删掉; 3- 拖一个列表框到主对话框中; 4- 点击主对话框右键,在弹出菜单,选择属性,Accept File 修改为 True。 5- 右健主对...
  • StartSupper
  • StartSupper
  • 2015年08月20日 19:26
  • 1933

COleDropTarget类支持任意窗口拖放

我从CDialogBar派生了一个子类 CContainerDlgBar 重载了其中的虚函数CalcDynamicLayout 然后调用CDialogBar::CalcDynamicLayout来获得...
  • feihuadao
  • feihuadao
  • 2010年12月05日 23:10
  • 1193

FireMonkey开发: win下的窗口拖放实现

FireMonkey下的实现窗口拖放,之前调用windows api的方式就不大好用, 它提供了一种更方便的方式,在一个组件的MouseDown事件中调用StartWindowDrag方法即可, ...
  • jonahzheng
  • jonahzheng
  • 2015年05月21日 19:16
  • 1007

[转]QT实现拖放文件

转自:http://my.oschina.net/voler/blog/345722 目录[-] 0. 源代码下载地址1. 简单文件拖放2. 复杂文件拖放3. 通过按钮来完成列表数...
  • hailmy
  • hailmy
  • 2014年12月04日 11:48
  • 1106

怎么让你的窗口支持文件拖入功能

 我们经常看到很多应用程序支持文件拖入功能,个人感觉很酷,碰巧本人毕设做的是一个多媒体播放器,刚好可以用到这个技术。所以查了下相关的资料。     首先,我们要先熟悉下三个相关API函数的使用。   ...
  • tangaowen
  • tangaowen
  • 2009年05月10日 15:16
  • 3772

COleDropTarget

一个COLEDragTarget对象提供窗口和OLE库之间的通讯机制。创建一个该类的对象可以使一个窗口接受OLE拖放机制传送的数据。为了使一个窗口可以接受Drop命令,你应该创建一个COleDropT...
  • windcsn
  • windcsn
  • 2005年07月10日 12:08
  • 1895

控制台程序实现拖曳运行支持

TCHAR *acDataFile = new TCHAR[MAX_PATH];TCHAR *acTmp = new TCHAR[MAX_PATH];TCHAR *acSourceF...
  • garfieldking
  • garfieldking
  • 2009年12月07日 23:44
  • 410

c#中实现文件拖放打开

private void Form1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { if (e.Data.GetDa...
  • 21aspnet
  • 21aspnet
  • 2007年03月24日 16:53
  • 2343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让窗口支持拖放(文件,文本,URL...)
举报原因:
原因补充:

(最多只允许输入30个字)