2014十二月16
DUI-实现模拟窗口拖动分发
1.主窗口注册可拖放
::RegisterDragDrop(m_hWnd, &m_DropTarget); // 注册可拖动
2.为真实窗口实现DUIDropDispatcher,原因很简单,DUI是模拟的窗口,只能通过所属的真实窗口进行分发.
3.DUIDropDispatcher中使用map,map关联dui窗口+ dui要使用的IDropTarget,比如richedit注册一个拖动窗口.
3.dui窗口中触发DUIDropDispatcher,根据鼠标判断当前在哪个dui上,分发调用对应的dui要使用的IDropTarget.
IDropTarget的关键函数:
WINOLEAPI DoDragDrop( IDataObject * pDataObject, //Pointer to the data object IDropSource * pDropSource, //Pointer to the source DWORD dwOKEffect, //Effects allowed by the source DWORD * pdwEffect //Pointer to effects on the source );
DoDragDrop函数:
1.检测目标窗口是否支持拖放,发现目标窗口的IDropTarget接口
2.随时跟踪鼠标和键盘的状态,根据状态决定调用其DrageEnter,DragMove,Drop或DragLeave接口
3.从这些接口获取客户程序的返回值,根据这些值和用户界面以及数据源进行交互
DoDragDrop //控制拖放的整个过程,我们只是将这个过程里以下四个函数接管下来和DoDragDrop进行交互 DragEnter //光标进入目标窗口(RegisterDragDrop窗口)时系统调用IDropTarget::DragEnter方法 DragOver /*标位于目标窗口上时,系统会不时地调用IDropTarget::DragOver方法。方法参数会为目标提供光标位置和CTRL等修饰键状态,You do not call IDropTarget::DragOver directly. The DoDragDrop function calls this method each time the user moves the mouse across a given target window.*/ DragLeave //当拖动的鼠标离开了目标窗口(RegisterDragDrop窗口)区域调用IDropTarget::DragLeave方法 Drop //如果鼠标没有离开窗口,而是在窗口内释放按纽,调用IDropTarget::Drop方法
取出数据操作完成后,目标应该设置pdwEffect参数为某个DROPEFFECT值来指示操作的结果
通过IDataObject*pDataObj可以获取拖动的数据,比如edit中拖动richedit字串:
示例:
hr = pDropTarget->DragEnter(pDataObj,grfKeyState,pt,pdwEffect); FORMATETC cFmt = {(CLIPFORMAT)CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; STGMEDIUM stgMedium; pDataObj->GetData(&cFmt, &stgMedium); LPSTR pBuf =(LPSTR)GlobalLock(stgMedium.hGlobal); GlobalUnlock(stgMedium.hGlobal);
*pdwEffect:可取以下值:
#define DROPEFFECT_NONE ( 0 ) //不允许对象落在此窗口 #define DROPEFFECT_COPY ( 1 ) //移动操作,允许对象落在此窗口,落下时要删除原来的对象 #define DROPEFFECT_MOVE ( 2 ) //复制操作,允许对象落在此窗口,落下时不删除原来的对象 #define DROPEFFECT_LINK ( 4 ) //拖放源对象创建了一个对自己的连接 #define DROPEFFECT_SCROLL( 0x80000000 )//拖放目标窗口正在或将要进行卷滚
文章作者:hgy413
本文地址:https://hgy413.com/1908.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!