利用 CHtmlView 和 HTML 製作新風格的介面 (轉)

amyz發表於2007-10-17
利用 CHtmlView 和 HTML 製作新風格的介面 (轉)[@more@]用過 Express 的很多人都對其第一頁的 HTML 介面感到新奇,很明顯這是使用 技術,加入了一些 Script 的一個網頁,但它能夠和應用進行互動操作。其實利用 VC6.0 的新加入的 MFC 類 CHtmlView ,你也可以實現這樣一個令人激動的程式介面。這個介面可以利用 HTML ,這是很有意義的,想象一下,你在 HTML 中實現的效果,全部可以放在程式的介面中,而你所做的只是寫了一個 HTML 和少量的。
   CHtmlView 是 MFC 新加入的一個類,如果你看一下 MFC 關於這個類的,就會發現在其內部封裝了介面 IBrowser2 。這個介面實際上是 的介面。也就是說,你可以透過這個類來強大的 IE 來顯示 HTML 頁面,每個人都可以利用這個類,輕鬆的寫出一個。 中也帶了一個使用這個類寫的瀏覽器的例子 MFCIE ,可以參考。

   利用 CHtmlView 顯示頁面是很簡單的。你只要在資源中加入 HTML 頁面資源,程式中加入下面一句語句就可以實現。

   LoadFromRe(ID_XXX);//ID_XXX 是資源的定義

   解決這個問題的核心是如何利用 CHtmlView 把對 HTML 頁面的操作傳送給應用程式。這裡看似很神秘,但實際上有一個技巧,可以截獲使用者的輸入。在類 CHtmlView 中有一個事件 OnBeforeNavigate2 ,當瀏覽器被重新導向之前,會啟用這個事件。比如說每當使用者按下了 HTML 中的超級連結,或者使用者在位址列輸入新的地址,還有程式設計師呼叫介面的 Navigate 方法,瀏覽器要轉向新地址的時候,都會啟用這個事件。而在這裡,當你實現 HTML 介面的時候,使用者透過點選頁面上的連結來啟用命令,所以我們可以在這個事件裡做一些處理,這個事件的引數中有兩個比較重要, lpszURL 就是在 HTML 頁面中 href 指定的地址,你可以給各個連結設定相應的地址,透過這個引數的內容就可以識別使用者點選的連結。而 pbCancel 可以指定是否取消導向,只要寫入 *pbCancel = TRUE ,導向就被取消,不會發生了, CHtmlView 顯示的還是現在的頁面。讓我們來看一下我寫的例子程式 HtmlGUI 。
void CHtmlGUIView::OnBeforeNavigate2(LPCTSTR lpszURL, D nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
// TODO: Add your specialized code here and/or call the base class

if (Procesmmand(lpszURL))
{
//URL was processed by the programmer defined code.
//cancel navigation
*pbCancel = TRUE;
}
else
{
CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}

}

BOOL CHtmlGUIView::ProcessCommand(LPCTSTR lpszURL)
{
if ( _tcscmp(lpszURL, _T("app:link1")) == 0 )
{
AfxMessageBox("Link1 was pressed, you can process your command here!");
return TRUE;
}

if ( _tcscmp(lpszURL, _T("app:link2")) == 0 )
{
AfxMessageBox("Link2 was pressed, you can process your command here!");
return TRUE;
}
//NOT processed by me.
if ( _tcscmp(lpszURL, _T("app:about")) == 0 )
{
::SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_MAINAPP_ABOUT,0,0);
return TRUE;
}
return FALSE;
}

   這裡面我寫了一個 BOOL CHtmlGUIView::ProcessCommand(LPCTSTR lpszURL) 來處理命令的對映,如果被導向的地址應該對映到程式的命令,則作相應的處理,並返回 TRUE ,表示已經被處理了,取消導向。否則返回 FALSE ,則呼叫 MFC 父類的函式,進行正常的操作。

   為了不露出破綻,最好遮蔽掉滑鼠右鍵,所以還應該過載 PreTranslateMessage ,並加入如下程式碼。
BOOL CHtmlGUIView::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
// Do not let View get Right button Message.
if ((pMsg->message == WM_RBUTTONDOWN) ||
(pMsg->message == WM_RBUTTONLCLK))
return TRUE;
else
return CHtmlView::PreTranslateMessage(pMsg);
}


   當使用者按下右鍵或者雙擊右鍵的時候,返回 TRUE ,這樣 CHtmlView 視窗就不會得到這兩條訊息了。當然你也可以利用頁面中的 Script 來實現這個功能。

   另外在寫 HTML 頁面時有一些東西要注意。為了使資源中的 HTML 檔案能夠得到訪問,為 IE 定義了一個可以稱為 res 的東西。你可以在 IE 的位址列中輸入 res://x:xxxhtmlgui.exe/gui.htm ( x:xxx 為路徑), IE 中應該顯示出我的程式的 HTML 檔案。其實當你用 IE 訪問頁面出錯的的時候, IE 顯示的出錯資訊也是放在 C:SYSTEMSHDOCLC.DLL 中的。 HTML 中用到的圖片,等等,顯然也要放入程式資源中才比較好。所以這些東西要全部當作 HTML 加入到資源中。而且,最好直接使用檔名用作資源 ID ,在資原始檔中按下面格式加入定義。
GUI.HTM HTML DISCARDABLE "resgui.htm"
PIC1.JPG HTML DISCARDABLE "respic1.jpg"
WRITE.GIF HTML DISCARDABLE "reswrite.gif"
CHIMES.WAV HTML DISCARDABLE "resChimes.wav"

   雖然 VC 的資源編輯器會把他們當作文字來顯示,但是不要擔心。只要你不要按文字去編輯他們就行了, CHtmlView 在載入頁面的時候會正確顯示他們的。不過千萬不要把他們當作自定義或其他資源來加入,如果你那樣做了, CHtmlView 載入時反而會不認識他們。為了確保 HTML 被正確顯示,所有的圖片和聲音能被找到,所以在 HTML 檔案中加入下面一行。

   < BASE url="res://HtmlGUI.exe/GUI.HTM">

   CHtmlView 還有一個函式 CHtmlView::GetHtmlDocument 可以得到 Ative Document 的 IDispatch 介面,然後你應該可以利用這個介面 QueryInterface 出其他的介面,利用這些介面你可以在程式中動態地控制 HTML 頁面的內容。如果有興趣,好好看看 MSDN 聯機幫助,研究一下吧。

   HTML 介面是一種,方便,效果獨特,容易排錯的全新的介面技術,而由於微軟封裝了 OLE 介面 IWebBrowser2 ,使它的實現的技術細節變得這麼簡單,讓我們來創造更酷的介面吧,祝程式設計愉快!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-977257/,如需轉載,請註明出處,否則將追究法律責任。

相關文章