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

作者:白白皎皎
来源:CSDN
原文:https://blog.csdn.net/qq_20828983/article/details/74908340

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值