开发环境:VS7,Windows XP,Windows 2K 在VS7中添加了一种新的对话框类:CDHtmlDialog,顾名思义就是能够显示DHTML内容的对话框,但不同与以前的CHTMLView不同的是添加了对DHTML的支持,能够响应各种DHTML的事件,而且能够方便的得到网页上的各种内容和输入。在这以前要完成这些功能必须通过复杂的COM接口来完成,而现在MS MFC已经为我们做好了这一切。 类成员函数介绍
2回顶部 或者你可以利用 BOOL LoadFromResource( LPCTSTR lpszResource ); BOOL LoadFromResource( UINT nRes ); 将HTML内容在后期进行装载。
页面浏览 3回顶部 得到元素的innerText和innerHTML的属性 innerHTML属性: BSTR GetElementHtml( LPCTSTR szElementId ); innerText属性: BSTR GetElementText( LPCTSTR szElementId ); 相当于调用IHTMLElement接口的gett_innerHTML和get_innerText方法 与之对应的是设置元素的innerText和InnerHTML属性: innerHTML属性: void SetElementHtml( LPCTSTR szElementId, BSTR bstrText ); innerText属性: void SetElementText( LPCTSTR szElementId, BSTR bstrText ); 相当于调用IHTMLElement接口的put_innerHTML和put_innerText方法 示范代码 假设页面上的代码为:<p id=p2>test</p>,执行下面代码可以显示原来的内容和将新内容设置为:abcdefg CComPtr<IHTMLElement> spP1; HRESULT hr = S_OK; // Use the template overload hr = GetElementInterface("p2", &spP1); // 或者 hr = GetElement("p2", &spP1); // 或者 hr = GetElementInterface("p2", IID_IHTMLElement, reinterpret_cast<void**>(&spP1)); if(S_OK == hr) { BSTR bStr; spP1->get_innerHTML(&bStr); CString szTemp; szTemp = bStr; AfxMessageBox(szTemp); CString strTable="abcdefg"; BSTR bstrTable = strTable.AllocSysString(); spP1->put_innerHTML(bstrTable); } 或者利用SetElementHtml和SetElementText来进行设置: BSTR bStr; bStr = GetElementHtml("p2"); CString szTemp; szTemp = bStr; AfxMessageBox(szTemp); CString strTable="ABCDEFG"; BSTR bstrTable = strTable.AllocSysString(); //spP1->put_innerHTML(bstrTable); SetElementHtml("p2",bstrTable); 4回顶部 事件处理映射宏 基本格式 BEGIN_DHTML_EVENT_MAP(className ) DHTML_EVENT_ONCLICK(elemName, memberFxn ) //处理onclick事件 DHTML_EVENT_ONFOCUS(elemName, memberFxn ) //处理onfocus事件 DHTML_EVENT_ONKEYDOWN(elemName, memberFxn ) //处理onkeydown事件 DHTML_EVENT_ONMOUSEMOVE(elemName, memberFxn ) //处理mousemove事件 DHTML_EVENT_ONMOUSEOUT(elemName, memberFxn ) //处理mousemoveout事件 等等……… END_DHTML_EVENT_MAP() 更详细的说明可以查阅MSDN中DHTML Event Map Macros部分。MSDN中对可以处理的事件进行了详细的说明。DHTML中的事件与Windows中消息不是同一个概念,虽然映射宏的形式很相同。 添加映射处理代码 我在VC7中没有发现自动添加各种事件映射的方法,只能通过手工添加代码的方式。 定义事件处理函数: 函数原型为:HRESULT urClass::OnXXXXX(IHTMLElement* /*pElement*/) 添加消息映射: BEGIN_DHTML_EVENT_MAP(urClass) DHTML_EVENT_ONCLICK(_T("id name"), OnXXXXX) END_DHTML_EVENT_MAP() 下面是一段示范代码: // mydlg.h class CmydhtmlDlg : public CDHtmlDialog { // 构造 public: CmydhtmlDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_MYDHTML_DIALOG, IDH = IDR_HTML_MYDHTML_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 5回顶部 HRESULT OnButtonOK(IHTMLElement *pElement); HRESULT OnButtonCancel(IHTMLElement *pElement); HRESULT OnButtonTest1(IHTMLElement *pElement); HRESULT OnButtonTest2(IHTMLElement *pElement); HRESULT OnButtonTest3(IHTMLElement *pElement); HRESULT OnSelectTest1(IHTMLElement *pElement); HRESULT OnDivMouseMove1(IHTMLElement *pElement); HRESULT OnDivMouseOut1(IHTMLElement *pElement); //mydlg.cpp BEGIN_DHTML_EVENT_MAP(CmydhtmlDlg) DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK) DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel) DHTML_EVENT_ONCLICK(_T("Test1"), OnButtonTest1) DHTML_EVENT_ONCLICK(_T("Test2"), OnButtonTest2) DHTML_EVENT_ONCLICK(_T("Test3"), OnButtonTest3) DHTML_EVENT_ONCHANGE(_T("s1"), OnSelectTest1) DHTML_EVENT_ONMOUSEMOVE(_T("d1"), OnDivMouseMove1 ) DHTML_EVENT_ONMOUSEOUT(_T("d1"), OnDivMouseOut1 ) END_DHTML_EVENT_MAP() HRESULT CmydhtmlDlg::OnButtonOK(IHTMLElement* /*pElement*/) { OnOK(); return S_OK; } HRESULT CmydhtmlDlg::OnButtonCancel(IHTMLElement* /*pElement*/) { OnCancel(); return S_OK; } HRESULT CmydhtmlDlg::OnButtonTest1(IHTMLElement* /*pElement*/) { AfxMessageBox("test1 button clicked"); return S_OK; } HRESULT CmydhtmlDlg::OnSelectTest1(IHTMLElement* /*pElement*/) { TRACE("select1 changed\n"); return S_OK; } HRESULT CmydhtmlDlg::OnDivMouseMove1(IHTMLElement* /*pElement*/) { TRACE("div1 mouse move\n"); return S_OK; } HRESULT CmydhtmlDlg::OnDivMouseOut1(IHTMLElement* /*pElement*/) { TRACE("div1 mouse out\n"); return S_OK; } 各种DDX帮助宏 DDX宏介绍 如同CDialog类一样,CHtmlDialog也提供各种DDX帮助宏来与HTML页面上的控件交换数据。 遗憾的是VS7中无法为CDHTMLDialog 的子类自动添加DDX变量,必须通过手工添加。 6回顶部 设置innerText和innerHTML属性 DDX_DHtml_ElementInnerText( CDataExchange* dx, LPCTSTR name, CString& var ) 和 DDX_DHtml_ElementInnerHtml( CDataExchange* dx, LPCTSTR name, CString& var ) 相当与前面提到的设置和获取innerText,innerHTML属性。 获取和设置控件中的值 在DHTML中利用“对象名程.value”可以得到控件中输入的值,利用DDX也同样可以得到。 假设HTML文件中代码如下 7回顶部 一个简单的例子 最后介绍一下如何利用VC7创建一个利用CDHtmlDialog的工程。 |
|