Visual C#でマルチページWebブラウザを作成


一、紹介皆さんご存知のように、現在流行しているWebブラウザ、例えばMozilla FireFoxやMyIE 2などはマルチページ閲覧機能を備えており、新しいページを開くたびに自動的に新しいタブページが生成され、ページの閉じるのも簡単です.このような設計思想により、ユーザは複数のページを閲覧する際にデスクトップが非常に簡潔になり、ユーザが単一のページ表示を待つ悩みも回避される.これらのブラウザは、一般的に複数のファイルフォーマットの操作をサポートしているため、ローカルマシン上の複数のファイルを参照する場合にも便利です.
この文書では、Visual C#を使用して、このようなマルチページブラウズ機能を実装する方法について詳しく説明します.同時に、印刷、印刷プレビュー、ページプロパティ、オプション、検索、ページソースファイルの表示などの追加機能も実現しました.
  
二、肝心な技術分析
問題を解決する鍵は、ブラウザコントロールWebBrowserのNewWindow 2イベントのプログラミングです.あるファイルを表示して新しいウィンドウを生成する必要がある場合、NewWindow 2イベントがアクティブになります.このイベントは、WebBrowserコントロールの新しいウィンドウが生成される前に発生することに注意してください.例えば、新しいウィンドウまたはスクリプトにナビゲート制御windowとして機能する.Openメソッドの応答、すなわちイベントが発生します.新しいウィンドウが開くと、独自のブラウザプログラムを使用することを宣言するために、パラメータppDispをApplicationオブジェクトに設定する必要があります.このとき、「新しいウィンドウで開く」を選択すると、Webページを表示するウィンドウが新しく作成されます.RegisterAsBrowserをTRUEに設定することもできます.これにより、新しく生成されたWebBrowserコントロールがウィンドウ名の競合問題に関与します.たとえば、スクリプトの別の場所でウィンドウの名前が使用される場合、新しいウィンドウを生成するのではなく、コントロールが新しいウィンドウを開く前に既存のウィンドウ名をすべてチェックして名前の競合を回避するために使用されます.この例では、イベントに対する応答として、tabページを動的に作成し、CreateNewWebBrowser()メソッドを呼び出すことによって、そのサブコントロールとしてWebBrowserコントロールを生成します.ここで、各サブコントロールには、コントロールに関する情報を含むtagプロパティがあります.詳細は、次のソースコードを参照してください.private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
{
  AxSHDocVw.AxWebBrowser  _axWebBrowser = CreateNewWebBrowser();
  e.ppDisp = _axWebBrowser.Application;
  _axWebBrowser.RegisterAsBrowser = true;
}

private AxSHDocVw.AxWebBrowser CreateNewWebBrowser()
{
  AxSHDocVw.AxWebBrowser _axWebBrowser = new AxSHDocVw.AxWebBrowser();
  _axWebBrowser.Tag = new HE_WebBrowserTag();
  TabPage _TabPage = new TabPage();
  _TabPage.Controls.Add(_axWebBrowser);
  _axWebBrowser.Dock = DockStyle.Fill;
  _axWebBrowser.BeforeNavigate2 += new AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(this.axWebBrowser1_BeforeNavigate2);

  _axWebBrowser.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.axWebBrowser1_DocumentComplete);

  _axWebBrowser.NavigateComplete2 += new AxSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.axWebBrowser1_NavigateComplete2);

  _axWebBrowser.NavigateError += new AxSHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(this.axWebBrowser1_NavigateError);

  _axWebBrowser.NewWindow2 += new AxSHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(this.axWebBrowser1_NewWindow2);

  _axWebBrowser.ProgressChange += new AxSHDocVw.DWebBrowserEvents2_ProgressChangeEventHandler(this.axWebBrowser1_ProgressChange);

  _axWebBrowser.StatusTextChange += new AxSHDocVw.DWebBrowserEvents2_StatusTextChangeEventHandler(this.axWebBrowser1_StatusTextChange);

  _axWebBrowser.TitleChange += new AxSHDocVw.DWebBrowserEvents2_TitleChangeEventHandler(this.axWebBrowser1_TitleChange);

  _axWebBrowser.CommandStateChange += new AxSHDocVw.DWebBrowserEvents2_CommandStateChangeEventHandler(this.axWebBrowser1_CommandStateChange);

  tabControl1.TabPages.Add(_TabPage);
  tabControl1.SelectedTab = _TabPage;

  return _axWebBrowser;

}
各WebBrowserコントロールにはtagがあり、このコントロールに関連する独自の情報を含む簡単なclassとして定義されています.以下を参照してください.public class HE_WebBrowserTag
{
  public int _TabIndex = 0;
  public bool _CanBack = false;
  public bool _CanForward = false;
}

