忘记了是从那里得来的Word了,本文非本人所写
要使用它,我们先创建一个类
class ChtmlDlg : public CDHtmlDialog
{
// 构造
public:
ChtmlDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_HTML_DIALOG, IDH =IDR_HTML_HTML_DIALOG };
protected:
virtual voidDoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
HRESULT OnButtonOK(IHTMLElement*pElement);
HRESULT OnButtonCancel(IHTMLElement*pElement);
HRESULT OnButtonShow(IHTMLElement*pElement);
// 实现
protected:
HICON m_hIcon;
CString m_p4;
CString m_txtVal;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID,LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
DECLARE_DHTML_EVENT_MAP()
};
构造函数 保证先调用父类的构造函数,其中IDH就是我们想要显示HTML页面。而IDD则是一个底层框。
这里要做的就是初始化各个变量
ChtmlDlg::ChtmlDlg(CWnd *pParent =NULL):CDhmtlDialog(ChtmlDlg::IDD,ChtmlDlg::IDH,pParent)
{
m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_p4 = _T("fu");
m_txtVal = _T("InitialString");
}
接下来就是实现各个类函数。
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAMlParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
可由系统自动生成,先不必管。。 其实我也不会。
DECLARE_MESSAGE_MAP()
在.cpp文件中实现即可。与一般的view一样。
BEGIN_MESSAGE_MAP(ChtmlDlg,CDHtmlDialog)
ON_WM_SYSCOMMAND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
本次的重头戏在于 DECLARE_DHTML_EVENT_MAP()这个宏的应用。它能将载入的HTML页面的元素
如:<inputtype="button" id="btnShow" />,并用类自身的函数与页面进行交互。
.cpp中加入宏组
BEGIN_DHTML_EVENT_MAP(ChtmlDlg)
DHTML_EVENT_ONCLICK(_T("btnShow"),OnButtonShow)//第一个参数是页面元素id,第二个是响应函
END_DHTML_EVENT_MAP()
这样当点击btnShow这个按钮时就能触发OnButtonShow这个函数了,至于函数要干什么,这个随你便。
当然,还有需要别的宏来处理页面上的各种事件
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()
只需对应不同事件选择不同映射即可。
最后是页面的元素值的获取。可以使用与Dialog一样的机制进行绑定(关联),这里用到就是
virtual voidDoDataExchange(CDataExchange* pDX);
实现如下
void ChtmlDlg::DoDataExchange(CDataExchange* pDX)
{
CDHtmlDialog::DoDataExchange(pDX);
DDX_DHtml_ElementInnerText(pDX,_T("p4"),m_p4);
DDX_DHtml_ElementValue(pDX,_T("txtVal"),m_txtVal);
}
上面代码就是把成员函数m_p4绑定了页面id为p4的元素的innerText,而m_txtVal则是绑定了txtVal的Value。
要极度主意的是!!!!!!!当你手动修改页面元素如文本框的值时,m_txtVal不会马上变化,而是先要调用updateData函数。
第二个可能有点抽象,具体就是
页面存在<input type="text"id="txtVal" /> 它绑了m_txtVal。
这样就能通过修改text来改变m_txtVal的值。。。
但是怎么样才能通过修改m_txtVal的值来修改text的value呢???
答案就是UpdateData(FALSE);
这是我一点肤浅的认识。。。。对于那些宏的运行机制完全不懂。。。好吧,有空再看。。
在网上查了一天关于CHtmlView和CDhtmlDialog的应用,就这点收获了。虽然粗浅,但也算是学到点关于MFC与HTML页面
交互的知识了。
还有一种与页面交互的方式,我自己试却不行,主要是不能从元素中读取信息,其实是我不懂。。。
下面附上我主要参考的文章的地址。。。