要使应用程序成为放置目标,请按照下列步骤操作:
初始化OLE库。您应该检查构建版本,并调用OleInitialize功能,就像下载源一样。
2.选择RegisterDragDrop功能。OLE保留作为放置目标的窗口的列表。接受删除对象的每个窗口都必须自己注册它的IDropTarget接口指针。然后当用户通过放置目标窗口拖动对象时,OLE具有方便的IDropTarget接口指针。
3.实现IDropTarget界面。OLE使用您在RegisterDragDrop注册的IDropTarget接口指针,让您了解放置操作的状态。
当光标首次进入已注册的放样目标窗口时,OLE调用IDropTarget::DragEnter成员函数。在这个成员函数中,你应该确保你的应用程序可以创建拖放的对象,如果它被删除。您的应用程序也可能会显示视觉反馈,显示放置的对象将在何处显示,如果合适。
当光标在放置目标窗口内移动时,OLE将调用IDropTarget::DragOver成员函数,就像Windows 95发送WM_MOUSEMOVE消息一样。在这里,您应该更新应用程序显示的任何视觉反馈,以反映当前的光标位置。当光标离开一个放置目标窗口时,OLE调用IDropTarget::DragLeave成员函数。在您的DragLeave会员功能中,您应该删除DragOver或DragEnter中显示的任何反馈。
当用户删除对象时,OLE会调用您的IDropTarget::Drop成员函数。确切地说,当drop源从IDropSource::QueryContinueDrag成员函数返回DRAGDROP_DROP值时,会发生丢弃。在您的下降成员函数中,您应该从作为参数传递的IDataObject创建一个适当的对象。以下示例说明如何实现IDropTarget::Drop.
STDMETHODIMP CDropTarget :: Drop(LPDATAOBJECT pDataObj,
DWORD grfKeyState,POINTL pointl,LPDWORD pdwEffect)
{
FORMATETC fmtetc;
SCODE sc = S_OK;
UndrawDragFeedback(); //删除任何视觉反馈
//如果应用程序,QueryDrop返回TRUE。可以接受一个下降的基础
//当前的键状态,请求的操作和光标位置。
if(pDataObj & & QueryDrop(grfKeyState,pointl,FALSE,pdwEffect)){
m_pDoc->m_lpSite = CSimpleSite::Create(m_pDoc);
m_pDoc->m_lpSite->m_dwDrawAspect = DVASPECT_CONTENT;
//初始化FORMATETC结构。
fmtetc.cfFormat = NULL;
fmtetc.ptd = NULL;
fmtetc.lindex = -1;
fmtetc.dwAspect = DVASPECT_CONTENT; //绘制对象的内容
fmtetc.tymed = TYMED_NULL;
HRESULT hrErr = OleCreateFromData
(pDataObj,IID_IOleObject,OLERENDER_DRAW,
& fmtetc & m_pDoc- > > m_OleClientSite m_lpSite-,
m_pDoc->m_lpSite->m_lpObjStorage,
(LPVOID FAR *)& m_pDoc- > m_lpSite- > m_lpOleObject);
if (hrErr == NOERROR)
//该对象已成功创建。
其他
//对象创建失败。
sc = GetScode(hrErr);
}
return ResultFromScode(sc);
}
4.选择RevokeDragDrop函数。在丢弃目标窗口被破坏之前,它必须调用RevokeDragDrop以允许OLE从其删除目标列表中删除该窗口。
5.初始化OLE库。像下载源一样,您的应用程序需要在终止之前初始化OLE库。