实现自定义拖放
------创建COleDropSource 对象来控制放置
对于大多数应用程序,拖放功能的默认实现就已经足够了。但是,某些应用程序可能要求更改此标准行为。马上你会看到一个更改标准的拖放行为的例子,可以说明其实这是一件多么简单的事情,或许,你会得到一些自定义拖放的感性认识。
在我的工具条上,有一个按钮,资源ID号为:ID_DRAG_MY_OBJ,点击该按钮后,将开始拖放动作(注意,点击该按钮后已经了鼠标LButtonDown和LButtonUp两个动作,而不是按住鼠标左键不放),当鼠标在接受拖放的View中移动Move时,显示状态为拖放中,当在接受拖放的View中按下鼠标左键时,进行放置(Drop),被拖放的数据在该处放置。
这是一个不同于标准拖放的操作,该怎么完成这些动作呢?我们还是先来准备好需要的函数,一步一步从熟悉的默认拖放转变为自定义拖放。
首先,需要响应该按钮的函数,我把它放在CMainFrame中,于是CMainFrame.cpp就会增加一个函数OnDragMyObj()和一条消息映射ON_COMMAND(ID_DRAG_MY_OBJ, OnDragMyObj):
BEGIN_MESSAGE_MAP(CMainFrame, uiFoldTabFrame)
…
ON_COMMAND(ID_DRAG_MY_OBJ, OnDragMyObj)
…
END_MESSAGE_MAP()
…
void CMainFrame:: OnDragMyObj ()
{
//具体的实现将在后面逐渐清晰。
…
}
在MFC框架下,一个普通的拖放事怎么完成的?目的端,在接收拖放的窗体类中放置一个COleDropTarget对象,通过RegisterDragDrop API来注册,实现该COleDropTarget的DragEnter、DragOvert、DragLeave、Drop等方法来处理接收窗体中不同鼠标状态下的拖动或放置,在窗体不需要再接收任何拖动过来的数据时使用RevokeDragDrop来解除注册。源端,生成一个COleDataSource 对象ÿ