mfc webbrowser控件件中加载了一html页面,而该html页面使用了css文件,如何在winform后台代码修改该css中的值。

您现在的位置:&>&&>&&>&
育龙网&WWW.CHINA-B.C0M&& 日&&来源:互联网
核心提示:
话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrowser这个ActiveX控件了。这个类如果仅仅作为一个和IE一模一样浏览器
btnSubmit==null)tbUserid.SetAttribute("value","smalldust");tbPasswd.SetAttribute("value","");btnSubmit.InvokeMember("click");这里我们用SetAttribute来设置文本框的“value”属性,用InvokeMember来调用了按钮的“click”方法。因为不同的Html元素,其拥有的属性和方法也不尽相同,所以.Net2.0提供了统一的HtmlElement来概括各种Html元素的同时,提供了这两个方法以调用元素特有的功能。关于各种Html元素的属性和方法一览,可以查阅MSDN的DHTMLReference。※关于表单的提交,的确还有另一种方法就是获取form元素而不是button,并用form元素的submit方法:HtmlElementformLogin=webBrowser.Document.Forms【"loginForm"】;//……formLogin.InvokeMember("submit");本文之所以没有推荐这种方法,是因为现在的网页,很多都在submit按钮上添加onclick事件,以对提交的内容做最基本的验证。如果直接使用form的submit方法,这些验证代码就得不到执行,有可能会引起错误。StudyCase3:查找并选择文本这次我们希望实现一个和IE一模一样的查找功能,以对Web页面内的文字进行查找。文本查找要借助于TextRange对象的findText方法。但是,.Net里并没有这个对象。这是因为,.Net2.0提供的HtmlDocument,HtmlWindow,HtmlElement等类,只不过是对原有mshtml这个COM组件的不完整封装,只提供了mshtml的部分功能。所以许多时候,我们仍旧要借助mshtml来实现我们需要的功能。好在这些.Net类都提供了DomDocument这个属性,使得我们很容易把.Net对象转换为COM对象使用。下面的代码演示了如何查找Web页面的文本。(需要添加mshtml的引用,并加上)publicpartialclassSearchDemo:Form{//建立一个查找用的TextRange(IHTMLTxtRange接口)privateIHTMLTxtRangesearchRange=publicSearchDemo(){InitializeComponent();}privatevoidbtnSearch_Click(objectsender,EventArgse){//Document的DomDocument属性,就是该对象内部的COM对象。IHTMLDocument2document=(IHTMLDocument2)webBrowser.Document.DomDstringkeyword=txtKeyword.Text.Trim();if(keyword=="")//IE的查找逻辑就是,如果有选区,就从当前选区开头+1字符处开始查找;没有的话就从页面最初开始查找。//这个逻辑其实是有点不大恰当的,我们这里不用管,和IE一致即可。if(document.selection.type.ToLower()!="none"){searchRange=(IHTMLTxtRange)document.selection.createRange();searchRange.collapse(true);searchRange.moveStart("character",1);}else{IHTMLBodyElementbody=(IHTMLBodyElement)document.searchRange=(IHTMLTxtRange)body.createTextRange();}//如果找到了,就选取(高亮显示)该关键字;否则弹出消息。if(searchRange.findText(keyword,1,0)){searchRange.select();}else{MessageBox.Show("已搜索到文档结尾。");}}}到此为止,简单的查找就搞定了。至于替换功能,看了下一个例子,我相信你就可以触类旁通轻松搞定了。StudyCase4:高亮显示上一个例子中我们学会了查找文本――究跟到底,对Web页面还是只读不写。那么,如果说要把所有的搜索结果高亮显示呢?我们很快会想到把所有匹配的文字颜色、背景改一下就可以了。首先想到的可能是直接修改HTML文本吧……但是,与SourceCode的高亮显示不同,我们需要并且只需要高亮页面中的文本部分。HTML标签、脚本代码等等是绝对不应该去改动的。因此我们不能把整个页面的SourceCode读进来然后replace,那样有破坏HTML文件结构的可能;我们只能在能够分离出文本与其他内容(标签,脚本……)的前提下进行。具体方法有很多,下面提供两个比较简单的方法。方法一:使用TextRange(IHTMLTxtRange)有了上一个Case的基础,相信大家立刻会想到使用TextRange。没错,TextRange除了提供查找方法之外,还提供了一个pasteHTML方法,以指定的HTML文本替换当前TextRange中的内容。代码片断如下:publicpartialclassHilightDemo:Form{//定义高亮显示效果的标签。stringtagBefore="";stringtagAfter="";//……privatevoidbtnHilight_Click(objectsender,EventArgse){HtmlDocumenthtmlDoc=webBrowser.Dstringkeyword=txtKeyword.Text.Trim();if(keyword=="")objectoTextRange=htmlDoc.Body.InvokeMember("createTextRange");mshtml.IHTMLTxtRangetxtrange=oTextRangeasmshtml.IHTMLTxtRwhile(txtrange.findText(keyword,1,4)){try{txtrange.pasteHTML(tagBefore+keyword+tagAfter);}catch{}txtrange.collapse(false);}}}※这段代码里获取IHTMLTxtRange的方式和上面的例子稍稍不同,其实所谓条条大路通罗马,本质是一样的。方法二:使用DOM(文档对象模型)将HTML文档解析为DOM,然后遍历每个节点,在其中搜索关键字并进行相应替换处理即可。publicpartialclassHilightDemo:Form{//……privatevoidbtnHilight_Click(objectsender,EventArgse){HTMLDocumentdocument=(HTMLDocument)webBrowser.Document.DomDIHTMLDOMNodebodyNode=(IHTMLDOMNode)webBrowser.Document.Body.DomEstringkeyword=txtKeyword.Text.Trim();if(keyword=="")HilightText(document,bodyNode,keyword);}privatevoidHilightText(HTMLDocumentdocument,IHTMLDOMNodenode,stringkeyword){//nodeType=3:text节点if(node.nodeType==3){stringnodeText=node.nodeValue.ToString();//如果找到了关键字if(nodeText.Contains(keyword)){IHTMLDOMNodeparentNode=node.parentN//将关键字作为分隔符,将文本分离,并逐个添加到原text节点的父节点string【】result=nodeText.Split(newstring【】{keyword},StringSplitOptions.None);for(inti=0;iHelb>loWorld!先不管作者出于什么目的让Hel三个字母成为粗体,总之显示在页面上的是一句“HelloWorld!”。在我们希望高亮页面中的“Hello”这个关键字时,如果用DOM分析的话,会得出含有“Hel”的节点和文本节点“loWorld!”两个节点,因此无法将其挑出来。而TextRange则能正确识别,将其设置为高亮。因此也可以说TextRange是只和文本有关,和HTML语法结构无关的对象。但是,TextRange也有其致命缺点,加亮容易,反向的话就很难。换句话说,去除高亮显示的时候不能再用TextRange,而需要采用其他方法。而DOM方法则正好相反,由于DOM的树状结构特性,虽然不能(或者很难)跨越Tag搜索关键字,但是去除高亮显示并不繁琐。StudyCase5:与脚本的互操作在Case1当中,我们已经看到,Web页面的HTML元素的事件,可以由WindowsForm端来响应,可以在某种程度上看作是Web页面调用WinForm;那么反过来,WinForm除了可以直接访问Web页面的HTML元素之外,能否调用Web页面里的各种Script呢?首先是调用Web页面的脚本中已经定义好的函数。假设HTML中有如下Javascript:functionDoAdd(a,b){returna+b;}那么,我们要在WinForm调用它,只需如下代码即可:objectoSum=webBrowser.Document.InvokeScript("DoAdd",newobject【】{1,2});intsum=Convert.ToInt32(oSum);其次,如果我们想执行一段Web页面中原本没有的脚本,该怎么做呢?这次.Net的类没有提供,看来还要依靠COM了。IHTMLWindow2可以将任意的字符串作为脚本代码来执行。stringscriptline01=@"functionShowPageInfo(){";stringscriptline02=@"varnumLinks=document.links.";stringscriptline03=@"varnumForms=document.forms.";stringscriptline04=@"varnumImages=document.images.";stringscriptline05=@"varnumScripts=document.scripts.";stringscriptline06=@"alert(‘网页的统计结果:“r“n链接数:‘+numLinks+";stringscriptline07=@"‘“r“n表单数:‘+numForms+";stringscriptline08=@"‘“r“n图像数:‘+numImages+";stringscriptline09=@"‘“r“n脚本数:‘+numScripts);}";stringscriptline10=@"ShowPageInfo();";stringstrScript=scriptline01+scriptline02+scriptline03+scriptline04+scriptline05+scriptline06+scriptline07+scriptline08+scriptline09+scriptline10;IHTMLWindow2win=(IHTMLWindow2)webBrowser.Document.Window.DomWwin.execScript(strScript,"Javascript");
相关热词搜索:
-- 本站部分信息来源于互联网,不代表本站观点或立场,如有侵权,请来电告知,我们将及时处理获取博客园首页左上角的那段文字&代码改变世界&!&Window x:
"/winfx/2006/xaml/presentation"
"/winfx/2006/xaml"
Title="MainWindow" Height="768" Width="1024" Loaded="Window_Loaded"&
&WebBrowser x:Name="wb" /&
&/Grid&&/Window&cs:
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
this.wb.LoadCompleted += (wb_Navigated);
private void Window_Loaded(object sender, RoutedEventArgs e)
wb.Navigate(new Uri(""));
void wb_Navigated(object sender, NavigationEventArgs e)
var doc = this.wb.Document as HTMLD
var item = doc.getElementById("site_nav_top");
MessageBox.Show(item.innerText);
}有了Document就可以像web上一样操作html元素了~直接访问WebBrowser控件中的HTML源码
&为了实现在自己的程序中显示HTML文档,我们一般采用IE(Internet Explorer本文中简称为IE)发行时附带的一个ActiveX控件WebBrowser。这个控件使用和IE相同的内核,功能强大,并从Delphi5开始,正式得到Inprise公司的支持,取代了原来的那个THTML控件,成为Delphi中显示HTML文档的首选控件。&&&&&& 但是在实际编程过程中,这个控件提供的功能有很多限制,比如对HTML文档的浏览,只能通过指定URL或文件名来实现,不能像以往使用THTML控件那样直接读写HTML。因此如果程序动态生成了一段HTML文本,就必须把文本内容先写到一个临时文件,然后再将此文件的文件名传递给WebBrowser控件,实现显示。走这一个弯路使程序响应速度受到很大影响,而且容易遗留下一些&垃圾&(临时文件)。&&&&&& 在考察了一些使用了WebBrowser控件的程序后,发现大部分程序,如着名国产软件FoxMail,都是使用的通过临时文件传递HTML文档的方法;但一些国外的软件,如MS自己的OutLook Express则不存在这个问题,而因为其无需产生临时文件,因此对HTML文档的显示速度明显超过Foxmail。&
&&&&& 其实,WebBrowser控件中的Document对象,这个对象提供了一个IPersistStreamInit接口,通过此接口,我们可以方便地实现对HTML源码的读写。&&&&&& 以下是IPersistStreamInit接口的相关定义及说明:
{&IPersistStream&interface&} {$EXTERNALSYM&IPersistStream} IPersistStream&=&interface(IPersist) [{0-}] function&IsDirty:&HR&&&&& //&最后一次存盘后是否被修改 function&Load(const&stm:&IStream):&HR& //&从流中载入 function&Save(const&stm:&IS& fClearDirty:&BOOL):&HR& //&保存到流 function&GetSizeMax(out&cbSize:&Largeint):& HR&&//&取得保存所需空间大小
{&IPersistStreamInit&interface&} {$EXTERNALSYM&IPersistStreamInit} IPersistStreamInit&=&interface(IPersistStream) [{7FD-101B-AE2D-3}] function&InitNew:&HR&&//&初始化
&&&&& 首先来实现写,因为这是最迫切的要求:
procedure&SetHtml(const&WebBrowser:& TWebB&const&Html:&string); var Stream:&IS hHTMLText:&HGLOBAL; psi:&IPersistStreamI begin if&not&Assigned(WebBrowser.Document)&then&E hHTMLText&:=&GlobalAlloc(GPTR,&Length(Html)&+&1); if&0&=&hHTMLText&then&RaiseLastWin32E CopyMemory(Pointer(hHTMLText),& PChar(Html),&Length(Html)); OleCheck(CreateStreamOnHGlobal (hHTMLText,&True,&Stream)); try OleCheck(WebBrowser.Document. QueryInterface(IPersistStreamInit,&psi)); try OleCheck(psi.InitNew); OleCheck(psi.Load(Stream)); finally psi&:=&
finally Stream&:=&
&&&&& 首先,此过程需要的两个参数,WebBrowser是显示目的控件,Html是需要显示的HTML源码;
&&&&& 然后,先检查WebBrowser.Document对象是否有效,无效则退出;&&&&& 接着在全局堆里分配一块内存,将需要显示的HTML源码复制进去。&&&&& 这是因为下一步需要建立一个WebBrowser控件可以读取的流。GlobalAlloc函数的参数GPTR表示需要分配一块固定的以0初始化过的内存区域,如果分配失败则返回0,则通过RaiseLastWin32Error函数引发一个异常,提示用户;然后用CreateStreamOnHGlobal函数建立一个基于全局堆内存块的流,第二个参数如果为True则流在释放时自动释放所占全局堆内存。如果建立成功则此流和刚刚建立的内存块共用同一块内存区域。接着用WebBrowser.Document.QueryInterface函数建立一个IPersistStreamInit接口。然后就可以直接使用此接口,psi.InitNew初始化状态;psi.Load(Stream)从流中载入HTML源码。&
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。c#,winform应用程序中的webBrowser控件中显示的网页中的按钮点击怎么触发winform中的事件?_百度知道
c#,winform应用程序中的webBrowser控件中显示的网页中的按钮点击怎么触发winform中的事件?
比如显示百度页面,点击我要回答按钮后winform窗体中的textbox中显示“你点击了我要回答按钮”。
谢谢各位几怕篙侵蕻莆戈俣恭滩大侠了 最好详细点。
提问者采纳
private void button2_Click(object sender, EventArgs e)
webBrowser1.DocumentText = &&a id=link&test&/a&'&;
void link_Click(object sender, HtmlElementEventArgs e)
MessageBox.Show(&你点击了链接&);
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
HtmlElement link = webBrowser1.Document.GetElementById(&link&);//找到元素
link.Click += new HtmlElementEventHandler(link_Click);
//添加 点击事件处理函数
先谢谢了,我再说的详细些吧,我点击webBrowser中显示的指定按钮,比如“百度一下”这个按钮,会触发form中的事件,比如form中的testbox的值发生变化。
麻烦你了,大侠。
这样就改成百度的了把link_Click事件里的代码换成你的改变TextBox值
private void button2_Click(object sender, EventArgs e)
webBrowser1.Navigate(&&);
void link_Click(object sender, HtmlElementEventArgs e)
MessageBox.Show(&你点击了链接&);
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
HtmlElement link = webBrowser1.Document.GetElementById(&su&);//找到元素
link.Click += new HtmlElementEventHandler(link_Click);
//添加 点击事件处理函数
就是那个元素我不知道怎么确定
我是个新学者
就是你的那个&su&
我怎么知道其他按钮的元素啊?
看百度首页的源文件找到&input type=&submit& value=&百度一下& id=&su& class=&btn& onmousedown=&this.className='btn btn_h'& onmouseout=&this.className='btn'&&这个按钮的id是su
找到了 万分感谢
都不知道怎么感谢其实
我是个初学者 打扰你了。祝你工作顺利 身体健康 谢谢
提问者评价
其他类似问题
webbrowser的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 mfc webbrowser控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信