C# (轉載)webbrowser專題(參考資料:https://www.cnblogs.com/blogpro/p/11458390.html)

来源:https://www.cnblogs.com/Bull-Rush/archive/2019/12/18/12058138.html
-Advertisement-
Play Games

C# .Net 2.0實例學習:WebBrowser頁面與WinForm交互技巧 2 Study Case 4:高亮顯示 上一個例子中我們學會了查找文本——究跟到底,對Web頁面還是只讀不寫。那麼,如果說要把所有的搜索結果高亮顯示呢?我們很快會想到把所有匹配的文字顏色、背景改一下就可以了。首先想到的 ...


C# .Net 2.0實例學習:WebBrowser頁面與WinForm交互技巧 2

Study Case 4:高亮顯示 

上一個例子中我們學會了查找文本——究跟到底,對Web頁面還是只讀不寫。那麼,如果說要把所有的搜索結果高亮顯示呢?我們很快會想到把所有匹配的文字顏色、背景改一下就可以了。首先想到的可能是直接修改HTML文本吧……但是,與SourceCode的高亮顯示不同,我們需要並且只需要高亮頁面中的文本部分。HTML標簽、腳本代碼等等是絕對不應該去改動的。因此我們不能把整個頁面的Source Code讀進來然後replace,那樣有破壞HTML文件結構的可能;我們只能在能夠分離出文本與其他內容(標簽,腳本……)的前提下進行。

具體方法有很多,下麵提供兩個比較簡單的方法。
方法一:使用TextRange(IHTMLTxtRange) 
有了上一個Case的基礎,相信大家立刻會想到使用TextRange。沒錯,TextRange除了提供查找方法之外,還提供了一個pasteHTML方法,以指定的HTML文本替換當前TextRange中的內容。代碼片斷如下:
    public partial class HilightDemo : Form
     {
        // 定義高亮顯示效果的標簽。
        string tagBefore = "<span style='background-color:yellow;color:black'>";
        string tagAfter = "</span>";

        // ……

        private void btnHilight_Click(object sender, EventArgs e)
         {
             HtmlDocument htmlDoc = webBrowser.Document;
            string keyword = txtKeyword.Text.Trim();
            if (keyword == "")
                return;

            object oTextRange = htmlDoc.Body.InvokeMember("createTextRange");

             mshtml.IHTMLTxtRange txtrange = oTextRange as mshtml.IHTMLTxtRange;

            while (txtrange.findText(keyword, 1, 4))
             {
                try 
                 {
                     txtrange.pasteHTML(tagBefore + keyword + tagAfter);
                 }
                catch { }
                 txtrange.collapse(false);
             }
         }
     }

※這段代碼里獲取IHTMLTxtRange的方式和上面的例子稍稍不同,其實所謂條條大路通羅馬,本質是一樣的。

方法二:使用DOM(文檔對象模型)
將HTML文檔解析為DOM,然後遍歷每個節點,在其中搜索關鍵字併進行相應替換處理即可。
    public partial class HilightDemo : Form
     {
        //……

        private void btnHilight_Click(object sender, EventArgs e)
         {
             HTMLDocument document = (HTMLDocument)webBrowser.Document.DomDocument;
             IHTMLDOMNode bodyNode = (IHTMLDOMNode)webBrowser.Document.Body.DomElement;
            string keyword = txtKeyword.Text.Trim();
            if (keyword == "")
                return;

             HilightText(document, bodyNode, keyword);
         }

        private void HilightText(HTMLDocument document, IHTMLDOMNode node, string keyword)
         {
            // nodeType = 3:text節點
            if (node.nodeType == 3)
             {
                string nodeText = node.nodeValue.ToString();
                // 如果找到了關鍵字
                if (nodeText.Contains(keyword))
                 {
                     IHTMLDOMNode parentNode = node.parentNode;
                    // 將關鍵字作為分隔符,將文本分離,並逐個添加到原text節點的父節點
                    string[] result = nodeText.Split(new string[] { keyword }, StringSplitOptions.None);
                    for (int i = 0; i < result.Length - 1; i++)
                     {
                        if (result[i] != "")
                         {
                             IHTMLDOMNode txtNode = document.createTextNode(result[i]);
                             parentNode.insertBefore(txtNode, node);
                         }
                         IHTMLDOMNode orgNode = document.createTextNode(keyword);
                         IHTMLDOMNode hilightedNode = (IHTMLDOMNode)document.createElement("SPAN");
                         IHTMLStyle style = ((IHTMLElement)hilightedNode).style;
                         style.color = "black";
                         style.backgroundColor = "yellow";
                         hilightedNode.appendChild(orgNode);

                         parentNode.insertBefore(hilightedNode, node);
                     }
                    if (result[result.Length - 1] != "")
                     {
                             IHTMLDOMNode postNode = document.createTextNode(result[result.Length - 1]);
                             parentNode.insertBefore(postNode, node);
                     }
                     parentNode.removeChild(node);
                 } // End of nodeText.Contains(keyword)
             }
            else 
             {
                // 如果不是text節點,則遞歸搜索其子節點
                 IHTMLDOMChildrenCollection childNodes = node.childNodes as IHTMLDOMChildrenCollection;
                foreach (IHTMLDOMNode n in childNodes)
                 {
                     HilightText(document, n, keyword);
                 }
             }
         }
     }
