[奇技淫巧]CEF3使用H5实现标题栏拖动窗口

为什么要用H5实现标题栏

  • 交互上拓展了用户的操作区域
  • 减少了H5和Native的交互,使H5功能更独立,耦合性更低

举例

小米画报 网易云
注: 蓝色区域为H5,红色区域为Native

实现原理

  • 通过H5移动Native窗口的本质是子窗口移动父窗口
  • 要点将H5的鼠标消息传递给Native

代码实现

  • H5页面通过回调获取到鼠标移动的消息,通过Windows下我们注册的js对象(windows.jvs.drag )传递给Native
	<html>
    <head>
    </head>
    <body
		onmousedown="mousedown(event)"
		onmousemove="mousemove(event)"
		onmouseup="mouseup(event)"
		onmouseout="mouseout(event)"
	>
        <div id="src"> </div>
        <script>
			var mouse_is_down = false;

			function mousedown(e)
			{
				console.log('mousedown')
				mouse_is_down = true;
			}
			function mouseup(e)
			{
				console.log('mouseup')
				mouse_is_down = false;
			}
			
			function mouseout(e)
			{
				console.log('mouseout')
				mouse_is_down = false;
			}
			
			function mousemove(e)
			{
				//console.log('mousemove')
				if (mouse_is_down)
				{
					window.jvs.drag(e.movementX,e.movementY)
					console.log(e)
				}
			}
			
        </script>
    </body>
</html>
  • Native 实现
void NativeWnd::OnProcessMessageReceived(std::string message_name, CefRefPtr<CefListValue> args)
{
    if (message_name == "drag")
    {
        int offsetX = args->GetInt(0);
        int offsetY = args->GetInt(1);
        LOG(INFO) << "drag: " << offsetX << " - " << offsetY;

        RECT rc;
        GetWindowRect(m_hWnd, &rc);
        int left = rc.left + offsetX;
        int top = rc.top + offsetY;

        ::MoveWindow(m_hWnd, left, top, rc.right - rc.left, rc.bottom - rc.top, false);
    }
}

欢迎访问本人的小站 xsnip.cn

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值