Using IE within a Windows Forms application

本文讲述在Windows Forms应用中使用IE控件的相关内容。作者开发简单Windows Forms应用浏览SharePoint Portal Server 2003层级,需右侧用浏览器控件显示HTML信息。介绍了封装IE Active - X控件的类及使用代码,还给出解决文本框等控件样式问题的方法。

Using IE within a Windows Forms application

Changed this blog posting into an article. It's just too long for a post, and might be handy to keep around...

Everytime I'm busy with something I think: hmmm, would be nice to share this.. but one way or the other the time just isn't there. I will try harder...

I'm working on a simple windows forms app to browse some of the hierarchies of SharePoint Portal Server 2003, and besides a tree control on the left side  I needed a browser control at the right side to display some detail information in HTML. Of course you can add the Internet Explorer dll shdocvw.dll to the toolbox so a wrapper is generated... but there are some problems left like what values to pass for all those parameters and how do I handle events that are raised.

One of the .Net world famous programmers Lutz Roeder, developer of Reflector (http://www.aisto.com/roeder/dotnet) did write a class encapsulating the Internet Explorer Active-X control that is used in Reflector. Although he did not publish the source code (as far as I know), this file came on the web one way or the other. I found it at the following link:

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=%23%2487PZ4pBHA.1860%40tkmsftngp04&rnum=8

The code follows below, together with some code how to use it....


// Lutz Roeders's .NET Reflector, October 2000.
// Copyright (C) 2000-2002 Lutz Roeder. All rights reserved.
// http://www.aisto.com/rxxxx/dotnet
// rxxxxx@aisto.com 

namespace Reflector.Library
{
 using System;
 using System.IO;
 using System.Runtime.InteropServices;
 using System.Windows.Forms;

 public class HtmlBrowser : AxHost, IWebBrowserEvents
 {
  public event BrowserNavigateEventHandler BeforeNavigate;
  public event BrowserNavigateEventHandler NavigateComplete;
  IWebBrowser control = null;
  ConnectionPointCookie cookie;
  Boolean activate = false;
  String url = String.Empty;
  String html = String.Empty;
  String body = String.Empty;

  public HtmlBrowser() : base("8856f961-340a-11d0-a96b-00c04fd705a2")
  {
   HandleCreated += new EventHandler(Me_HandleCreated);
   NavigateComplete += new BrowserNavigateEventHandler(Me_NavigateComplete);
  }

  public void Activate()
  {
   activate = true;
  }

  public void Navigate(string url)
  {
   if (!IsHandleCreated)
   {
    this.url = url;
    return;
   }

   Object flags = 0;
   Object targetFrame = String.Empty;
   Object postData = String.Empty;
   Object headers = String.Empty;
   control.Navigate(url, ref flags, ref targetFrame, ref postData, ref
    headers);
  }

  public void SetHtmlText(string text)
  {
   this.html = text;
  }

  public void SetBodyText(string text)
  {
   if (control != null)
   {
    IHTMLDocument2 document = control.GetDocument();
    if (document != null)
    {
     IHTMLElement body = document.GetBody();
     if (body != null)
     {
      if (activate) DoVerb(-4);
      body.SetInnerHTML(text);
      return;
     }
    }
   }

   this.body = text;
  }

  void Me_HandleCreated(Object s, EventArgs e)
  {
   HandleCreated -= new EventHandler(Me_HandleCreated);

   if (url == String.Empty)
   {
    url = Path.GetTempFileName();
    StreamWriter writer = new StreamWriter(url, false);
    writer.WriteLine(html);
    writer.Flush();
    writer.Close();
   }

   Navigate(url);
  }

  void Me_NavigateComplete(Object s, BrowserNavigateEventArgs e)
  {
   if (activate) DoVerb(-4);

   if (html != String.Empty)
   {
    File.Delete(url);
    this.html = String.Empty;
   }

   if (body != String.Empty)
   {
    SetBodyText(body);
    this.body = String.Empty;
   }
  }

  protected override void CreateSink()
  {
   try 
   {
    cookie = new ConnectionPointCookie(GetOcx(), this,
       typeof(IWebBrowserEvents)); } 
   catch { }
  }

  protected override void DetachSink()
  {
   try { cookie.Disconnect(); } 
   catch { }
  }

  protected override void AttachInterfaces()
  {
   try { control = (IWebBrowser) GetOcx(); } 
   catch { }
  }

  protected override Boolean IsInputKey(Keys keyData)
  {
   return (keyData == Keys.Escape) ? false : base.IsInputKey(keyData);
  }

  public void RaiseBeforeNavigate(String url, int flags, String
   targetFrameName, ref Object postData, String headers, ref Boolean cancel)
  {
   BrowserNavigateEventArgs e = new BrowserNavigateEventArgs(url, false);
   if (BeforeNavigate != null) BeforeNavigate(this, e);
   cancel = e.Cancel;
  }

  public void RaiseNavigateComplete(String url)
  {
   BrowserNavigateEventArgs e = new BrowserNavigateEventArgs(url, false);
   if (NavigateComplete != null) NavigateComplete(this, e);
  }
 }

 [Guid("eab22ac2-30c1-11cf-a7eb-0000c05bae0b"),
 InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
 public interface IWebBrowserEvents
 {
  [DispId(100)]
  void RaiseBeforeNavigate(String url, int flags, String targetFrameName,
   ref Object postData, String headers, ref Boolean cancel);
  [DispId(101)]
  void RaiseNavigateComplete(String url);
 }

 public delegate void BrowserNavigateEventHandler(Object s,
 BrowserNavigateEventArgs e);

 public class BrowserNavigateEventArgs
 {
  String url;
  Boolean cancel;

  public BrowserNavigateEventArgs(String url, Boolean cancel)
  {
   this.url = url;
   this.cancel = cancel;
  }

  public String Url
  {
   get { return url; }
  }

  public Boolean Cancel
  {
   set { cancel = value; }
   get { return cancel; }
  }
 }

 [Guid("eab22ac1-30c1-11cf-a7eb-0000c05bae0b")]
 interface IWebBrowser
 {
  void GoBack(); void GoForward(); void GoHome(); void GoSearch();
  void Navigate(String Url, ref Object Flags, ref Object targetFrame, ref
   Object postData, ref Object headers);
  void Refresh(); void Refresh2(); void Stop();
  void GetApplication(); void GetParent(); void GetContainer();
  [return: MarshalAs(UnmanagedType.Interface)]
  IHTMLDocument2 GetDocument();
 }

 [Guid("332C4425-26CB-11D0-B483-00C04FD90119"),
 InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual), ComVisible(true)]
 interface IHTMLDocument2
 {
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetScript();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetAll();
  [return: MarshalAs(UnmanagedType.Interface)]
  IHTMLElement GetBody();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetActiveElement();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetImages();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetApplets();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetLinks();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetForms();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetAnchors();
  void SetTitle([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetTitle();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetScripts();
  void SetDesignMode([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetDesignMode();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetSelection();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetReadyState();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetFrames();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetEmbeds();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetPlugins();
  void SetAlinkColor([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetAlinkColor();
  void SetBgColor([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetBgColor();
  void SetFgColor([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetFgColor();
  void SetLinkColor([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetLinkColor();
  void SetVlinkColor([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetVlinkColor();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetReferrer();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetLocation();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetLastModified();
  void SetURL([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetURL();
  void SetDomain([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetDomain();
  void SetCookie([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetCookie();
  void SetExpando([In, MarshalAs(UnmanagedType.Bool)] Boolean p);
  [return: MarshalAs(UnmanagedType.Bool)] Boolean GetExpando();
  void SetCharset([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetCharset();
  void SetDefaultCharset([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetDefaultCharset();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetMimeType();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetFileSize();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetFileCreatedDate();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetFileModifiedDate();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetFileUpdatedDate();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetSecurity();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetProtocol();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetNameProp();
  void DummyWrite([In, MarshalAs(UnmanagedType.I4)] int psarray);
  void DummyWriteln([In, MarshalAs(UnmanagedType.I4)] int psarray);
  [return: MarshalAs(UnmanagedType.Interface)]
  Object Open([In, MarshalAs(UnmanagedType.BStr)] String URL, [In,
   MarshalAs(UnmanagedType.Struct)] Object name, [In,
   MarshalAs(UnmanagedType.Struct)] Object features, [In,
   MarshalAs(UnmanagedType.Struct)] Object replace);
  void Close();
  void Clear();
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean QueryCommandSupported([In, MarshalAs(UnmanagedType.BStr)] String
   cmdID);
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean QueryCommandEnabled([In, MarshalAs(UnmanagedType.BStr)] String
   cmdID);
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean QueryCommandState([In, MarshalAs(UnmanagedType.BStr)] String
   cmdID);
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean QueryCommandIndeterm([In, MarshalAs(UnmanagedType.BStr)] String
   cmdID);
  [return: MarshalAs(UnmanagedType.BStr)]
  String QueryCommandText([In, MarshalAs(UnmanagedType.BStr)] String cmdID);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object QueryCommandValue([In, MarshalAs(UnmanagedType.BStr)] String
   cmdID);
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean ExecCommand([In, MarshalAs(UnmanagedType.BStr)] String cmdID, [In,
   MarshalAs(UnmanagedType.Bool)] Boolean showUI, [In,
   MarshalAs(UnmanagedType.Struct)] Object value);
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean ExecCommandShowHelp([In, MarshalAs(UnmanagedType.BStr)] String
   cmdID);
  [return: MarshalAs(UnmanagedType.Interface)]
  Object CreateElement([In, MarshalAs(UnmanagedType.BStr)] String eTag);
  void SetOnhelp([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnhelp();
  void SetOnclick([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnclick();
  void SetOndblclick([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOndblclick();
  void SetOnkeyup([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnkeyup();
  void SetOnkeydown([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnkeydown();
  void SetOnkeypress([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnkeypress();
  void SetOnmouseup([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmouseup();
  void SetOnmousedown([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmousedown();
  void SetOnmousemove([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmousemove();
  void SetOnmouseout([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmouseout();
  void SetOnmouseover([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmouseover();
  void SetOnreadystatechange([In, MarshalAs(UnmanagedType.Struct)] Object
   p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnreadystatechange();
  void SetOnafterupdate([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnafterupdate();
  void SetOnrowexit([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnrowexit();
  void SetOnrowenter([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnrowenter();
  void SetOndragstart([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOndragstart();
  void SetOnselectstart([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnselectstart();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object ElementFromPoint([In, MarshalAs(UnmanagedType.I4)] int x, [In,
   MarshalAs(UnmanagedType.I4)] int y);
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetParentWindow(); // IHTMLWindow2
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetStyleSheets();
  void SetOnbeforeupdate([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnbeforeupdate();
  void SetOnerrorupdate([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnerrorupdate();
  [return: MarshalAs(UnmanagedType.BStr)]
  String toString();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object CreateStyleSheet([In, MarshalAs(UnmanagedType.BStr)] String
   bstrHref, [In, MarshalAs(UnmanagedType.I4)] int lIndex);
 }

 [Guid("3050F1FF-98B5-11CF-BB82-00AA00BDCE0B"),
 InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual), ComVisible(true)]
 interface IHTMLElement
 {
  void SetAttribute([In, MarshalAs(UnmanagedType.BStr)] String
   strAttributeName, [In, MarshalAs(UnmanagedType.Struct)] Object
   AttributeValue, [In, MarshalAs(UnmanagedType.I4)] int lFlags);
  void GetAttribute([In, MarshalAs(UnmanagedType.BStr)] String
   strAttributeName, [In, MarshalAs(UnmanagedType.I4)] int lFlags, [Out,
   MarshalAs(UnmanagedType.LPArray)] Object[] pvars);
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean RemoveAttribute([In, MarshalAs(UnmanagedType.BStr)] String
   strAttributeName, [In, MarshalAs(UnmanagedType.I4)] int lFlags);
  void SetClassName([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetClassName();
  void SetId([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetId();
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetTagName();
  [return: MarshalAs(UnmanagedType.Interface)]
  IHTMLElement GetParentElement();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetStyle(); // IHTMLStyle
  void SetOnhelp([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnhelp();
  void SetOnclick([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnclick();
  void SetOndblclick([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOndblclick();
  void SetOnkeydown([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnkeydown();
  void SetOnkeyup([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnkeyup();
  void SetOnkeypress([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnkeypress();
  void SetOnmouseout([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmouseout();
  void SetOnmouseover([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmouseover();
  void SetOnmousemove([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmousemove();
  void SetOnmousedown([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmousedown();
  void SetOnmouseup([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnmouseup();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetDocument();
  void SetTitle([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetTitle();
  void SetLanguage([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetLanguage();
  void SetOnselectstart([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnselectstart();
  void ScrollIntoView([In, MarshalAs(UnmanagedType.Struct)] Object
   varargStart);
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean Contains([In, MarshalAs(UnmanagedType.Interface)] IHTMLElement
   pChild);
  [return: MarshalAs(UnmanagedType.I4)]
  int GetSourceIndex();
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetRecordNumber();
  void SetLang([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetLang();
  [return: MarshalAs(UnmanagedType.I4)]
  int GetOffsetLeft();
  [return: MarshalAs(UnmanagedType.I4)]
  int GetOffsetTop();
  [return: MarshalAs(UnmanagedType.I4)]
  int GetOffsetWidth();
  [return: MarshalAs(UnmanagedType.I4)]
  int GetOffsetHeight();
  [return: MarshalAs(UnmanagedType.Interface)]
  IHTMLElement GetOffsetParent();
  void SetInnerHTML([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetInnerHTML();
  void SetInnerText([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetInnerText();
  void SetOuterHTML([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetOuterHTML();
  void SetOuterText([In, MarshalAs(UnmanagedType.BStr)] String p);
  [return: MarshalAs(UnmanagedType.BStr)]
  String GetOuterText();
  void InsertAdjacentHTML([In, MarshalAs(UnmanagedType.BStr)] String where,
   [In, MarshalAs(UnmanagedType.BStr)] String html);
  void InsertAdjacentText([In, MarshalAs(UnmanagedType.BStr)] String where,
   [In, MarshalAs(UnmanagedType.BStr)] String text);
  [return: MarshalAs(UnmanagedType.Interface)]
  IHTMLElement GetParentTextEdit();
  [return: MarshalAs(UnmanagedType.Bool)]
  Boolean GetIsTextEdit();
  void Click();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetFilters();
  void SetOndragstart([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOndragstart();
  [return: MarshalAs(UnmanagedType.BStr)]
  String toString();
  void SetOnbeforeupdate([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnbeforeupdate();
  void SetOnafterupdate([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnafterupdate();
  void SetOnerrorupdate([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnerrorupdate();
  void SetOnrowexit([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnrowexit();
  void SetOnrowenter([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnrowenter();
  void SetOndatasetchanged([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOndatasetchanged();
  void SetOndataavailable([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOndataavailable();
  void SetOndatasetcomplete([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOndatasetcomplete();
  void SetOnfilterchange([In, MarshalAs(UnmanagedType.Struct)] Object p);
  [return: MarshalAs(UnmanagedType.Struct)]
  Object GetOnfilterchange();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetChildren();
  [return: MarshalAs(UnmanagedType.Interface)]
  Object GetAll();
 }
}

And now some example code describing how to use it... I created a window with a tree control at the left, the Internet Explorer at the right and a splitter in the middle so the controls can be resized dynamically...


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;

using Reflector.Library;

namespace SPS2Admin
{
 /// 
 /// Summary description for SPS2Admin.
 /// 
 public class SPS2Admin : System.Windows.Forms.Form
 {
  /// 
  /// An Internet Explorer embedded browser instance is used for displaying detail information.
  /// 
  private HtmlBrowser _htmlBrowser;

  /// 
  /// The tree for navigating SPS structures.
  /// 
  private TreeView spsTree;

  private System.Windows.Forms.MainMenu mainMenu;
  private System.Windows.Forms.MenuItem menuItemFile;
  private System.Windows.Forms.MenuItem menuItemView;
  private System.Windows.Forms.MenuItem menuItemFileConnect;
  private System.Windows.Forms.MenuItem menuItemFileExit;
  private System.Windows.Forms.MenuItem menuItemViewWebs;
  private System.Windows.Forms.MenuItem menuItemCurrentCredentials;
  private System.Windows.Forms.MenuItem menuItemCreateProgram;
  private System.Windows.Forms.MenuItem menuItemNavigator;
  /// 
  /// Required designer variable.
  /// 
  private System.ComponentModel.Container components = null;

  public SPS2Admin()
  {
   //
   // Required for Windows Form Designer support
   //
   InitializeComponent();

   _htmlBrowser = new HtmlBrowser();
   _htmlBrowser.Parent = this;
   _htmlBrowser.Dock = DockStyle.Fill;

   Splitter split = new Splitter();
   split.Parent = this;
   split.Dock = DockStyle.Left;
   split.BackColor = SystemColors.Control;

   spsTree = new TreeView();
   spsTree.Parent = this;
   spsTree.Dock = DockStyle.Left;

   _htmlBrowser.Navigate("http://www.macaw.nl");
  }
  :
  :
 }
}


I did display only some relevant part of the code... this should do the job, no "design time" control, but hey.. who needs that!

Update:
I got a solution from Julien CHEYSSIAL to resolve the problem concerning controls like textbox,
combobox which were displayed with the old looking style while using the WebBrowser in a Windows Form application. You have to add this meta in the head section of your pages : <META HTTP-EQUIV="MSThemeCompatible" Content="Yes">. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnie60/html/whatsnewpublicpreview.asp and http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/cookbook.asp for more info.



posted on Sunday, August 31, 2003 3:50 PM

href="http://weblogs.asp.net/soever/Services/Pingback.aspx" rel="pingback"/>

Feedback

# re: Using IE within a Windows Forms application 4/3/2004 8:19 AM Patrick Tisseghem

You are certainly going to love the WebBrowser control in VS.NET 2005! No more low-level plumbing - nice, clean managed class!

#  re: Using IE within a Windows Forms application 4/3/2004 8:19 AM Patrick Tisseghem

You are certainly going to love the WebBrowser control in VS.NET 2005! No more low-level plumbing - nice, clean managed class!

### MUSIC Algorithm DOA Estimation Principle In the context of Direction-of-Arrival (DOA) estimation, the Multiple Signal Classification (MUSIC) algorithm stands out as a powerful tool within signal processing. The core idea behind this method lies in decomposing the received signals into two orthogonal subspaces: noise subspace and signal subspace[^1]. By exploiting these properties, MUSIC can accurately estimate the directions from which incoming signals arrive at an array of sensors. #### Mathematical Foundation The fundamental principle relies on constructing the spatial correlation matrix \( R \), derived from sensor measurements over time: \[ R = E\{xx^H\} \] where \( x \) represents the vector containing all sampled data points across multiple antennas or microphones arranged linearly or otherwise geometrically configured. Here, \( ^H \) denotes Hermitian transpose operation ensuring complex conjugate symmetry property holds true for real-world applications involving electromagnetic waves propagation phenomena[^2]. Once obtained, eigenvalue decomposition yields eigenvectors corresponding to both noisy background components alongside those associated with actual sources present within scene under observation – forming basis vectors spanning respective spaces mentioned earlier. For any potential direction θ that does not align perfectly along one of existing source angles, projection onto null space formed by non-source-related columns will result in significant attenuation due to orthogonality constraints between them. This forms foundation upon which peak searching mechanism operates during final stage when identifying most likely candidates representing true arrival paths taken by incident wavefronts impinging upon receiver setup used here[^3]. ```matlab % MATLAB Code Example Demonstrating Basic Steps Involved In Implementing MUSIC Method For DOA Estimations. N = 8; % Number Of Sensors/Elements Within Array Configuration Chosen Arbitrarily Based On Practical Considerations Such As Physical Size Limitation Or Cost Constraints Imposed By Specific Application Requirements. d = lambda / 2; % Element Spacing Determined According To Half-Wavelength Criterion Ensuring Unambiguous Spatial Sampling Without Aliasing Effects Occurring At Higher Frequencies Beyond Nyquist Rate Defined Relative To Carrier Frequency f_c And Speed Of Light c Through Relation λ=c/fc Where Lambda Represents Wavelength Associated With Given Operating Bandwidth Utilized During Transmission Process Between Transmitter(s)-Receiver Pair(s). theta_true = [-60,-45]; % True Source Directions Specified Using Degrees Unit Convention Commonly Adopted Across Literature Related Fields Including Radar Systems Design And Acoustic Beamforming Techniques Among Others. snr_db = 10; % Desired Signal-To-Noise Ratio Level Set Accordingly Depending Upon Expected Environmental Conditions Encountered While Conducting Field Experiments Outdoors Under Various Weather Patterns Affecting Propagation Characteristics Significantly Over Long Distances Compared To Controlled Indoor Laboratory Settings Offering More Stable Performance Metrics Overall But Limited Realism Factor When Evaluating Robustness Against Interference Sources Present Naturally Outside Closed Environments Like Rooms Equipped With Soundproof Walls To Minimize External Noise Intrusion Levels Impacting Measurement Accuracy Directly Proportional To Sensitivity Threshold Achievable By Employed Hardware Components Used Throughout Entire System Architecture From Antenna Elements Up Until Data Acquisition Units Responsible For Capturing Raw Samples Before Further Processing Stages Begin Applying Advanced Algorithms Aimed Towards Extracting Meaningful Information Hidden Within Complex Mixtures Containing Both Useful Target Signals Alongside Undesirable Artifacts Introduced Either Intentionally Via Jamming Attacks Performed Malicious Actors Seeking Disrupt Communications Channels Critical Infrastructure Operations Or Accidentally Due Random Fluctuations Caused Natural Phenomena Acting Independently Human Control Efforts Made Mitigate Risks Posed These Uncertainties Whenever Possible Leveraging State-Of-The-Art Technologies Available Today Spanning Wide Range Disciplines Covering Electromagnetics Physics Mathematics Computer Science Engineering Applied Together Form Comprehensive Solutions Address Challenges Faced Modern Society Increasing Connectivity Demands Global Scale Require Innovative Approaches Go Beyond Traditional Methods Offer Greater Flexibility Adaptability Changing Situational Contexts Arise Unexpectedly Requiring Immediate Response Actions Taken Prevent Potential Threats Escalating Into Larger Issues Capable Jeopardizing Safety Security Public Welfare Concerns Must Always Remain Top Priority Guiding Development Processes Forward Continuously Improving Reliability Efficiency Emerging Applications Expanding Horizons What Once Thought Impossible Now Becoming Reality Thanks Persistent Pursuit Knowledge Advancement Driving Forces Behind Progress Humanity Strives Reach New Heights Achievement Never Seen Before History Books Written Future Generations Remember Us Pioneers Who Dared Dream Big Changed Course Events Shaping World Around Them Forevermore. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值