目錄
CHtmlDialog 對話框與普通對話框的區別
事件處理映射宏
DDX 宏
C++ 與 javaSript 的相互調用
CDHtmlDialog 中 html 資源加載 css 樣式,js 腳本,圖片
CHtmlDialog 對話框與普通對話框的區別
目前發現了四點(可能還有更多):
- 類的繼承關系
class CTestHtmlDialogDlg : public CDHtmlDialog //表明此對話框類的確是繼承了CDHtmlDialog
- 資源枚舉
enum { IDD = IDD_TESTHTMLDIALOG_DIALOG, IDH = IDR_HTML_TESTHTMLDIALOG_DIALOG }; //這兒的枚舉變成了兩個,也就是有一個普通對話框,還有一個HTML對話框
- 構造函數
CTestHtmlDialogDlg::CTestHtmlDialogDlg(CWnd* pParent /*=NULL*/) :CDHtmlDialog(CTestHtmlDialogDlg::IDD, CTestHtmlDialogDlg::IDH, pParent) //在CTestHtmlDialogDlg的構造函數中,CDHtmlDialog的成員初始化列表中多了一個CTestHtmlDialogDlg::IDH
- rc資源
IDR_HTML_TESTHTMLDIALOG_DIALOG HTML "TestHtmlDialog.htm" //在resource文件中,多了這么一行,用來指定HTML對話框的HTML文件資源,可以修改成自己喜歡的名字,比如index.html,當然在工程中的html文件也要修改成相應的名字
事件處理映射宏
基本格式:
BEGIN_DHTML_EVENT_MAP(className ) //消息映射 .... END_DHTML_EVENT_MAP()
添加消息映射:
定義事件處理函數,函數原型為:
HRESULT urClass::OnFuncName(IHTMLElement* pElement);// OnFuncName 為函數名
添加消息映射(DHTML 消息映射宏 <DHTML Event Map Macros>):
BEGIN_DHTML_EVENT_MAP(urClass) //在 BEGIN_DHTML_EVENT_MAP 與 END_DHTML_EVENT_MAP 之間添加消息映射宏 DHTML_EVENT_ONCLICK(_T("id_name"), OnFuncName) //id_name 為 html 元素的 ID 名,OnFuncName 為事件響應函數名 ... END_DHTML_EVENT_MAP()
DDX 宏
介紹:
如同CDialog類一樣,CHtmlDialog也提供各種DDX幫助宏來與HTML頁面上的控件交換數據.
兩個重要宏:
利用以上函數來設置元素的 innerText 和 innerHTML 關聯變量, 相當與前面提到的設置和獲取 innerText , innerHTML 屬性. 用 UpdateData 來接收數據和更新控件上數據
示例:
定義對應變量,然后在對話框函數的 DoDataExchange 函數中建立關聯變量.(需在 CDHtmlDialog::DoDataExchange(pDX); 語句后進行添加才有效)
CDHtmlDialog::DoDataExchange(pDX); DDX_DHtml_ElementInnerHtml(pDX,L"p1",m_szP);//p1 為關聯的 html 元素的 ID,m_szP 為關聯變量
C++ 與 javaSript 的相互調用
[C++ 調用 javascript][javascript 調用 C++]
C++ 調用 javascript
相關函數與結構:
- 函數
- 結構體:
- VARIANT(用於傳遞參數)
方法一(不在乎 js 函數的返回值):
IHTMLDocument2* pDocument; IHTMLWindow2* pWindow; //獲得 html 的 Document 節點 HRESULT hr = GetDHtmlDocument(&pDocument); //獲得 Document 的窗口節點 pDocument->get_parentWindow(&pWindow); VARIANT ret; ret.vt = VT_EMPTY; pWindow->execScript(AllocSysString("jsfunc()"),L"JavaScript",&ret); //清理工作,釋放 Document 和 window節點 pDocument->Release(); pWindow->Release();
方法二(需要獲得 js 函數的返回值):
IHTMLDocument2* pDocument; IHTMLWindow2* pWindow; DISPPARAMS dispparams;//用於給 JS 傳遞參數對象 DISPID dispid; EXCEPINFO excepInfo;//獲取JS中異常的對象 CComVariant vaResult;//JS返回的結果值對象 //獲得 html 的 Document 節點及 Document 對應的窗口節點 GetDHtmlDocument(&pDocument); pDocument->get_parentWindow(&pWindow); //初始化JS所用的參數對象,JS中異常的對象 memset(&dispparams, 0, sizeof dispparams); memset(&excepInfo, 0, sizeof excepInfo); //設置參數個數,並開辟參數空間 dispparams.cArgs=2; dispparams.rgvarg = new VARIANT[dispparams.cArgs]; //設置每個參數的類型 dispparams.rgvarg[0].vt = VT_BSTR; dispparams.rgvarg[1].vt = VT_BSTR; //為參數賦值 CComBSTR fromMFC1=_T("one"); CComBSTR fromMFC2=_T("two"); fromMFC2.CopyTo(&dispparams.rgvarg[1].bstrVal); fromMFC1.CopyTo(&dispparams.rgvarg[0].bstrVal); UINT nArgErr = (UINT)-1; CComBSTR szMember = _T("CalledJs"); pWindow->GetIDsOfNames(IID_NULL, &szMember,1,LOCALE_SYSTEM_DEFAULT,&dispid); pWindow->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo,&nArgErr); //顯示 JS 返回的結果 CString str(vaResult.bstrVal); this->MessageBox(str); //清理工作,釋放 Document 和 window 節點 pDocument->Release(); pWindow->Release();
javascript 調用 C++
相關函數及宏鏈接到 MSDN:
- EnableAutomation
- SetExternalDispatch
- DECLARE_DISPATCH_MAP
- BEGIN_DISPATCH_MAP
- DISP_FUNCTION
- END_DISPATCH_MAP
步驟:
- 讓 CTestHtmlDialog 支持自動化,即在 OnInitDialog() 中添加
EnableAutomation();
- 將自身暴露給 Javascript ,即在 OnInitDialog() 中添加
SetExternalDispatch(GetIDispatch(TRUE)); //將瀏覽器控件的擴展接口設置為對話框自身的 IDispatch
- 聲明 DISPATCH_MAP,即在 TestHtmlDialog.h 中聲明對應映射
DECLARE_DISPATCH_MAP()
- 定義對應的 C++ 函數,用於給 Javascript 調用
void func() { MessageBox(L"hello!"); }
- 定義DISPATCH_MAP,和添加對應函數映射,即在 TestHtmlDialog.cpp 中
BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog) DISP_FUNCTION(CMyDHTMLDialog, "SayHello", func, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP()
- 取消JS在調用 C++ 時的提醒框,即在 CTestHtmlDialog 中,重載 CanAccessExternal() 函數
BOOL CWebbrowserDlg::CanAccessExternal() { return TRUE; }
- 在 Javascript 中調用 C++ 函數
function Button1_onclick() { //調用 C++ 的 func,函數 external.SayHello(); }
CDHtmlDialog 中 html 資源加載 css 樣式,js 腳本,圖片
概要:
若想在 CDHtmlDialog 的 html 中加載 css , js ,圖片文件,必須把這些文件引入資源文件,然后把 html 文件中的鏈接轉換成對應的資源 ID 的數值.
添加步驟:
- 第一步: 添加想要添加的 css , js ,圖片文件到資源文件中.
- 第二步:找到添加的文件的資源 ID 對應的數值.
- 第三步:在引用文件時候,把鏈接地址以 "res:/資源文件添加到的所屬文件結構/#資源ID" 來寫
例子:
有三個文件 myCss.css,myJs.js,myPicture.jpg .並把這三個文件導入資源文件.並在 CUS 文件結構下,如圖示:
然后在資源文件中資源 ID 對應的數值:
#define IDR_CUS1 131 #define IDR_CUS2 132 #define IDR_CUS3 133
在 html 文件中引用導入到資源文件中的 css,js,圖片 文件:
<SCRIPT src="res:/CUS/#131" type=text/javascript></SCRIPT> <link type="text/css" rel="stylesheet" href="res:/CUS/#132" /> <img src="res:/CUS/#133">