MFC使用cef加载web页面

11 篇文章 0 订阅

使用cef的3626 X64版本 支持MP4放在了Git上

几个注意点

一、交互问题

1、c++调用js
使用ExecuteJavaScript函数
例:

CefRefPtr<CefBrowser> browser = ...;
CefRefPtr<CefFrame> frame = browser->GetMainFrame();
frame->ExecuteJavaScript("alert('ExecuteJavaScript works!');",
    frame->GetURL(), 0);

注意:参数中存在",需要先处理

str.Replace(_T("\""),_T("\\\""));

2、js调用c++
(1)添加类CCefBrowserApp继承CefRenderProcessHandler,重写方法OnContextCreated,例

void CCefBrowserApp::OnContextCreated(CefRefPtr<CefBrowser> browser,
									  CefRefPtr<CefFrame> frame,
									  CefRefPtr<CefV8Context> context)
{
	CefRefPtr<CefV8Value> object = context->GetGlobal();
	CefRefPtr<CefV8Value> str = CefV8Value::CreateString(_T("My Value!"));
	object->SetValue(_T("myval"), str, V8_PROPERTY_ATTRIBUTE_NONE);

	CefRefPtr<CefV8Value> window = context->GetGlobal();
	CefRefPtr<CefV8Handler> handler = new ClientV8ExtensionHandler();
	CefRefPtr<CefV8Value> callback = CefV8Value::CreateFunction(_T("CPPCALLBACK"), handler);
	window->SetValue(_T("CPPCALLBACK"), callback, V8_PROPERTY_ATTRIBUTE_NONE);
}

向windows中注册CPPCALLBACK方法

(2)添加类ClientV8ExtensionHandler继承CefV8Handler,重写方法Execute,例

bool ClientV8ExtensionHandler::Execute(const CefString &name, CefRefPtr<CefV8Value> object, const CefV8ValueList &arguments, CefRefPtr<CefV8Value> &retval, CefString &exception)
{  
	if (name == "CPPCALLBACK")
	{
		if(arguments.size() > 0 && arguments[0]->IsString())
		{
			CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create(arguments[0]->GetStringValue());
			CefRefPtr<CefListValue> args = msg->GetArgumentList();

			args->SetSize(arguments.size() - 1);
			for(int i = 1;i < arguments.size();i++)
			{
				if(arguments[i]->IsBool())
					args->SetBool(i-1, arguments[i]->GetBoolValue());
				else if(arguments[i]->IsDate())
					args->SetDouble(i-1, arguments[i]->GetDateValue().GetDoubleT());
				else if(arguments[i]->IsDouble())
					args->SetDouble(i-1, arguments[i]->GetDoubleValue());
				else if(arguments[i]->IsInt())
					args->SetInt(i-1, arguments[i]->GetIntValue());
				else if(arguments[i]->IsString())
					args->SetString(i-1, arguments[i]->GetStringValue());
				else if(arguments[i]->IsUInt())
					args->SetInt(i-1, arguments[i]->GetUIntValue());
			}
			return CefV8Context::GetCurrentContext()->GetBrowser()->SendProcessMessage(PID_BROWSER, msg);
		}
		return true;
	}

	return false;  
}

(3)添加类CCefBrowserEventHandler继承CefClient,重写方法OnProcessMessageReceived,例

bool CCefBrowserEventHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
							  CefProcessId source_process,
							  CefRefPtr<CefProcessMessage> message)
{
	if(m_pDelegate)
		return m_pDelegate->CallbackFromJS(browser.get(), message->GetName().c_str(), message->GetArgumentList().get());
	return false;
}

这儿为最终处理位置

(4)js调用方法CPPCALLBACK

window.CPPCALLBACK("postMessage", "ready")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值