VS2019 VC++ MFC CEF/chrome浏览器基本功能按钮的实现(打开输入网址、刷新、后退等)
本篇文章是在《VS2019 VC++ MFC CEF(Chrome)开发环境搭建及相关功能demo》的基础上进行修改,已实现以下功能demo:1、打开指定网址2、刷新3、后退4、调用本地Vue5、自动登录(自动填充账号和密码)6、关闭子窗口7、HTML/JS中关闭主窗体8、MFC发送消息给CEF中的HTML/JS9、浏览器自适应窗体大小闲话不说,进入正题。...
本篇文章是在《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
更多推荐
所有评论(0)