CHtmlDialog 对话框与普通对话框的区别
事件处理映射宏
DDX 宏
C++ 与 javaSript 的相互调用
CDHtmlDialog 中 html 资源加载 css 样式,js 脚本,图片
目前发现了四点(可能还有更多):
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
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()
介绍:
如同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++ 调用 javascript][javascript 调用 C++]
相关函数与结构:
方法一(不在乎 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();
相关函数及宏链接到 MSDN:
步骤:
EnableAutomation();
SetExternalDispatch(GetIDispatch(TRUE)); //将浏览器控件的扩展接口设置为对话框自身的 IDispatch
DECLARE_DISPATCH_MAP()
void func() { MessageBox(L"hello!"); }
BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog) DISP_FUNCTION(CMyDHTMLDialog, "SayHello", func, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP()
BOOL CWebbrowserDlg::CanAccessExternal() { return TRUE; }
function Button1_onclick() { //调用 C++ 的 func,函数 external.SayHello(); }
概要:
若想在 CDHtmlDialog 的 html 中加载 css , js ,图片文件,必须把这些文件引入资源文件,然后把 html 文件中的链接转换成对应的资源 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">