作者:(yjgx007)
很多情況下, 特別是在GUI使用者介面設計中, 漂亮和易定製的HTML使用者介面是非常受歡迎的, 當然, 還有XML定製
的GUI, 這裡暫不講述.
在VS6.0時代, 我們一直用CHTMLView類作為顯示HTML頁面的類, 事實上, 這個類正是嵌入了Web browser(以後簡
稱WB)控制項, 在事件互動方面, 它提供了一些HTML頁面導航和狀態控制的可重載的事件函數, 但是沒有提供怎樣
和HTML頁面中元素進行互動的介面, HTML使用者介面也就變得不太可能了, 當然, 熟悉ATL/COM的程式員仍然可以
擺脫MFC, 開發自已的基於WB控制項的GUI介面.
從VS.NET 2005開始Microsoft MFC 7.0的類裡多了一個CDHTMLDialog, 這個類實際上仍然嵌入了WB控制項 + 普通
的對話方塊控制項, 只不過針對HTML元素事件處理方面做了更多的工作, 詳見其父類CDHtmlEventSink, 如果你有更
強的好奇心, 你可以看下面對CDHtmlEventSink的簡要解釋, 否則, 就暫時跳過去, 以後, 我們還會講到.
------------------------------------------------------------------------------------------------
CDHtmlEventSink的功能摘要:
在建立對話方塊的時候, Web browser控制項也同時被建立, 我們知道控制項是基於COM的組件, 更進一步地Microsoft
稱它為OLE對象, 也許你不知道OLE, 建議您親自動搜尋下. 按照正常人的思維, 即然控制項可以被嵌入對話方塊, 對
話框和WB控制項一定是可以通過事件一起進行互動工作的, 如果你用過MFC, 一定非常熟悉其中的訊息映射, 甚至
你可以告訴我訊息映射宏是怎樣建立的, WB控制項的事件處理基本上與此類似, 只不過從概念上並非再是訊息
(message)映射宏, 而是事件(event)宏, 你可能有點困惑了, 沒關係, 在windows控制項的事件處理是完全基於消
息的, 你可以理解為一個特定的訊息指向了一個特定的事件. 同理, 在WB控制項中, 存在一個事件接收器(sink),
它暴露(expose)給你這個事件接收器, 你就可以收到各種各樣的事件了.
下面是WB控制項的事件映射宏的一個樣本, "ButtonOK"是WB控制項中HTML頁面的某個名稱為"ButtonOK"的元素 -
<input type="button" name="ButtonOK" value="OK" />, OnOK是CMyDialog的成員函數, 負責處理"ButtonOK"
元素的點擊事件.
BEGIN_DHTML_EVENT_MAP(CMyDialog)
DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnOK)
DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnCancel)
END_DHTML_EVENT_MAP()
------------------------------------------------------------------------------------------------
很多情況下, 我們用WB控制項用得很舒服, 甚至可以定製一些關於WB控制項在導航HTML頁面時的一些自身行為, 像導
航前的HTTP頭的修改, 因此, 把相同的操作方式應用在IE browser中, 結果是根本不執行. 這個歸咎於瀏覽器自
身的安全性問題, 在這方面我們以後將做更多探討.