让窗口支持拖放(文件,文本,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)...

使用IDropTarget接口同时支持文本和文件拖放

使用IDropTarget接口同时支持文本和文件拖放 关于Windows的外壳扩展编程,拖放是比较简单的一种,在网上可以找到不少介绍这个技巧的文章。大部分是介绍使用MFC的COleDropTarg...
  • yuucyf
  • yuucyf
  • 2011-09-23 15:19
  • 1483

[ATL/WTL]_[初级]_[拖放文件到窗口]

场景: 1. 软件需要支持从桌面拖动文件到软件里,避免从文件打开窗口选择文件,这样效率快很多,这时就需要窗口支持拖放技术. drag and drop. 2. 软件需要复制文件到远程或设备里,支持拖放...

实现窗口的文件拖放功能

在很多应用程序中,多用到了文件的拖放功能,它使程序交互更加友好,那么它是如何实现的呢? 其实原理很简单,首先设置窗口的属性AcceptFiles,可以通过在窗口或控件的属性页中勾选Accept Fi...

拖放文件到窗口实现播放媒体文件

//我想你应该知道我们用的播放器绝大部分支持文件拖放即能播放,下面利用win32 API实现这一功能,主要是要在创建窗口时加入WS_EX_ACCEPTFILES类型,然后让窗口 响应WM_DROPF...

扩展COleDropTarget类来支持任意窗口拖放

一、拖放原理及MFC类库对拖放的支持拖放(Drag and Drop)是OLE的一部分,是指对某一指定的对象,利用鼠标拖动的方法,在不同应用的窗口之间、同一应用的不同窗口之间或同一应用的同一窗口内进行...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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