您的位置:首页 > Web前端 > HTML

CDhtmlDialog的粗浅使用

2012-10-26 14:51 357 查看
忘记了是从那里得来的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页面

交互的知识了。

还有一种与页面交互的方式,我自己试却不行,主要是不能从元素中读取信息,其实是我不懂。。。

下面附上我主要参考的文章的地址。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: