Chinaunix首页 | 论坛 | 博客
  • 博客访问: 353528
  • 博文数量: 82
  • 博客积分: 3353
  • 博客等级: 中校
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-20 19:13
文章分类

全部博文(82)

文章存档

2015年(1)

2014年(1)

2013年(1)

2012年(12)

2011年(3)

2010年(25)

2009年(37)

2008年(2)

我的朋友

分类: C/C++

2012-03-27 10:55:31

%CE%DE%D3%EF%BF%B4%CF%A6%D1%F4/blog/item/3501a6628eceea6c0d33fa65.html

要使用它,我们先创建一个类
class ChtmlDlg : public CDHtmlDialog
{
// 构造
public:
ChtmlDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_HTML_DIALOG, IDH = IDR_HTML_HTML_DIALOG };

protected:
virtual void DoDataExchange(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("Initial String");
}

接下来就是实现各个类函数。
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
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页面的元素如
,并用类自身的函数与页面进行交互。

.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 void DoDataExchange(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函数。
第二个可能有点抽象,具体就是
页面存在 它绑了m_txtVal。
这样就能通过修改text来改变m_txtVal的值。。。
但是怎么样才能通过修改m_txtVal的值来修改text的value呢???
答案就是UpdateData(FALSE);

这是我一点肤浅的认识。。。。对于那些宏的运行机制完全不懂。。。好吧,有空再看。。
在网上查了一天关于CHtmlView和CDhtmlDialog的应用,就这点收获了。虽然粗浅,但也算是学到点关于MFC与HTML页面
交互的知识了。

阅读(5676) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~