C# 继承.Net中提供的WebBrowser 2.0控件以实现IE的超级拖放

转自:http://blog.csdn.net/zhaojunpang/article/details/4065441

看到傲游中提供的超级拖放很是方便,但是IE中却没有提供,但是现在IE 8 用着很好,于是就琢磨着自能否让IE 也支持此功能呢,Google一下很多都是VC++的资料,而且没有完整的代码,但是有一篇的文章给出了完整的思路,这里很感谢此作者,原文链接:http://blog.csdn.net/drong/archive/2007/03/05/1520698.aspx

通过该作者的思路对控件进行了改写。当然本文只是思路的一种,写出来之后必须要自写浏览并使用生成的控件才能使用超级拖放功能,当然也可以写IE 插件来直接在IE 上实现,网上有已经写好的,但是我们编程能自己写会学到更多。

 

简介:

      要实现超级拖放功能,就必须要实现IDocHostUIHandler和IDropTarget这两个接口(详细见MSDN),当Mshtml在需要的时候就会调用IDocHostUIHandler接口中的GetDropTarget方法,其中该方法中有两个参数,一个是传入参数pDropTarget,是默认的拖放操作对象,而输出参数ppDropTarget使我们可以注册我们自己希望来处理拖放的操作对象,并且保存原有pDropTarget对象,当用户往文本编辑框中拖放时就可以调用IE原有的默认操作,而不用我们去实现,实际上实现起来也相当的麻烦。IDocHostUIHandler接口主要是注册当然的控件本身来处理拖放操作,而IDropTarget接口则会在发生DragEnter、DragOver、Drag、DragLeave被调用,在这里我们就可以对事件进行处理,实现超级拖放的操作,并可以把拖放操作的结果封装成事件,当需要时就可以注册事件获取拖动的结果。当然也可以直接在IE 控件中实现,但封装成事件的灵活性更大。

实现:

       IDocHostUIHandler和IDropTarget接口以有个封装好了的适用于的.NET的DLL,我们只须下载下来添加引用到工程中去即可。没有的也可以去下载:http://download.csdn.net/source/1200055

添加好之后,我们只需要继承系统原有的WebBrowser并实现上述两个接口即行:

 public partial class ExtendedWebBrowser : System.Windows.Forms.WebBrowser,MsHtmHstInterop.IDocHostUIHandler,MsHtmHstInterop.IDropTarget

而后再在代码中实现这两个接口的函数,并在类中定义两个变量:

MsHtmHstInterop.IDropTarget pDropTarget;//保存原有的拖放对象
private bool isDragToInputBox = false;//判断是否是在向输入框中拖放

在类的构造函数中加上:

MsHtmHstInterop.ICustomDoc idoc = this.Document.DomDocument as  MsHtmHstInterop.ICustomDoc;
  idoc.SetUIHandler(this as MsHtmHstInterop.IDocHostUIHandler);

这两个语句的作用是获取Documnet的接口,我们实现的接口(此处解释不是很好)

在IDocHostUIHandler接口中GetDropTarget方法中实现为:

this.pDropTarget = pDropTarget;//保存默认的对象
ppDropTarget = this as MsHtmHstInterop.IDropTarget ;//把当前对角注册为拖放对象

在IDropTarget接口中主要处理上面提到的几个函数,至于封装成事件就请自己去写一下吧。

DragEnter:

pDropTarget.DragEnter(pDataObj, grfKeyState, pt, ref pdwEffect);//调用默认方法
            //获取拖动的参数
            if (ExDragEnter != null)
            {
                DataObject dobj = null;
                if (pDataObj != null)
                {
                    dobj = new DataObject(pDataObj);//拖动数据
                    Point p = new Point(pt.x, pt.y);//鼠标在容器上的位置
                    dragEnterEventArgs.SetParameters(dobj, grfKeyState, p, pdwEffect);
                    ExDragEnter(this, dragEnterEventArgs);//此处为自定义事件
                    if (dragEnterEventArgs.handled)//自定义事件的返回值
                    {
                        pdwEffect = dragEnterEventArgs.pdwEffect;
                    }
                }
            }

DragOver:

uint temp = pdwEffect;//保存原有的拖放效果,当调用默认的
                                  //操作时此参数会改变,并根据此来判
                                  //断是否向输入框中拖放

            pDropTarget.DragOver(grfKeyState, pt, ref pdwEffect);//调用默认方法       
            if (pdwEffect > 0)//如果值变为了零,那么是向输入框中拖放了
            {
                isDragToInputBox = true;//标记设为true
                temp = 0;
            }
            else
            {
                isDragToInputBox = false;//否则标记设为false
                pdwEffect = temp;
            }
            if (ExDragOver != null)//自定义事件处理
            {
                Point p = new Point(pt.x, pt.y);
                dragOverEventArgs.SetParameters(grfKeyState, p, temp);
                if (dragOverEventArgs.handled)
                {
                    pdwEffect = dragOverEventArgs.pdwEffect;
                }
            }

DragLeave:

 pDropTarget.DragLeave();//调用默认的方法
            if (ExDragLeave != null)
            {
                ExDragLeave(this);//自定义事件
            }

Drop:

 if (ExDragDrop != null)//自定义事件处理
            {
                if (pDataObj != null && !isDragToInputBox )//如果没有向输入框中拖放则触发此事件
                                                           //否则按默认处理
                {
                    DataObject dobj = new DataObject(pDataObj);
                    Point p = new Point(pt.x, pt.y);
                    dragDropEventArgs.SetParameters(dobj, grfKeyState, p, pdwEffect);
                    ExDragDrop(this, dragDropEventArgs);
                    if (dragDropEventArgs.handled)
                    {
                        pdwEffect = dragDropEventArgs.pdwEffect;
                    }
                }
            }
            pDropTarget.Drop(pDataObj, grfKeyState, pt, ref pdwEffect);//调用默认方法

现在生成之后可能还不能用,还需要一步,那就是注册该继承自WebBrowser的控件作为DropTarget对象,这就需要重写WebBrowser的RegisterAsDropTarget的属性,把其设为true就行了,而此属性需要实现IWebBrowser2接口,此接口的实现方法在这里就不提了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值