65.9K
CodeProject 正在变化。 阅读更多。
Home

将 DHTML 集成到 MFC 视图中

2002 年 1 月 31 日

3分钟阅读

viewsIcon

414333

downloadIcon

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 继承自 CViewCDHTMLEventSink

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 文件中。

© . All rights reserved.