程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

electron无边框模式完美解决同时实现拖动和双击最大化

发布于2022-11-19 06:42     阅读(534)     评论(0)     点赞(11)     收藏(2)


无边框模式下,需要在background.ts启动启用:

frame:false,transparent:true;

配置后, 自定义导航栏这时候窗口是不可以拖动的。但是您想拖动的话,这时候您要元素中声明一个:-webkit-app-region: drag;(元素可拖动模式),但是设置以后出现了新问题drag模式下元素无法监听到鼠标双击或者单击事件。

解决此问题之前看了很多文章的方法

1.父元素下嵌套等宽等高的div设置-webkit-app-region: no-drag;

Electron设置-webkit-app-region后无法响应鼠标点击事件的解决方式 - 百度文库

实测没啥用子元素可以点击可以绑定双击事件但是无法实现窗口拖动

2.在导航窗口上设置-webkit-app-region: no-drag;使窗口可以绑定双击全屏事件. 然后内嵌一个透明的div条-webkit-app-region: drag;使窗口头部可双击,顶部可拖动.

红色为透明div可拖动, 缺点是可拖动区域和可双击区域不同使用起来不方便, 不算完美

3.给元素绑定mouse事件. 监听按下,移动和抬起, 看到了此文章

electron 无边框窗口拖拽,不用 drag 样式和三方库,纯代码实现 - 知乎

说单用鼠标事件容易把窗口甩飞,electron 文档中有screen属性可以获取鼠标的位置的绝对坐标,但是发现此方法写的有多改起来麻烦, 秉承着 "用最少的代码实现最稳定好用的功能" 的原则, 自己便改了个简易版只需要几行代码即可实现

实现思路如下:

自定义标题栏父元素舍弃-webkit-app-region属性, 绑定双击事件实现双击最大化窗口,同时绑定鼠标事件mousedown,mousemove,mouseup.鼠标按下时候发送事件到主进程获取鼠标点击窗口位置和窗口的绝对位置获取鼠标位置到窗口左上角的位置差, 移动窗口时直接用鼠标位置screenX(screenY)减去这个差获取到移动后的窗口绝对位置直接发送给主进程设置即可,实测不漂移稳定耐用,完美解决.

header.vue

  1. <div
  2. class="header"
  3. @dblclick="sizeBtn"
  4. @mousedown.self="winDown"
  5. @mousemove.self="winMove"
  6. @mouseup.self="winUp"
  7. >
  8. <!-- xxxxx -->
  9. </div>
  10. <script lang="ts">
  11. const { ipcRenderer } = window.require("electron");
  12. public canMoving = false;
  13. ...
  14. sizeBtn() {
  15. let res: boolean = ipcRenderer.sendSync("max", !this.$store.state.isMax);
  16. this.$store.commit("SET_WIN_MODE", res);
  17. }
  18. // 移动窗口----start
  19. winDown() {
  20. this.canMoving = true;
  21. const XY = ipcRenderer.sendSync("win-start");
  22. this.XY = JSON.parse(XY);
  23. }
  24. winMove(e: any) {
  25. //窗口最大化时禁止移动
  26. if (this.$store.state.isMax) return;
  27. if (!this.canMoving) return;
  28. const params = {
  29. x: e.screenX - this.XY.x,
  30. y: e.screenY - this.XY.y,
  31. };
  32. ipcRenderer.send("win-move", JSON.stringify(params));
  33. }
  34. winUp() {
  35. this.canMoving = false;
  36. }
  37. // 移动窗口----end
  38. ...
  39. </script>

background.ts

  1. // 最大化
  2. ipcMain.on("max", (e, fullScreen: boolean) => {
  3. win!.setFullScreen(fullScreen);
  4. e.returnValue = fullScreen;
  5. });
  6. // 移动窗口----start
  7. ipcMain.on("win-start", (e) => {
  8. const winPosition = win!.getPosition();
  9. const cursorPosition = screen.getCursorScreenPoint();
  10. let x = cursorPosition.x - winPosition[0];
  11. let y = cursorPosition.y - winPosition[1];
  12. e.returnValue = JSON.stringify({ x, y });
  13. });
  14. ipcMain.on("win-move", (_, params) => {
  15. const param = JSON.parse(params);
  16. win!.setPosition(param.x, param.y, true);
  17. });
  18. // 移动窗口----end

原文链接:https://blog.csdn.net/li19931130/article/details/125145650




所属网站分类: 技术文章 > 博客

作者:大哥你来啦

链接:http://www.qianduanheidong.com/blog/article/455502/166b921510952e1c9cbf/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

11 0
收藏该文
已收藏

评论内容:(最多支持255个字符)