|
让我们再来看看GetDropTarget的声明,其中第一个参数指向MSHTML提供的缺省DropTarget实现,而第二个参数用以返回应用程序的自定义DropTarget实现,如果在GetDropTarget中返回S_OK,MSHTML将以应用程序提供的自定义DropTarget替换缺省的DropTarget实现。
HRESULT GetDropTarget( IDropTarget *pDropTarget, IDropTarget **ppDropTarget);
参数说明
pDropTarget
[in] Pointer to an IDropTarget interface for the current drop target object supplied by MSHTML.
ppDropTarget
[out] Address of a pointer variable that receives an IDropTarget interface pointer for the alternative drop target object supplied by the host.
想到了吗?解决问题的关键就在于第一个参数pDropTarget。相信很多浏览器在处理的时候都忽略掉了第一个参数而只是将自己的实现通过第二个参数告知MSHTML,因而丢失了IE缺省的行为。既然如此,将缺省的IDropTarget接口的指针保存下来,在适当的时候调用,不就能够保留IE的原始拖放行为了吗?
7、“超级拖放”的完美实现
完整的代码就不再给出,我们只列出关键的部分作为示例。假设我们用来实现IDropTarget接口的类叫做CBrowserDropTarget:
//构造函数,传入参数即是从GetDropTarget得到的那个pDropTarget,它是MSHTML的缺省实现
CBrowserDropTarget::CBrowserDropTarget(IDropTarget *pOrginalDropTarget)
:
m_bDragTextToInputBox(FALSE)
//这个布尔变量用来判断是否正在向InputBox拖拽文字
,
m_pOrginalDropTarget(pOrginalDropTarget)
上一篇:我对PMP考试的一些体会
下一篇:关于N皇后问题高效试探回溯算法的分析
|