CHtmlDialog(VC)


目錄

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

相關函數與結構:

方法一(不在乎 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:

步驟:

  • 讓 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">

 


相關網頁


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM