首页 > DUI > DUI-实现模拟窗口拖动分发
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字串:

11.png

示例:

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
本文地址:http://hgy413.com/1908.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!

本文的评论功能被关闭了.