首先我们简单了解下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