上面的兩段代碼都是為了清晰易懂而精簡得不能再簡的,有很多地方很不完善。比如,沒考慮到如何從高亮顯示狀態複原;也沒有大小寫匹配等等。當然,掌握了原理之後相信這些都不會太難。

這兩種方法各有優缺點:
使用TextRange較輕量迅速,而且有一個特長,就是可以把跨標簽(Tag)的關鍵字挑出來。例如,有這麼一段HTML:
<b>Hel</b>lo World!
先不管作者出於什麼目的讓Hel三個字母成為粗體,總之顯示在頁面上的是一句“Hello World!”。在我們希望高亮頁面中的“Hello”這個關鍵字時,如果用DOM分析的話,會得出含有“Hel”的<b>節點和文本節點“lo World!”兩個節點,因此無法將其挑出來。而TextRange則能正確識別,將其設置為高亮。因此也可以說TextRange是只和文本有關,和HTML語法結構無關的對象。

但是,TextRange也有其致命缺點,加亮容易,反向的話就很難。換句話說,去除高亮顯示的時候不能再用TextRange,而需要採用其他方法。

而DOM方法則正好相反, 由於DOM的樹狀結構特性,雖然不能(或者很難)跨越Tag搜索關鍵字,但是去除高亮顯示並不繁瑣。

Study Case 5:與腳本的互操作 

在Case 1當中,我們已經看到,Web頁面的HTML元素的事件,可以由Windows Form端來響應,可以在某種程度上看作是Web頁面調用WinForm;那麼反過來,WinForm除了可以直接訪問Web頁面的HTML元素之外,能否調用Web頁面里的各種Script呢?

首先是調用Web頁面的腳本中已經定義好的函數。假設HTML中有如下Javascript:
function DoAdd(a, b) {
    return a + b;
}
那麼,我們要在WinForm調用它,只需如下代碼即可:
object oSum = webBrowser.Document.InvokeScript("DoAdd", new object[] { 1, 2 });
int sum = Convert.ToInt32(oSum);
其次,如果我們想執行一段Web頁面中原本沒有的腳本,該怎麼做呢?這次.Net的類沒有提供,看來還要依靠COM了。IHTMLWindow2可以將任意的字元串作為腳本代碼來執行。
string scriptline01 = @"function ShowPageInfo() {";
string scriptline02 = @"      var numLinks = document.links.length; ";
string scriptline03 = @"      var numForms = document.forms.length; ";
string scriptline04 = @"      var numImages = document.images.length; ";
string scriptline05 = @"      var numScripts = document.scripts.length; ";
string scriptline06 = @"      alert('網頁的統計結果:\r\n鏈接數:' + numLinks + ";
string scriptline07 = @"         '\r\n表單數:' + numForms + ";
string scriptline08 = @"         '\r\n圖像數:' + numImages + ";
string scriptline09 = @"         '\r\n腳本數:' + numScripts);}";
string scriptline10 = @"ShowPageInfo();";

string strScript = scriptline01 + scriptline02 + scriptline03 + scriptline04 + scriptline05 +
                    scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10;

IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;
win.execScript(strScript, "Javascript");
OK,今天就寫到這裡吧,再想起什麼來再補充吧。歡迎大家多多指正,歡迎討論。
View Code

C# WebBrowser製作的HTML文本編輯器

