在nim_duilib中使用cef控件知识点

这里补充一点,关于cef控件调用原生的JS函数,看了下 cef_control_base.h 这个头文件,发现关于调用JS的方式 这里只是描述直接 调用一个前端注册好的函数,那么调用普通的JS函数该如何实现,这是这篇文章的主要重点;

参照:

https://www.cnblogs.com/chechen/p/6138167.html

根据这篇博客所描述

C++调用JS函数相对简单多了,因为CEF有接口可以直接使用CefFrame::ExecuteJavaScript,看看注释:

///
  // Execute a string of JavaScript code in this frame. The |script_url|
  // parameter is the URL where the script in question can be found, if any.
  // The renderer may request this URL to show the developer the source of the
  // error.  The |start_line| parameter is the base line number to use for error
  // reporting.
  ///
  /*--cef(optional_param=script_url)--*/
  virtual void ExecuteJavaScript(const CefString& code,
                                 const CefString& script_url,
                                 int start_line) =0;

首先需要获取到我们的浏览器里的主框架对象,code是JS函数和传入参数的字符串,URL可以直接忽略。

        CefRefPtr<CefFrame> frame = m_handler->GetBrowser()->GetMainFrame();
        m_handler是我们自己定义的Handler对象

C++ 调用js方法
//frame->ExecuteJavaScript(L"Test();",frame->GetURL(),0);//提示框
 //frame->ExecuteJavaScript(L"ModifyValue();",frame->GetURL(),0);//无参数函数
 frame->ExecuteJavaScript(L"ModifyValue('巴萨牛逼');",frame->GetURL(),0);//有参数函数9 如果参数是可变的,可以这样
CString strJsCode;strJsCode.Format(L"setInstallStatus('%s','%s','%d');", lpData->strId.c_str(), strStatus, nPercent);
其中setInstallStatus是js函数,它有三个参数

根据博客内容可知 需要调用 ExecuteJavaScript 这个函数才行,那么如何调用这个 继续往下看:

总结上面的调用方式 就两行代码

CefRefPtr<CefFrame> frame = m_handler->GetBrowser()->GetMainFrame();

frame->ExecuteJavaScript(js函数的名字(),主界面的URL,JS函数调用的参数);

那么 这个m_handler 这个到底指的是什么;谁又可以调用GetBrowser()这个函数呢 搜索一下GetBrowser 这个函数 看包含在哪个类中 然后发现

void CefControlBase::LoadURL(const CefString& url)
{
	if (browser_handler_.get() && browser_handler_->GetBrowser().get())
	{
		CefRefPtr<CefFrame> frame = browser_handler_->GetBrowser()->GetMainFrame();
		if (!frame)
			return;

		frame->LoadURL(url);
	}
	else
	{
		if (browser_handler_.get())
		{
			StdClosure cb = ToWeakCallback([this, url]()
			{
				LoadURL(url);
			});
			browser_handler_->AddAfterCreateTask(cb);
		}
	}
}

随便找一个 CefControlBase类中实现的函数 都可以找到类似的调用方法 看browser_handler_的定义,发现 CefRefPtr<nim_comp::BrowserHandler> browser_handler_ = nullptr;

该成员变量就位于cef控件的基类中 也就是CefControlBase这个类中:

到这里 就可以直接套用上面的 调用方法,在CefControlBase这个类中 定义个函数 就叫 

void CallJsFuction(const CefString& url);

实现:

void CefControlBase::CallJsFuction(const CefString& url)
{
	CefRefPtr<CefFrame> frame = browser_handler_->GetBrowser()->GetMainFrame();
	frame->ExecuteJavaScript(url, frame->GetURL(), 0);
}

这样就完成了使用nim_duilib中的cef控件调用JS方法的过程;不熟悉cef的同学 可以直接套用;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nim duilib是一个基于Nim语言开发的UI框架,它提供了丰富的控件库,包括按钮、文本框、列表框等常见的控件。除了内置的控件,它还支持自定义控件的开发。 要开发自定义控件,首先需要理解nim duilib的架构和控件的生命周期。每个控件都有自己的类,通过继承Duilib的Control类来创建自定义的控件。在这个类需要重写一系列的方法,比如OnCreate、OnPaint等,来处理自定义控件的创建、绘制等事件。 在OnCreate方法,可以定义自定义控件的属性和初始化。可以设置控件的尺寸、位置、背景颜色等样式属性。在OnPaint方法,可以绘制自定义控件的外观。可以使用nim duilib提供的绘图接口来绘制自定义的图形、文本等,以实现想要的外观效果。 除了控件的外观,还需要处理控件的交互事件。可以重写鼠标按下、鼠标移动、鼠标释放等事件方法,来实现控件的拖拽、点击等交互效果。可以使用nim duilib提供的函数来获取鼠标的位置、键盘的状态等信息,以实现与用户交互的功能。 最后,在使用自定义控件时,需要创建一个对应的控件类的实例,并添加到父容器。可以通过调用父容器的Add控件方法,将自定义控件添加到容器,并设置控件的位置和尺寸。 总的来说,nim duilib的自定义控件开发提供了丰富的接口和方法,可以根据需求自由定制控件的外观和交互。通过理解框架的架构和控件的生命周期,加上nim语言的灵活性和易用性,可以方便地开发出符合自己需求的自定义控件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值