本篇文章是在《VS2019 VC++ MFC CEF(Chrome)开发环境搭建及相关功能demo》的基础上进行修改,以实现一些浏览器基本功能,因上一篇仅仅demo了,如何将chrome作为控件,加载到MFC窗体中,代码相对少和简单,有起步学习的价值,所以,本文源码版本库将会与上一篇的分开(具体源码见本位末尾处)。在一一实现功能之前,先下载上篇文章的源码(https://gitee.com/kefong/mfccef.git)下载到本地。
在这里插入图片描述
双击项目文件MFCCef.sln打开项目,注意调整为Debug x86或Release x86,否则配置文件不对,会导致无法运行。
在这里插入图片描述
做这些功能前,再需要先打开资源文件-MFCCef.rc,分别将Edit Control和Button各拖几个到窗口(ID分别是:IDC_EDIT1、IDC_BUTTON1、IDC_BUTTON2、IDC_BUTTON3、IDC_BUTTON4、IDC_BUTTON5、IDC_BUTTON6,对应按钮见下图红色数标)
在这里插入图片描述
并将主窗口Dlg.cpp中的cefWindowInfo和cef_handler定义,挪到Dlg.cpp的头部公共区
在这里插入图片描述
最后,在CefBrowserEventHandler中,增加全局g_browser

CefRefPtr<CefBrowser> g_browser = nullptr;

在这里插入图片描述
并在OnAfterCreated方法中,给g_browser设置值:g_browser = browser
在这里插入图片描述
然后,新增方法GetDefaultBrowser,用于获取当前浏览器信息,

CefRefPtr<CefBrowser> CCefBrowserEventHandler::GetDefaultBrowser() {
	return g_browser;
}

一、打开指定网址

1、双击IDC_BUTTON1(访问)按钮,编辑代码为:

void CMFCCefDlg::OnBnClickedButton1()
{
	CString strUrl;
	GetDlgItem(IDC_EDIT1)->GetWindowText(strUrl);
	if (strUrl.Trim().IsEmpty())
	{
		AfxMessageBox(_T("请输入网址"));
		return;
	}
	const CefString cefStrUrl(strUrl);
	cef_handler->GetDefaultBrowser()->GetMainFrame()->LoadURL(cefStrUrl);
}

二、关闭

void CMFCCefDlg::OnBnClickedButton2()
{
	cef_handler->GetDefaultBrowser()->GetHost()->CloseBrowser(true);
}

三、刷新

void CMFCCefDlg::OnBnClickedButton4()
{
	cef_handler->GetDefaultBrowser()->Reload();
}

四、后退

void CMFCCefDlg::OnBnClickedButton3()
{
	cef_handler->GetDefaultBrowser()->GoBack();
}

五、前进

void CMFCCefDlg::OnBnClickedButton6()
{
	cef_handler->GetDefaultBrowser()->GoForward();
}

六、浏览器自适应窗体大小

在Dlg窗口界面的空白处,点击数标右键,打开属性编辑框,给WM_SIZE增加个方法
在这里插入图片描述
代码

void CMFCCefDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	RECT rect;
	GetClientRect(&rect);

	//根据大小填充窗口
	if (cef_handler->GetDefaultBrowser()) {
		CefWindowHandle hwnd = cef_handler->GetDefaultBrowser()->GetHost()->GetWindowHandle();
		::MoveWindow(hwnd, cefWindowInfo.x, cefWindowInfo.y, rect.right - rect.left, rect.bottom - 0, true);
	}
	
}

七、禁用右键菜单

1、修改CCefBrowserEventHandler.h文件,让类CCefBrowserEventHandler,继承CefContextMenuHandler
在这里插入图片描述
2、增加方法,获得事件处理器

virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler(){ return this; }

3、增加方法,重写CefContextMenuHandler的方法OnBeforeContextMenu

void OnBeforeContextMenu(CefRefPtr<CefBrowser> browser,
        CefRefPtr<CefFrame> frame,
        CefRefPtr<CefContextMenuParams> params,
        CefRefPtr<CefMenuModel> model) OVERRIDE;

4、在CCefBrowserEventHandler.cpp中实现OnBeforeContextMenu方法

void CCefBrowserEventHandler::OnBeforeContextMenu(
	CefRefPtr<CefBrowser> browser,
	CefRefPtr<CefFrame> frame,
	CefRefPtr<CefContextMenuParams> params,
	CefRefPtr<CefMenuModel> model) {
	if ((params->GetTypeFlags() & (CM_TYPEFLAG_PAGE | CM_TYPEFLAG_FRAME)) != 0) {
		// Add a separator if the menu already has items.
		if (model->GetCount() > 0)
		{
			model->Clear();
			//model->AddSeparator();
		}
	}
}

八、制作启动画面(加载网页有些慢,加个启动画面防止尴尬)
1、拖一个Picture Control到窗体上,并设置类型=Bitmap
在这里插入图片描述
2、在OnInitDialog方法中,增加加载图片的代码

CRect rect;
GetClientRect(&rect);

CImage image;
HBITMAP hBitmap;
CStatic* pLogo = (CStatic*)GetDlgItem(IDC_STATIC);//IDB_PNG_AD
CString imgurl = GetPath() + _T("images/icon.png");
image.Load(imgurl);
hBitmap = image.Detach();
pLogo->SetBitmap(hBitmap);
pLogo->SetWindowPos(NULL, 0, 0, 120, 120, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);

在这里插入图片描述
增加GetPath()方法

CString CMFCCefDlg::GetPath() {
	CString path = _T("");
	CString Filepath = AfxGetApp()->m_pszHelpFilePath; //  ....\Debug\xxxx.HLP
	CString Exename = AfxGetApp()->m_pszExeName;  //xxxx
	path = Filepath.Left(Filepath.GetLength() - Exename.GetLength() - 4);
	return path;
}

效果:
在这里插入图片描述

九、调用本地Vue
八、CEF/JAVASCRIPT相互调用
具体做法详看:https://kefong.blog.csdn.net/article/details/120056056
十五、源码
https://gitee.com/kefong/mfccef-client

Logo

前往低代码交流专区

更多推荐