三、「検索」、「ページソースファイルの表示」、「オプション」ダイアログなどの機能を実現する.このルーチンでは、将来のシステムで変更可能な未公開のGUIDが使用されていることに注意する.1、IOleCommandTargetインタフェースを定義して一つとする.NETインタフェースは、COMインタフェースに関する参照を得るために、以下の手順に従ってください:1)付与.NETインタフェースの対応するCOMインタフェースのGUID値;2)インタフェース内のすべてのメソッドに対するタイプ宣言を含む.3)対Mshtmlを含む.dllとShdocvw.dllファイルの参照は、Visual C#.NETエンジニアリングでの操作は、A.プロジェクトメニューの下で「参照の追加」をクリックします.B.「COM」タブをクリックする.C.「Microsoft HTML Object Library」と「Microsoft Internet Control」をダブルクリックします.
4)MicrosoftHTML(MSHTML)IOleCommandTargetインタフェースへの参照参照を追加するには、プログラムネーミングスペース宣言の前に次のインタフェース宣言を含める必要があります.using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]

public struct OLECMDTEXT
{
  public uint cmdtextf;
  public uint cwActual;
  public uint cwBuf;
  [MarshalAs(UnmanagedType.ByValTStr,SizeConst=100)]public char rgwz;
}

[StructLayout(LayoutKind.Sequential)]

public struct OLECMD
{
  public uint cmdID;
  public uint cmdf;
}

// IOleCommandTarget Interop

[ComImport,

Guid("b722bccb-4e68-101b-a2bc-00aa00404770"),

InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

public interface IOleCommandTarget
{
  // : , , MSDN .NET/COM 。
  void QueryStatus(ref Guid pguidCmdGroup, UInt32 cCmds,
  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] OLECMD[] prgCmds, ref OLECMDTEXT CmdText);
  void Exec(ref Guid pguidCmdGroup, uint nCmdId, uint nCmdExecOpt, ref object pvaIn, ref object pvaOut);
}
、CGID_IWebBrowserはGUIDを定義するにはCGI_を定義しなければならない.IWebBrowserのGUIDは、MSHTMLがコマンドIDをどのように処理するかを通知します.はい.NETでは以下のように実現される.private Guid cmdGuid = new Guid("ED016940-BD5B-11CF-BA4E-00C04FD70816");
private enum MiscCommandTarget { Find = 1, ViewSource, Options }
3、Exec()を呼び出す方法は、次の3つのプロセスがExec()を正常に呼び出すことに成功したことを前提として、webBrowserというブラウザコントロールの収容されたインスタンスがすでに存在することに注意する.private mshtml.HTMLDocument GetDocument()
{
  try
  {
   mshtml.HTMLDocument htm = (mshtml.HTMLDocument)axWebBrowser2.Document;
   return htm;
  }
  catch
  {
   throw (new Exception(" WebBrowser "));
  }
}

//

public void ViewSource()
{
  IOleCommandTarget cmdt;
  Object o = new object();
  try
  {
   cmdt = (IOleCommandTarget)GetDocument();
   cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.ViewSource,
(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
  }
  catch(Exception e)
  {
   System.Windows.Forms.MessageBox.Show(e.Message);
  }
}

public void Find()
{
  IOleCommandTarget cmdt;
  Object o = new object();
  try
  {
   cmdt = (IOleCommandTarget)GetDocument();
   cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Find,
(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
  }
  catch(Exception e)
  {
   System.Windows.Forms.MessageBox.Show(e.Message);
  }
}

// “ ”

public void InternetOptions()
{
  IOleCommandTarget cmdt;
  Object o = new object();
  try
  {
   cmdt = (IOleCommandTarget)GetDocument();
   cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Options,
(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o);
  }
  catch
  {
   // : CMDID Internet Explorer
   // , , 。
   // , 。
   // , , 。
  }
}
四、本文を総括してC#編例を通じて、どのように1種のマルチページ閲覧プログラムの基本原理を実現するかを詳しく紹介する.同僚の批判と指摘を歓迎する.なお、本明細書に添付ソースプログラムはWindows 2000/にある.Net 2003/Internet Explorer 6プラットフォームでのデバッグに合格しました.