一直喜歡M$提供的WebBrowser控制項, 但是這幾天體驗了一下VS2005 Beta2提供的WebBrowser控制項, 感覺超級不爽, 雖然以前夢寐以求的功能(比如去掉3D邊框, 控制Ctrl+N快速鍵, 自訂操作功能表)都被整合到這個控制項裡來了, 但是總感覺功能還是不夠強大, 因此想從這個控制項繼承下來加以定製, 但是瀏覽了它所提供的所有屬性, 卻找不到原來的AxWebBrowser所提供的Application屬性, 而Document成員對象的類型也成了HtmlDocument類. 這下可犯了難了, 該怎麼樣擴充啊! 經過查閱, 從寥寥無幾的幾篇文章中得知2005提供的WebBrowser是Web控制項的託管版本, 看來想通過com的方法加以擴充是沒門了(哪位兄弟知道請不吝賜教^_^)
既然不能擴充這個託管版本的WebBrowser, 那麼就拿AxWebBrowser開刀吧! 說做就做, 拿出AxImpl, TlbImp等工具就是一個猛搞, 弄到了所需的介面定義和常量聲明, 並從AxWebBrowser控制項派生出一個新控制項WebBrowserEx, 一切順利進行, 既然要定製, 當然少不了IDocHostUIHandler介面, 實現了IDocHostUIHandler介面, F5運行, 唉, 怎麼捲軸還是3d而不是Flat的啊! 仔細一想, 原來忘了把介面實現掛上去了, 那就掛吧, 掛接代碼如下:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using mshtml;
using SHDocVw;
using System.Runtime.InteropServices;
using System.Reflection;
namespace WBExtended
{
[System.ComponentModel.ToolboxItem(true)]
public partial class WebBrowserEx : AxWebBrowser,
IDocHostUIHandler,
IOleClientSite,
IServiceProvider
{
...
protected override void OnCreateControl()
{
IOleObject obj = this.GetOcx() as IOleObject;
if (obj != null)
{
IOleClientSite ocs = this as IOleClientSite;
if (ocs != null) obj.SetClientSite(ocs);
}
}
}
}
看到那個SetClientSite沒有, 問題出來了, 看似正常的代碼居然報了一個大大的異常:
鬱悶了許久, 始終沒有找到解決方案, 不知哪位達人知道怎麼回事, 一定要告訴小弟啊!!! 先謝謝啦