添加投放目标功能

【勇芳软件工作室】汉化HomePreviousNext

要使应用程序成为放置目标,请按照下列步骤操作:

初始化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会员功能中,您应该删除DragOverDragEnter中显示的任何反馈。

当用户删除对象时,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库。