C# 继承.Net中提供的WebBrowser 2.0控件以实现IE的超级拖放
2009-04-11 19:45
591 查看
看到傲游中提供的超级拖放很是方便,但是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接口,此接口的实现方法在这里就不提了。
通过该作者的思路对控件进行了改写。当然本文只是思路的一种,写出来之后必须要自写浏览并使用生成的控件才能使用超级拖放功能,当然也可以写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接口,此接口的实现方法在这里就不提了。
相关文章推荐
- C# 继承.Net中提供的WebBrowser 2.0控件以实现IE的超级拖放
- .Net2.0 --Winform结合WebBrowser控件和Socket老技术来实现另类Push~
- VS C# .NET WebBrowser控件 利用插入JS代码,实现控制弹出IE窗口
- .Net 中的webBrowser控件加载网页时实现进度显示
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- C#中实现WebBrowser控件的HTML源代码读写
- C#继承基本控件实现自定义控件
- C#中的webBrowser控件加载网页时实现进度显示
- .net 2.0 rest 实现(c#)
- C#继承基本控件实现自定义控件
- Winform跨线程操作控件,采用扩展方法适配.NET 2.0,C#封装委托方法
- WinForm中实现对WebBrowser控件的HTTP数据包监视或者修改。(C#)
- C#中实现WebBrowser控件的HTML源代码读写
- C#基于.net CF 2.0实现手机抓屏幕
- C#中实现WebBrowser控件的HTML源代码读写
- 在.net中利用webbrowser控件实现WinForm与WebForm交互
- C# WebBrowser控件实现定时模拟按钮点击
- .Net中webBrowser控件指定IE版本
- .NET中RAS加解密和签名与验证的c#实现代码讲解,及实现程序提供
- c# 将日志文件显示在WebBrowser控件中 分类: .NET 2012-12-18 16:03 781人阅读 评论(0) 收藏