C# WebBrowser製作的HTML文本編輯器
· 下載源文件(http: //www.codeproject.com/cs/miscctrl/editor_in_windows_forms/editor2_src.zip) - 42.3 Kb
· 下載演示項目(http: //www.codeproject.com/cs/miscctrl/editor_in_windows_forms/editor2_demo.zip) - 19.7 Kb
· 原文:A Windows Forms based text editor with HTML output
· 類似的控制項:HTMLTextBox
 簡介
剛纔,我在編寫一個聊天應用程式,其中一個聊天客戶端是基於 web 的並以 ASP.NET 2.0 編寫,另一個聊天客戶端是 C# 編寫的基於 Windows 窗體的 .NET 應用。對於此Windows 窗體客戶端,我需要一個可以輸出 HTML 的富文本編輯器(a rich text editor) ,以便於 ASP.NET 的客戶端可以顯示 Windows 窗體客戶端的聊天內容。這樣,就排除了使用 RTF 文本框的可能。
我設計出的解決方案是在 Windows 窗體客戶端,以編輯模式使用一個 WebBrowser 控制項。對於 WebBrowser  控制項中選定的文本,同時在 WebBrowser 控制項的上方放置包含格式按鈕的工具欄,以便設置文本格式。
本文說明瞭這個方案中,使用 WebBrowser 控制項建立一個編輯器時的主要難點問題。因為源代碼不難理解,我就不深入介紹了。 但是,我會介紹一些必要的實現技巧。
WebBrowser 控制項設計模式設置
當使用此組件時,會自動應用設計模式,併為文檔建立一個編輯模板。但是,作為參考,下麵簡單說明這是如何實現的。
應用設計模式需要使用 COM 介面,添加一個 MSHTML 的 "Microsoft HTML Object Library" 的引用,並添加一個對 'MSHTML''using'。
在把改變寫入到 DOM 文檔之前,有必要添加一個 body 到控制項。要這樣做,你可以簡單地設置一些文本到 WebBrowser 控制項的 DocumentText 屬性中。
webBrowser1.DocumentText = "<html><body></body></html>"
下麵的代碼可以取得新的 DomDocument COM 介面的引用,並設置設計模式為 "On"。
IHTMLDocument2 doc =
webBrowser1.Document.DomDocument as IHTMLDocument2;
doc.designMode = "On";
最後,我把 WebBrowser 控制項的上下文菜單替換掉,這樣 IE 瀏覽器的預設上下文菜單就不會顯示出來。
webBrowser1.Document.ContextMenuShowing +=
new HtmlElementEventHandler(Document_ContextMenuShowing);
瀏覽器現在處於設計模式中,使用一個自定義方法來顯示指定的上下文菜單。
格式化文本
使用 browser.Document 中的 ExecCommand 方法,你可以把格式和編輯功能應用到設計模式下的瀏覽器控制項。
下麵是一些例子:
public void Cut()
{
 webBrowser1.Document.ExecCommand("Cut", false, null);
}
public void Paste()
{
 webBrowser1.Document.ExecCommand("Paste", false, null);
}
public void Copy()
{
 webBrowser1.Document.ExecCommand("Copy", false, null);
}
某些命令用於綁定(顯示)當前選區的格式。
public void Bold()
{
 webBrowser1.Document.ExecCommand("Bold", false, null);
}

public void Italic()
{
 webBrowser1.Document.ExecCommand("Italic", false, null);
}
同步刷新選定文本的格式按鈕
下麵介紹一些比發出格式化命令到瀏覽器更有用的技巧。每 200 毫秒,我逐一查詢瀏覽器編輯選區的狀態,並據此設置工具欄格式按鈕的狀態。
private void timer_Tick(object sender, EventArgs e)
{
 SetupKeyListener();
 boldButton.Checked = IsBold();
 italicButton.Checked = IsItalic();
 underlineButton.Checked = IsUnderline();
 orderedListButton.Checked = IsOrderedList();
 unorderedListButton.Checked = IsUnorderedList();
 linkButton.Enabled = SelectionType == SelectionType.Text;

 UpdateFontComboBox();
 UpdateFontSizeComboBox();
 if (Tick != null) Tick();
}
你可能已經註意到這兒使用了一個 Tick 計時器事件。外部的組件可以訂閱此事件來更新 GUI 的狀態。舉例來說,它們將基於編輯器控制項的狀態,刷新“剪切/複製/粘貼/撤銷/重覆”(操作)的 Enabled 狀態。
我通過使用從 WebBrowser 控制項返回的 COM 文檔介面,來完成此任務,先使用:
IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
然後,使用 queryCommandState  方法來確定當前選區的狀態:
public bool IsBold()
{
 return doc.queryCommandState("Bold");
}

public bool IsItalic()
{
 return doc.queryCommandState("Italic");
}

public bool IsUnderline()
{
 return doc.queryCommandState("Underline");
}
連接按鈕和字體控制項以一種簡單的方式管理,但我將會保留以代碼檢測的方法。
取得焦點
讓控制項取得焦點不一定是簡單的。 WebBrowser 控制項本身不接受焦點。 WebBrowser 控制項的文檔也不接受焦點。但是,body 會取得焦點,可以假定有一個 body 元素在控制項中。
private void SuperFocus()
{
 if (webBrowser1.Document != null &&
 webBrowser1.Document.Body != null)
 webBrowser1.Document.Body.Focus();
}
當然,你決不需要直接調用此方法。在控制項上調用 Focus 方法,會把焦點放置到包含了 WebBrowser 控制項的編輯器控制項上。當接收到 GotFocus  事件時,編輯器控制項會自動把焦點轉到 WebBrowser 控制項文檔的 body 上。
取得文本或 HTML
分別使用 BodyHtml 和 BodyText 方法,可以返回 HTML 和文本。
連接到組件程式集
在 Visual Studio 2005 中,你可以連接到一個程式集 (添加一個引用),即使程式集是可執行的(文件)。此編輯器是作為內嵌在窗體的組件來編寫的,因此你可以把這個組件添加到控制項面板上,並把它拖放到你的應用程式中。此控制項的名稱為 Editor,在命名空間 Design 中。
結束語
.NET 2.0 中的 WebBrowser 控制項可以作為一個有效的文本編輯器來使用。當你需要一個 HTML 編輯器控制項時,它很有用。但是在某些範圍內,不能完全直接地使用 WebBrowser 控制項來實現。本文試圖展示一些讓它工作的必要技巧。
View Code

C# webBrowser js 交互 調用

前面我也有轉載過相關文章,當時沒有測試,今天測試 ,結果不能用,以前都沒註意。
今天整理了一下 。代碼如下:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Security.Permissions;

namespace test10
{
 [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
 [System.Runtime.InteropServices.ComVisibleAttribute(true)]
 public partial class MainForm : Form
 {
  
  public MainForm()
  {
   InitializeComponent();
   webBrowser1.ObjectForScripting = this;
  }
  
  void MainFormLoad(object sender, EventArgs e)
  {
   string s="";
   s+="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">";
   s+="<HTML>";
   s+=" <HEAD>";
   s+="  <TITLE> New Document </TITLE>";
   s+="  <META NAME=\"Generator\" CONTENT=\"EditPlus\">";
   s+="  <META NAME=\"Author\" CONTENT=\"\">";
   s+="  <META NAME=\"Keywords\" CONTENT=\"\">";
   s+="  <META NAME=\"Description\" CONTENT=\"\">";
   s+="  <script>";
   s+=" function ShopXG(inf)";
   s+=" {";
   s+="  alert(inf);";
   s+=" }";
   s+=" var as = 'as';";
   s+="  </script>";
   s+="";
   s+="";
   s+=" </HEAD>";
   s+="";
   s+=" <BODY>";
   s+="  <input type=\"button\" value=\"調用 js 方法\" onClick=\"ShopXG('123123123')\" />";
   s+="  <input type=\"button\" value=\"調用 C# 方法\" onclick=\"window.external.te('我調用到了 C# 方法');\"/>";//調用 C# 的te 方法
   s+="  <input id=\"btnId\" type=\"button\" value=\"C#添加事件\"/>";
   s+=" </BODY>";
   s+="</HTML>";
   webBrowser1.DocumentText =s;
  }
  
  void Button1Click(object sender, EventArgs e)
  {
   HtmlElement el = webBrowser1.Document.GetElementById("btnId");
   el.Click+= new HtmlElementEventHandler(BtnClick);//為 web 按鈕添加事件
  }
  
  void Button2Click(object sender, EventArgs e)
  {
   webBrowser1.Document.InvokeScript("ShopXG", new string[] {"我調用到了 js 方法"});//調用 web ShopXG方法
  }

  void BtnClick(object sender, EventArgs e){
   MessageBox.Show("C# 添加事件到 js");
  }
  
  public void te(string s)
  {
   MessageBox.Show(s);
  }
 }
}
View Code

C#通過webbrowser控制項與javascript交互

C#通過webbrowser控制項與javascript交互
1.C#里調用控制項裡面網頁的js函數
// 調用JavaScript的messageBox方法,並傳入參數
object[] objects = new object[1];
objects[0] = “C#訪問JavaScript腳本”;
this.webBrowser1.Document.InvokeScript(“messageBox”, objects);
//object就是傳入的參數,而messageBox則是網頁中預定義好的js函數。
通過這種方式C#裡面就可以執行Javascript函數,可以把上面的代碼放到一個button的click事件裡面。
2.C#windows窗體應用webbrowser控制項里網頁js調用C#窗體的函數
首先需要在代碼裡面加上
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Form1 : Form
{
…..//
}
這樣使得C#的com對象是對網頁里的javascript可見的。
然後在嵌入網頁裡面通過“window.external.MyMessageBox(‘javascript訪問C#代碼’)” ,即通過window.external捕獲調用c#定義好的函數。
具體Form.cs代碼如下(通過vs2008創建的c#window窗體應用,拖拽上一個webbrowser控制項和button控制項。):
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.IO.FileInfo file = new System.IO.FileInfo(“test.html”);
// WebBrowser控制項顯示的網頁路徑
this.webBrowser1.Url = new Uri(file.FullName);
// 將當前類設置為可由腳本訪問
this.webBrowser1.ObjectForScripting =this;
}
private void button1_Click(object sender, EventArgs e)
{
}
// 提供給JavaScript調用的方法
public void MyMessageBox(string message)
{
MessageBox.Show(message);
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
}
private void button1_Click_1(object sender, EventArgs e)
{
// 調用JavaScript的messageBox方法,並傳入參數
object[] objects = new object[1];
objects[0] = “C#訪問JavaScript腳本”;
this.webBrowser1.Document.InvokeScript(“messageBox”, objects);
}
}
test.html內容比較簡單:
<html>
<head>
<meta http-equiv=”Content-Language” content=”zh-cn”>
<script language=”javascript” type=”text/javascript”>
<!– 提供給C#程式調用的方法 –>
function messageBox(message)
{
alert(message);
}
</script>
</head>
<body>
<!– 調用C#方法 –>
<button onclick=”window.external.MyMessageBox(‘javascript訪問C#代碼’)” >
javascript訪問C#代碼</button>
</body>
</html>
配置運行成功的話,可以看到相互調用的效果,希望對需要的童鞋有用!
補充一個js調用C#函數的方法:
1,設置腳本對象:

wb.ObjectForScripting = this; // wb為Webbrowser對象
2,公開方法
public void Alert()
{
MessageBox.Show("dkkfdkf");
}
3,然後頁面上用javascript可以調用這個方法
external.Alert();
 看了高人的博客,再補充幾個,哈:
Winform WebBrowser控制項對訪問頁面執行、改寫、添加Javascript代碼
 
大家有興趣可以加我QQ群交流:14792063 廣州軟體開發團隊使用Winform WebBrowser控制項對訪問頁面執行、改寫、添加Javascript代碼,可以解決許多問題,實現你想要的效果。可以通過引用Microsoft.mshtml,實現對Javascript的操作,代碼如下:代碼mshtml.IHTMLDocument2 doc = webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2;win.execScript(@"alert('hello webbrowser')", "javascript"); 其實還有一種更好的、無需引用Microsoft.mshtml的實現方式:代碼HtmlElement ele = webBrowser1.Document.CreateElement("script");ele.SetAttribute("type", "text/javascript");ele.SetAttribute("text", "alert('hello webbrowser')");webBrowser1.Document.Body.AppendChild(ele); 這種使用.Net框架本身所提供的對象,相比引用框架外的COM,好處是顯而易見的,這將更方便於安裝部署至客戶機上。 執行上述兩段代碼的效果是一樣的,都將彈出網頁對話框“hello webbrowser”。如果僅是執行Javascript方法,那麼,有更簡單的且可獲得方法返回值的方式,首先假如頁面上有如下Javascript方法:function sayHello(to) { alert('hello ' + to); return 'hi, i am javascript';} 在Winform中執行以下代碼,首先會彈出網頁對話框“hello webbrowser”,然後是Winform的MessageBox對話框“hi, i am javascript” MessageBox.Show(webBrowser1.Document.InvokeScript("sayHello",new object[]{"webbrowser"}).ToString());Winform WebBrowser控制項是一個好東西,它不但可以導航網頁,還可以使用它獲取一些在客戶端瀏覽器HTML源代碼中無法獲取的數據。如使用了AJAX獲取數據的頁面,通過客戶端瀏覽器查看源代碼的方式,將無法獲取到這部分的數據;又如使用了Javascript對內容進行加密以防止採集的頁面,即使讓你獲得HTML源代碼,也難以解密得到你想要的結果。但WebBrowser使得這一切變得簡單!有興趣的朋友歡迎繼續閱讀本博的另一篇文章《》,講述如何通過WebBrowser訪問加密頁面,改寫其中的Javascirpt方法獲取加密的結果。
View Code

Web Browser Express 概述

Web Browser Express 概述
Visual Studio 2005
8(共 8)對本文的評價是有幫助 - 評價此主題
發佈日期 : 8/26/2004 | 更新日期 : 8/26/2004
John Kennedy
Microsoft Corporation
摘要:建立您自己的、支持選項卡的 Web 瀏覽器,以及連接到搜索引擎的集成鏈接。
下載 WebBrowserExpress.msi 示例文件。
本頁內容

 簡介 

 利用他人成果的好處 

 設計 Web 瀏覽器 

 工作原理 

 有意思的幾點 

 擴展建議 

 小結 
簡介
Web 瀏覽器的一個功能是在同一瀏覽器視窗內打開不同選項卡或子頁,這個功能正在變得更加普及。當瀏覽多個站點時,使用選項卡來分開多個頁會保持桌面的整齊。有若幹種第三方 Web 瀏覽器在 Windows 和其他平臺上提供這一功能,如果您跟我一樣,您將發現這是一種讓人上癮的瀏覽方法。很多瀏覽器,無論是預設設置還是通過插件,也提供一種快速方法,無須直接使用搜索引擎就可以執行 Web 搜索。能夠編寫自己的瀏覽器,並使其能夠完成所有這些工作,還能把它微調並調整到完全適合您的需要,那不是很棒嗎?

圖 1:用 Visual C# Express 設計並實現自己的 Web 瀏覽器
將這些對功能的渴望變為一種全新的產品看起來好像需要大量的工作。畢竟,開發 Internet Explorer 用了多少時間?(答:很長時間。)我如何能夠只用一晚上的時間,單槍匹馬,就能複製出 Internet Explorer 的強大 HTML 呈現功能並添加我自己的新功能列表?那是因為我使用 Visual C# Express。

 返回頁首 
利用他人成果的好處
在一個晚上編寫 Web 瀏覽器的秘密在於使用其他人的成果。在本例中,秘密是使用了 C# Express WebBrowser 控制項。如果您安裝了 C# Express 並且打開了幫助,您可能已經看到了一個叫做¡°如何:用 C# Express創建 Windows 應用程式¡±的主題。這一簡短的項目將指導您完成創建 Windows 窗體應用程式所涉及的各個步驟。如果您還沒有看完,而且您對 C# 不熟悉,我建議您閱讀它。
關鍵之處是,通過使用與 C# Express 配套的控制項,創建多個應用程式(包括完整的 Web 瀏覽器)都是很容易的。一旦 WebBrowser 控制項確實已在 Windows 窗體上了,您只需告訴它哪些 URL 是要獲取並顯示的,以及是否需要返回、向前、刷新或停止。連接到 Internet、獲取數據、格式化 HTML、顯示圖形等所有困難的工作都由該控制項處理。
這個項目與幫助項目相近,除了一點,該項目創建多個 WebBrowser 控制項並將其添加到 TabControl 中的網頁上,而不是只添加一個WebBrowser 控制項到 Windows 窗體上。是的,我甚至無須編寫代碼來創建 TabControl。這是從工具箱到 Windows 窗體拖放的另一個示例。
那麼,雖然我知道這看似一個巨大而複雜的應用程式,仿佛需要數月的工作來完成,但事實上我只是連結了現有控制項間的點,就在一個晚上完成了所有工作。這就是我的編程方式!

 返回頁首 
設計 Web 瀏覽器

圖 2:從工具箱拖動控制項是編寫這一應用程式的關鍵
以下描述了我如何著手創建 Web Browser Express 項目。在從 C# Express 新項目對話框創建一個Windows 應用程式之後,我將下列控制項拖到 Windows 窗體:
TabControl:這個控制項存儲所有子頁,每個子頁能控制一個 WebBrowser 控制項。一旦它已經創建,向其添加其他頁就會很容易。為了確定它填充了整個 Windows 窗體,Dock 屬性被設定為 Fill。這使得該控制項保持與 Windows 窗體同樣大小,即便是調整大小之後。
MenuStrip:儘管這個應用程式中沒有菜單,還是存在 MenuStrip 來提供一個屏幕頂端的區域,按鈕和文本框可以添加到這個區域。另外,如果您決定添加一些菜單選項,您可以在這裡添加。我將 MenuStrip 拖出以使其變得稍大。
Buttons:需要有一些用於 Web 瀏覽的簡單控制項。按鈕被拖動到 MenuStrip 中,並調整大小,有一個圖像應用於這些按鈕。我惟一需要做的一件事就是重新繪製圖像背景,使其為淺藍色,以便看起來像 MenuStrip。
Textboxes 和 ComboBoxes :除了按鈕,我還需要一個用於 URL 和搜索字元串的文本框。實際上,URL 是一個 ComboBoxes,允許用戶輸入一個 Web 地址,並從一個下拉列表中選擇項目。這個列表是在設計器中填充的,但如果您希望的話可以以編程方式添加新項。
PictureBox:最右邊的 PictureBox 控制項是為了裝飾用的。Web 瀏覽器在下載內容時會顯示一些動畫。
timer:timer 對象用於一秒鐘數次發出一個消息。這個消息被一個叫做 timer1_tick() 的方法捕獲,並用於更改在 PictureBox 中顯示的圖像。結果是動畫。這並不算是第一流的解決方案,但是它奏效。

 返回頁首 
工作原理
當該程式啟動後,它所做的第一件事是調用 Create_a_new_tab()。此方法創建一個新選項卡頁,將其添加到 TabControl,然後在其上創建一個 WebBrowser 控制項。WebBrowser URL 被設定為“主頁”,無論它在您的系統上可能是什麼。下麵是創建新選項卡的代碼:
// Create a new Tab Page
TabPage newpage = new TabPage("Loading...");
tabControl1.TabPages.Add(newpage);
 
這是創建新 WebBrowser 控制項的代碼:
// Create a new WebBrowser control.
WebBrowser webpage = new WebBrowser();       
webpage.Parent = newpage;
webpage.Dock = DockStyle.Fill;
webpage.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webpage_DocumentCompleted);
webpage.GoHome();                              
            
 
此代碼確定 WebBrowser 的父級是 Tab 頁。它還用設置為 Fill 的 Dock 來確定它也保持在視窗的實際大小。我們還添加了一個事件處理程式:控制項通過將消息發送到您的程式來工作。您可以選擇您所聆聽的消息,以及通過將事件處理程式鏈接到消息所調用的方法。在本例中,該消息告訴我們 WebControl 已經完成了站點的載入和顯示,當完成任務時,它將調用名為 webpage_DocumentComplete() 的方法。這允許我們定義當網頁載入完畢時執行的代碼。例如,停止動畫。
Create_a_new_tab() 方法中的最後一行啟用計時器:
timer1.Enabled = true;      
 
計時器輕鬆地將小段消息發送到 timer1_tick(),它改變在 PictureBox 控制項中顯示的圖像,如下所示:
private void timer1_Tick(object sender, EventArgs e)
        {
            // This method is called by the timer, and we use it to update the
            // image displayed by the PictureBox control to create a simple
            // animation.
 
            image_animation++;
            if (image_animation > 10) image_animation = 0;
 
            switch (image_animation)
            {
                case 0: pictureBox_busy.Image = wbe.Properties.Resources.anim0; break;
                case 1: pictureBox_busy.Image = wbe.Properties.Resources.anim1; break;
                case 2: pictureBox_busy.Image = wbe.Properties.Resources.anim2; break;
...
                case 7: pictureBox_busy.Image = wbe.Properties.Resources.anim7; break;
                case 8: pictureBox_busy.Image = wbe.Properties.Resources.anim8; break;
                case 9: pictureBox_busy.Image = wbe.Properties.Resources.anim9; break;
            }
        }
 
您可以看到,計時器每次激發時,在 PictureBox 中就會顯示一個不同的圖像。使用您將一個圖像分配到按鈕或 PictureBox 控制項時顯示的對話框,從磁碟載入圖像。
程式的其餘部分由事件驅動 — 當用戶單擊按鈕或者輸入一個 Web 地址或搜索字元串時調用特定方法。
例如,Web 導航按鈕都調用當前 WebBrowser 控制項。例如,如果您單擊 Back 按鈕,會調用以下方法:
private void button_back_Click(object sender, EventArgs e)
        {
            // Go Back - if the web control can go back, do it.
            WebBrowser thiswebpage = GetCurrentWebBrowser();
            if (thiswebpage.CanGoBack)
                thiswebpage.GoBack();
        }
 
當在 Address 組合框中輸入一個 URL 時,我們使用 Web 控制項的 navigate 方法來獲取並顯示該頁。下麵的代碼使用了當前顯示在組合框中的文本並將其傳遞到 navigate 方法:
WebBrowser thiswebpage = GetCurrentWebBrowser();                
thiswebpage.Navigate(comboBoxurl.Text);
timer1.Enabled = true;  
 

 返回頁首 
有意思的幾點
在編寫這個項目時,我想到了幾個小竅門。不過,可能它們實際上並不能說是竅門,而是一些技術,當您編寫自己的代碼時可能發現它們是有用的。
使文本和組合框響應 Return 鍵。
Address ComboBoxes 和 Search TextBox 允許用戶輸入文本,然後在單擊 Go 按鈕時使用這個文本。使用 Text 屬性從控制項提取文本是很容易的。不過,如果按鍵盤上的“return”鍵就可以執行與單擊一個按鈕同樣的操作,這樣也很好。我通過從兩個文本框檢查 KeyUp 消息來使其奏效。當 KeyUp 消息到達時,我檢查它是否是 Return 鍵。如果它是,就觸發了與單擊按鈕相同的操作。
ComboBox 而非TextBox
Web Browser Express 的第一個版本將一個 TextBox用於地址 URL 和 Search 框。這很奏效,但是在實踐中每次都要手工輸入 URL 十分麻煩。我刪除了 ComboBox 並添加了一個 TextBox,用一些 URL 填充這一組合框來使用戶開始。您可以從 ComboBox 屬性資源管理器添加您自己的 URL。
集成搜索
所有流行的 Web 瀏覽器都有一個可以輸入搜索辭彙的文本框,結果會返回到 Web 頁中,而不需要首先瀏覽到搜索引擎。由於 MSN 搜索目前有了更新,這看起來是將此功能內置到我自己的 Web 瀏覽器中的最佳理由。
這非常簡單。只需查看 Internet Explorer 中 MSN 搜索上的歷史記錄,看一下搜索字元串需要使用的格式。然後 Search 方法將搜索文本追加到 URL 並定位到該鏈接,結果作為一個標準 Web 頁返回。
動畫
從圖形化 Web 瀏覽器的早期以來,從 Web 請求內容就是有跡可尋的,這樣用戶就不會以為它們的電腦出了問題,或者以為所有東西都被鎖定了。總的來說,讓用戶知道有些事在發生並且他們需要有耐心總是個好主意。
這是要實現的項目中我最喜歡的部分之一,如果您在藝術上有幾分天賦,那麼在創建能夠想象到的最酷的徽標時,您可以得到不少樂趣。在本例中,我在一個動畫程式中創建了一系列大約 12 個幀,並將其作為 BMP 圖像導出,載入到 C# Express 中。

圖 3:添加圖形十分簡單。為一個按鈕或 PictureBox 選擇圖像屬性,您可以直接從磁碟導入圖像。在開始前確定圖像的大小正確。

 返回頁首 
擴展建議
如果您已經嘗試過了 Web Browser Express,並且希望添加自己的功能,那麼我這篇文章就做得不錯。為了讓您保持忙碌,下麵還有幾個主意,讓您可以相對較快地取得進步。
歷史記錄:保留所有曾訪問過的 Web 站點的記錄,這樣再訪問它們時會比較容易。
自動完成:檢查 Return 鍵的方法也能夠檢查以前輸入過的 URL,並自動將其完成。與 Internet Explorer 相比,您可以更改這一自動完成的方式,比如可以只有在按 Tab 鍵時才自動完成。
收藏:ComboBox 由 6 個 Web 站點填充,您可以從 Properties 資源管理器很容易地更改這些站點。然而,將一個新按鈕添加到MenuStrip 取得當前正在顯示的 Web 站點並將其添加到 ComboBox 列表怎麼樣呢?用這種方法用戶可以構建起其收藏站點的列表。當程式退出並重新啟動時,您需要一些方法來保存並重新載入這個列表。
集成的 RSS 閱讀器:保持比競爭對手領先一步,儘量將 RSS 閱讀器內置到您的 Web 瀏覽器中。

 返回頁首 
小結
用 C# Express 創建應用程式的秘密在於:知道哪些控制項是可用的,以及用這些控制項可以做什麼。在本例中,只用了幾個控

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Supervisor 是用 Python 開發的 Linux/Unix 系統下的一個進程管理工具。它可以使進程脫離終端,變為後臺守護進程(daemon)。實時監控進程狀態,異常退出時能自動重啟。 Supervisor 不支持任何版本的 Window 系統;僅支持在 Python2.4 或更高版本,但 ...
  • 一、Task.Yield Task.Yield簡單來說就是創建時就已經完成的Task,或者說執行時間為0的Task,或者說是空任務,也就是在創建時就將Task的IsCompeted值設置為0。 我們知道await的Task完成時會釋放線程,然後從線程池中申請新的線程繼續執行await之後的代碼,那產 ...
  • 場景 DevExpress的下拉框控制項LookUpEdit的使用、添加item選項值、修改預設顯示值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102464577 參照上面實現的LookUpEdit實現的效果為 除了要顯示的 ...
  • 鎖定圖層是我們在AutoCAD經常需要用到的功能之一,在AutoCAD.net中,鎖定某個圖層的方法並不複雜,但是在實際使用的過程中,筆者發現鎖定圖層後,被鎖定的圖層並不能實現像AutoCAD內置命令能實現的淡顯的效果。鎖定某個圖層的方法比較簡單,其代碼如下: 1 public static voi... ...
  • 你是不是曾經膜拜那些敲幾行代碼就可以創建項目的大神,學習了命令創建項目你也可以成為大神,其實命令創建項目很簡單。 1.cmd命令行到你打算創建項目的位置 2.在該目錄下創建解決方案文件夾JIYUWU_ONE,然後使用命令創建一個解決方案,命令如下: mkdir JIYUWU_ONE cd JIYUW ...
  • 安裝很簡單,直接點擊安裝文件,然後一直點擊next就可以了。這款軟體是免費的,不需要破解。 下載地址 這裡需要使用快捷鍵【Ctrl+Shift+P】,在彈出的搜索框中輸入【configure language】,然後選擇搜索出來的【Configure Display Language】。 之後選[I ...
  • 前言:在WPF開發當中由於DataGrid控制項實現業務未達到非常理想的效果,我決定使用WinForm中的DataGridView來實現業務。 在XAML中加入以下命名空間: xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Wi ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...