将 DHTML 集成到 MFC 视图中






4.72/5 (19投票s)
2002 年 1 月 31 日
3分钟阅读

414333

6876
演示将 DHTML 集成到 MFC 视图中,并使用视图中的 HTML 通过连接点从浏览器获取反馈
先决条件:本文针对 Visual C++ .NET
,作者假定读者对 C++、MFC、OLE、HTML 有很好的理解。
本文的作用:使用视图中的 HTML 通过连接点从浏览器获取反馈。 它不打开或保存文档,这由开发人员实现。
动机
前段时间,我不得不开发一个设计工具来编辑基于表单样式的页面。 在完成该项目之后,Visual Studio .NET 进入了 BETA 版,在看到“开始页面”后,我的最初想法是,哇,我希望我的应用程序中也有此功能,毕竟像 Outlook 和 InstallShield 这样的产品多年来一直在做这种 UI(略有夸张)。 之前,我花了一些时间编写一个包装类,该类实现了来自 IE 浏览器控件的接收器,以便我可以获得诸如鼠标单击、按钮单击等操作的反馈。 我设计的类的问题是,该类是刚性的,只能用于实现开始页面。 自 Visual C++ 7.0 发布以来,我发现了一个新类,该类允许 DHTML 与 MFC 交互。 此类称为 CDHTMLDialog
,此类实现了一个通用框架,用于将 IE 事件接收回 MFC,但此类仅限于对话框,令我惊讶的是,Microsoft 没有提供基于 CView
的版本。 我需要的是一个 CDHTMLView
类。 考虑到这一点,我开发了一个专门用于此目的的类!
设计
在仔细研究了 Visual C++ .NET 附带的源代码之后,我找到了实现 IHTMLElement
接收器的代码。 然后,我有了设计视图的基础。 这是类图。
从类架构中可以看到,CDHTMLView
继承自 CView
和 CDHTMLEventSink
。
CDHTMLEventSink
是 Visual C++ .NET 附带的新类,
实现
- 确定哪个视图将成为您的 DHTML 视图
- 在您的项目中包含 DHTMLView.h 和 DHTMLView.cpp
- 编辑您的视图的头文件,并在 粗体 中添加以下代码片段
#include "DHTMLView.h" class CStartPrjView : public CDHTMLView { // Class body... protected: DECLARE_MESSAGE_MAP() DECLARE_DHTML_EVENT_MAP() public: virtual void OnInitialUpdate(); }
- 现在将事件映射添加到您的视图的 .cpp 文件
BEGIN_DHTML_EVENT_MAP(CStartPrjView) END_DHTML_EVENT_MAP()
- 声明该类后,现在是插入一些功能的时候了。 我们现在需要做的第一件事是将一些 Html 插入到视图中,这可以通过设计您的 HTML 并使用资源编辑器导入 HTML 文件来完成。
- 任何图像都必须作为资源类型“2110”导入,并将您的图像命名为字符串,例如“StartGif”。
- 在资源设计模式下打开 HTML 并选择您的图像。
- 并将您的图像设置为资源类型
- 现在我们需要将 HTML 元素与事件联系起来,这可以通过编辑
BEGIN_DHTML_EVENT_MAP
并插入消息处理程序来完成,就像使用普通的 MFC 消息处理程序一样。 这里要注意的一件事是,我为文档中的每个元素都提供了一个 ID。 这允许我映射到创建事件。
BEGIN_DHTML_EVENT_MAP(CStartPrjView) DHTML_EVENT_ONCLICK(_T("MRU1"), OnClickMRU1) DHTML_EVENT_ONCLICK(_T("MRU2"), OnClickMRU1) DHTML_EVENT_ONCLICK(_T("MRU3"), OnClickMRU1) DHTML_EVENT_ONCLICK(_T("MRU4"), OnClickMRU1) DHTML_EVENT_ONCLICK(_T("NewFile"), OnNewFile) DHTML_EVENT_ONCLICK(_T("OpenFile"), OnOpenFile) END_DHTML_EVENT_MAP()
- 现在我们必须在头文件和实现文件中连接处理程序
HRESULT OnClickMRU1(IHTMLElement *phtmlElement); HRESULT OnClickMRU1(IHTMLElement *phtmlElement); HRESULT OnClickMRU1(IHTMLElement *phtmlElement); HRESULT OnClickMRU1(IHTMLElement *phtmlElement); HRESULT OnNewFile(IHTMLElement *phtmlElement); HRESULT OnOpenFile(IHTMLElement *phtmlElement);
- 和实现文件
HRESULT CStartPrjView::OnClickMRU1(IHTMLElement *phtmlElement) { CComBSTR bstr; phtmlElement->get_innerText(&bstr); if (bstr) { GetDocument()->SetTitle(CString(bstr) ); CString s; s.Format("File %s selected", CString(bstr)); AfxMessageBox(s, MB_ICONINFORMATION); } return S_FALSE; }
HRESULT CStartPrjView::OnClickMRU2(IHTMLElement *phtmlElement) { CComBSTR bstr; phtmlElement->get_innerText(&bstr); if (bstr) { GetDocument()->SetTitle(CString(bstr) ); CString s; s.Format("File %s selected", CString(bstr)); AfxMessageBox(s, MB_ICONINFORMATION); } return S_FALSE; }
HRESULT CStartPrjView::OnClickMRU3(IHTMLElement *phtmlElement) { CComBSTR bstr; phtmlElement->get_innerText(&bstr); if (bstr) { GetDocument()->SetTitle(CString(bstr) ); CString s; s.Format("File %s selected", CString(bstr)); AfxMessageBox(s, MB_ICONINFORMATION); } return S_FALSE; }
HRESULT CStartPrjView::OnClickMRU4(IHTMLElement *phtmlElement) { CComBSTR bstr; phtmlElement->get_innerText(&bstr); if (bstr) { GetDocument()->SetTitle(CString(bstr) ); CString s; s.Format("File %s selected", CString(bstr)); AfxMessageBox(s, MB_ICONINFORMATION); } return S_FALSE; }
HRESULT CStartPrjView::OnNewFile(IHTMLElement *phtmlElement)
{
AfxMessageBox("New file Pressed" , MB_ICONINFORMATION);
return S_FALSE;
}
HRESULT CStartPrjView::OnOpenFile(IHTMLElement *phtmlElement)
{
AfxMessageBox("Open file Pressed" , MB_ICONINFORMATION);
return S_FALSE;
}
结论
CDHTMLView
类提供了一个稳定的框架,用于将 HTML 元素连接到您的代码中,我应该补充一点,那里有大量的数据交换宏,用于与 MFC 和 HTML 交换数据,例如 DDX_DHtml_ElementInnerText.
这些宏都定义在 DHTMLView.h 文件中。