MFC对话框里利用CHtmlView加载界面(一)————加载网页

首先我们简单了解下CHtmlView类,CHtmlView类是MFC类,它继承自CView,属于MFC视图类。

但我们看它的具体实现时,我们会发现其最大的本质在于IWebBrowser2(WebBrowser ActiveX 控件)的封装。即其实质是:利用IWebBrowser2,有效地使应用程序成为一个 Web 浏览器。当然里面具体的封装细节,涉及到了大量的COM组件和ActiveX 控件知识,我们就不做具体描述。

本文主要介绍:如何利用CHtmlView加载网页,其具体的创建过程是什么?

作为例子,我们先VS2015创建一个CHTMLDome1的MFC对话框工程。

第一步:添加CBaseHtmlView类

工程创建完成后,在项目解决方案中,添加MFC类,并让它继承自CHtmlView类,具体创建过程如下图。

创建完成后,VS2015会自动为我们生成CBaseHtmlVIew类的.h和.cpp文件。

这里有个注意: 在类向导中生成的CBaseHtmlView类 其构造函数默认为 protected, 要改成public

第二步:为CBaseHtmlView添加必要的消息响应函数及虚函数

需要重写的函数有: OnDestroy()、PostNcDestroy()、OnInitialUpdate()、OnMouseActivate()

可以利用类向导进行添加,如下图


上述4个函数分别重写为:

OnDestroy函数:

void CBaseHtmlView::OnDestroy()
{
	if (m_pBrowserApp) 
	{
		m_pBrowserApp.Release();
		m_pBrowserApp = NULL;
	}
	CWnd::OnDestroy(); //为了跳过CView(doc/frame)的OnDestroy
}

PostNcDestroy函数:

void CBaseHtmlView::PostNcDestroy()
{
	// TODO: Add your specialized code here and/or call the base class
	//CHtmlView::PostNcDestroy();   注释掉,防止CView 销毁自己
}
OnInitialUpdate函数:

void CBaseHtmlView::OnInitialUpdate() //用于网页的载入
{
	CMyHtmlView::OnInitialUpdate();
	Navigate2(L"http://blog.csdn.net/qq_20828983?viewmode=contents", NULL, NULL); //这里的网站可以任意更换
}
OnMouseActivate函数:

int CBaseHtmlView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
	return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message); //为了跳过CView(doc/frame)的OnMouseActivate
}

在需要处理网页大小时,我们还可以重载下OnSize函数:

void CBaseHtmlView::OnSize(UINT nType, int cx, int cy)
{
	CFormView::OnSize(nType, cx, cy);

	if (::IsWindow(m_wndBrowser.m_hWnd))
	{
		CRect rect;
		GetClientRect(rect);
		LONG lWindows = GetWindowLong(GetParent()->GetSafeHwnd(), GWL_EXSTYLE);
/*		::AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_CLIPSIBLINGS);*/
		::AdjustWindowRectEx(rect, GetStyle(), FALSE, lWindows);
		m_wndBrowser.SetWindowPos(NULL, rect.left, rect.top, 962, 632, SWP_NOACTIVATE | SWP_NOZORDER);
	}
}  

第三步:添加CreateFromStatic创建函数

BOOL CBasesHtmlView::CreateFromStatic(UINT nID, CWnd* pParent)

CreateFromStatic函数两个参数中 nID为一个CStatic静态文本框的资源ID,pParent为CStatic静态文本框所在的对话框。

我们传递一个CStatic静态文本框的资源ID,是为了让此静态文本框作为加载网页或HTML的载体。

具体实现如下:

BOOL CBaseHtmlView::CreateFromStatic(UINT nID, CWnd* pParent)
{
	CWnd* pStatic = pParent->GetDlgItem(nID);
	if (pStatic == NULL)
			return FALSE;

	CRect rc;
	pStatic->GetWindowRect(&rc);
	pParent->ScreenToClient(&rc);
	pStatic->DestroyWindow();

	if (!CHtmlView::Create(NULL, NULL, (WS_CHILD | WS_VISIBLE), rc, pParent, nID, NULL))
		return FALSE;

	OnInitialUpdate();  //加载网页或html
	SetSilent(TRUE);//add by wh ,bid pop script dlg  true表示允许界面弹出对话框
	return TRUE;
}
这里有必要对CHtmlView类中的 Create函数进行下说明:

  virtual BOOL Create(
    LPCTSTR lpszClassName,   //NULL,使用预定义的默认CFrameWnd属性。
    LPCTSTR lpszWindowName,  //窗口名称, 可直接为NULL
    DWORD dwStyle,   //窗口风格, 默认情况下, WS_VISIBLE和WS_CHILD设置窗口的样式
    const RECT& rect,  //指定的大小和窗口的位置 一般用一个static静态控件的位置
    CWnd* pParentWnd,  //指向控件的父窗口的指针 
    UINT nID,  //视图的 ID 号,一般用一个static静态控件ID 
    CCreateContext* pContext = NULL);

第四步:在主对话框类中添加CBaseHtmlView成员

在主对话框类CHtmlDime1中,添加一个成员变量CBaseHtmlView m_HtmlView。

然后主对话框资源文件中加入一个静态文本框,属性修改ID为:IDC_STATIC_HTML

最后在主对话框OnInitDialog 中添加:

m_HtmlView.CreateFromStatic(IDC_STATIC_HTML, this);

最后完成,运行结果如下图:


其他说明

在CHtmlView中,还有许多成员函数,有兴趣的可以查看MSDN:https://technet.microsoft.com/zh-cn/library/42h6dke4.aspx

这里摘取部分:

void GoBack( );   导航到历史列表的前一个条目(previous item)。

void GoForward( );   导航到历史列表的下一个条目。

void GoHome( );   导航到主页,该主页在IE的属性中设置。

void GoSearch( );    导航到当前搜索页。该页在IE的属性中设置。

void Refresh( );      重新装入浏览器当前正在显示的URL或者文件,即刷新。

void Stop( );         撤销任何未完成的导航或下载,并且停止任何动态的页面元素,例如背景音乐和动画。

Navigate        导航到由URL指定的资源。

Navigate2       导航到由URL指定的资源或者由全路径指定的文件。

PutProperty     设置与所给定的对象相关的属性的当前值。

GetProperty     返回与所给定的对象相关的属性的当前值。

ExecWB         执行一个命令。LoadFromResource  

在WebBrowser控件中装入一个资源。还有一个函数我们重点提及下:OnDocumentCompletevoid

CBaseHtmlView::OnDocumentComplete(LPCTSTR lpszURL)

此函数会在网页或者html每次加载成功后,进行调用。我们可以在里面处理加载完成后事件,如向主对话框发送消息,进行通知等。

本文demo下载链接如下:http://download.csdn.net/detail/qq_20828983/9893573

展开阅读全文

没有更多推荐了,返回首页