利用 CHtmlView 和 HTML 製作新風格的介面 (轉)
利用 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 ,使它的實現的技術細節變得這麼簡單,讓我們來創造更酷的介面吧,祝程式設計愉快!
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AconMac版快速製作bigsur風格圖示Mac
- 4、製作一個html轉pdf的spring boot starterHTMLSpring Boot
- HTML5 video視訊字幕的使用和製作HTMLIDE
- HTML+CSS專案課1:利用table製作百度首頁HTMLCSS
- 信安實踐2-利用HTML和CSS繪製出好看的表格HTMLCSS
- HTML簡單網頁製作HTML網頁
- 定製不同風格的App主題APP
- html最簡單的Gif圖動畫製作方法gif轉base64HTML動畫
- 中文寫作排版風格指南
- 利用nginx和騰訊雲免費證書製作https的方法NginxHTTP
- 手繪風格獨立遊戲《失眠》製作人分享創作靈感和開發歷程遊戲
- ∑co時間 | 智慧工廠新風向 製造轉型新未來
- 利用poi將Html中table轉為ExcelHTMLExcel
- 圖片馬製作及利用方式
- Processing 網格紋理製作(棋盤格)
- HTML網頁製作的強大8條技巧HTML網頁
- three.js 利用uv和ThreeBSP製作一個快遞櫃JS
- 利用js製作簡單的動態日曆JS
- 索尼和漫威就新的《蜘蛛俠》製作合同談崩了?
- 使用css製作吊扇轉動的效果CSS
- 使用canvas繪製dribble風格水波浪Canvas
- AI在用 | 用ChatGPT、Kimi克隆自己的寫作風格AIChatGPT
- 批量匯出 CSDN 部落格並轉為 hexo 部落格風格Hexo
- 純HTML + CSS製作個人資料卡HTMLCSS
- html+css 製作簡易導航欄HTMLCSS
- python爬蟲利用requests製作代理池sPython爬蟲
- 十、特殊應用:人臉識別和神經風格轉換
- React製作個人部落格小結React
- [JavaWeb]利用JSP的編碼特性製作免殺後門JavaWebJS
- 製造蝴蝶颶風,微眾區塊鏈的蝶變和ESG新使命區塊鏈
- NUKE 14:打造視覺盛宴,引領後期製作新風潮!mac/win版視覺Mac
- 請使用純HTML製作一個進度條HTML
- 如何利用6西格瑪進行創新?
- [C++]C風格、C++風格和C++11特性的執行緒池C++執行緒
- 少女風vue元件庫製作全攻略~~Vue元件
- “侍道”系列新傳:當寫實風格武士動作遊戲遇到無厘頭遊戲
- 利用API介面進行競品價格監控的綜合指南API
- 利用CSS中input製作開關、輪播圖CSS
- 基於【ESLint+JavaScript Standard Style】標準的VUE/JS/html風格指南EsLintJavaScriptVueJSHTML