为了实现托拽功能,首先必须知道在什么位置,使用那些对象方法,他们的步骤都是什么呢?
可以想象一下我们在windows中是怎么操作托拽。可以肯定都是以下几步
选中要托拽的对象
按住鼠标左键不放,移动到另一个位置
松开鼠标左键,放下对象
当然成功与否,还要看他们是一次合法的操作吗?一次成功的托拽操作应该满足几个条件
原容器是否支持托拽(drag)
目标容器是否识别托拽的对象,以及支持放下(drop).
以上两点满足就可以实现托拽功能,但还有一点操作上的注意事项,MFC默认托拽是以一个像素单位距离来衡量的。如果拖动的距离小于一个像素,系统就不会处理这次托拽操作了。
那么在程序中他的实现又是由哪几部分组成的,他的顺序又是怎样的?这里先简单得给出他们顺序
OnLButtonDown(UINT nFlags, CPoint point) : select the proper object
OnDragEnter: drag object to enter the target window
OnDragLeave: drag object to leave the target window
OnDragOver: drag operation is finished
OnDrop: drop object in the target window
可以知道托拽的过程,那么我只要在这些过程中添加自己的代码就可以完成我们自己的托拽了。例如OnLButtonDown方法,我们可以添加一些托拽之前的准备工作。
托拽或者托拉不仅可以在可以在同一应用之中进行,而且可以在不同的应用程序之间进行,最简单的例子就是我们可以托动word中的文字到IE中的文本框中。说明除了这两个应用之外,还有第三者在他们之间起到了通讯和中介的作用。这个第三者就是剪贴板(clipboard).
剪贴板是微软microsoft提供的函数集合,他的定义可以在msdn中找到。
Clipboard Functions
为了使用它,我们必须格式化我们的托拽的对象,把这些对象与剪贴板关联起来,这里提供一个类CPrepareObject,加载数据格式进入剪贴板中。
class CPrepareObject //initialize before beginning clipboard and drag&drop
{
friend class CDragDrop;
friend class CClipboard;
public:
struct CObjectFormat
{
UINT nFormat;
CString cFormat;
};//store the self-defined format
CPrepareObject(){};
virtual ~CPrepareObject(){};
static BOOL AddFormat(CString csFormat);
static void InitializeOLE(void);
static CArray<CObjectFormat,CObjectFormat> m_formatArray;
private:
CString AvailableDataType(COleDataObject* pDataObject);
BOOL AvailableDataType(LPCTSTR lpStrFormat);
}; |