【Electron+Vue】【三】主脚本+自定义标题栏+自定义最小化、最大化、关闭按钮

目录

简单介绍

主脚本

自定义标题栏

自定义最小化、最大化、关闭按钮


简单介绍

在前四篇介绍了electron+vue的难点,到了真正上手的时候会发现有很多的细节才是真正让人头疼的,网上答案千篇一律,并不能起什么效果,现在就具体开发细节问题来做一下整体说明!

主脚本

经过反复研究,很完美了。

'use strict'
// 为了管理您应用程序的生命周期事件,以及创建和控制浏览器窗口,您从electron软件包导入了app 和 BrowserWindow模块 。
import {
  app,
  ipcMain,
  BrowserWindow
} from 'electron'

if (process.env.NODE_ENV !== 'development') {
  global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
}

let mainWindow = BrowserWindow.getFocusedWindow()
const winURL = process.env.NODE_ENV === 'development' ? `http://localhost:9080` : `file://${__dirname}/index.html`

// 定义一个函数,该函数创建一个 新的浏览窗口 启用了节点集成,将index.html文件加载到此窗口中(第 32 行),
// 并打开开发人员工具(第 33 行)。
function createWindow () {
  mainWindow = new BrowserWindow({
    height: 690,
    useContentSize: true,
    width: 1020,
    frame: false, // 去掉窗口边框 // 取消默认的头部;自定义头部
    autoHideMenuBar: true, // 隐藏菜单栏
    simpleFullscreen: true,
    // resizable: false,//可否缩放,会让放大后的窗口不能恢复
    // resizable: process.platform === 'darwin', //可否调整大小
    minimizable: true, // 可否最小化
    maximizable: true, // 可否最大化
    closable: true, // 展示关闭按钮
    fullscreen: false, // MAC下是否可以全屏
    skipTaskbar: false, // 在任务栏中显示窗口
    acceptFirstMouse: true, // 是否允许单击页面来激活窗口
    transparent: false,
    movable: true, // 可否移动
    allowRunningInsecureContent: true, // 允许一个 https 页面运行 http url 里的资源
    // 网页功能设置
    webPreferences: {
      devTools: true, // 是否打开调试模式
      webSecurity: false, // 禁用安全策略
      allowDisplayingInsecureContent: true, // 允许一个使用 https的界面来展示由 http URLs 传过来的资源
      allowRunningInsecureContent: true, // 允许一个 https 页面运行 http url 里的资源
      nodeIntegration: true, // 5.x以上版本,默认无法在渲染进程引入node模块,需要这里设置为true  //是否集成node,默认false
      enableRemoteModule: true // 打开remote模块
    },
    title: '跨平台桌面应用开发',
    x: 0,
    y: 0,
    backgroundColor: '#fff'
  })

  mainWindow.loadURL(winURL)
  // mainWindow.webContents.openDevTools()
  mainWindow.on('closed', () => {
    mainWindow = null
  }).on('close', event => {
    mainWindow.send('close-window-render')
    event.preventDefault()
  }).on('ready-to-show', () => {
    mainWindow.show()
  })
}

// 通过调用 createWindow方法,在 electron app 第一次被初始化时创建了一个新的窗口
app.on('ready', createWindow)

// 添加了一个新的侦听器,当应用程序不再有任何打开窗口时试图退出。 因为操作系统窗口管理行为 ,此监听器在 macOS 上是一个禁门。
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 添加一个新的侦听器,只有当应用程序激活后没有可见窗口时,才能创建新的浏览器窗口。
// 例如,在首次启动应用程序后,或重新启动已在运行的应用程序。
app.on('activate', () => {
  if (mainWindow === null) {
    createWindow()
  }
})

// 以下为自定义
// 窗口最小化
ipcMain.on('window-min', () => {
  mainWindow.minimize()
})
// 窗口最大化
ipcMain.on('window-max', () => {
  if (mainWindow.isMaximized()) {
    mainWindow.restore()
  } else {
    mainWindow.maximize()
  }
})
// 窗口关闭
ipcMain.on('window-close', () => {
  mainWindow.close()
})

自定义标题栏

electron会默认显示边框和标题栏,如下图

我们来看一下如何自定义一个标题栏,例如网易云音乐这种 

图片描述

首先我们要把默认的标题栏删掉,找到主进程中创建窗体部分,new BrowserWindow时添加参数frame: false即可

mainWindow = new BrowserWindow({
    useContentSize: true,
    frame: false,
  })

这样会把标题栏和边框一并隐藏

但是!实践起来没有效果!!!

  • 原因在于代码的报错,页面是没有任何报错的!
  • 代码报错1:缺少空格
  • 代码报错2:文件末尾空行太多

所以一定要解决完这页所有的报错才会运行起来! 

扩展:

VScode中关闭空格检查

凡是webpack文件中这种格式的都依此注释

自定义最小化、最大化、关闭按钮

步骤一:

index.js添加

import {
  app,
  ipcMain,
  BrowserWindow
} from 'electron'
//登录窗口最小化 
ipcMain.on('window-min', function () {
  mainWindow.minimize();
})
//登录窗口最大化 
ipcMain.on('window-max', function () {
  if (mainWindow.isMaximized()) {
      mainWindow.restore();
  } else {
      mainWindow.maximize();
  }
})
//登录窗口关闭
ipcMain.on('window-close', function () {
  mainWindow.close();
})

步骤二:

头部文件添加

            <Button @click="minimize" type="text">
                <Icon type="ios-remove size-common2 font-weight" />
            </Button>
            <Button @click="max" type="text">
                <Icon v-show="max_icon" type="ios-square-outline size-common1-5 font-weight" />
                <Icon v-show="!max_icon" type="ios-browsers-outline size-common1-5 font-weight" />
            </Button>
            <Button @click="close" type="text">
                <Icon type="ios-close size-common2-5 font-weight" />
            </Button>

js  两方案的选其一即可

import {
        remote
    } from "electron";
    const {
        BrowserWindow
    } = remote;
    export default {
       data() {
            return {
                max_icon: true,
            }
        },
        methods: {
            close() {
                // 方案一
                //返回一个所有已经打开了窗口的对象数组
                const window = BrowserWindow.getFocusedWindow()
                window.close()
                // 方案二
                // this.$electron.ipcRenderer.send("window-close");
                //方案三:只需要在渲染进程进行修改就可以了 , 我们无需在去主进程修改代码
                // remote.getCurrentWindow().close();
            },
            minimize() {
                // 方案一
                const window = BrowserWindow.getFocusedWindow()
                window.minimize()
                // 方案二
                // this.$electron.ipcRenderer.send("window-min");
                //方案三:只需要在渲染进程进行修改就可以了 , 我们无需在去主进程修改代码
                // remote.getCurrentWindow().minimize();
            },
            //放大和恢复在index.js已经处理过了,控制图标就好了
            max() {
                // 方案一
                // const window = BrowserWindow.getFocusedWindow()
                // window.maximize()
                // 方案二
                this.$electron.ipcRenderer.send("window-max");
                // 方案三:只需要在渲染进程进行修改就可以了 , 我们无需在去主进程修改代码
                // remote.getCurrentWindow().maximize()
                this.max_icon = !this.max_icon
            }
  }
}

注意:

在JS中一定要先引用 再定义变量哦 

当我们写完自定义导航时会发现窗口无法拖拽 , 啥原因呢?

应用程序需要在 CSS 中指定 -webkit-app-region: drag 来告诉 Electron 哪些区域是可拖拽的
在可拖拽区域内部使用 -webkit-app-region: no-drag 则可以将其中部分区域排除
拖动行为可能与选择文本冲突。 例如, 当您拖动标题栏时, 您可能会意外地选择标题栏上的文本。 为防止此操作, 您需要在可区域中禁用文本选择

我们可以添加如下代码来解决

.titlebar {
  -webkit-app-region: drag;
  -webkit-user-select: none;
}

  

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要实现自定义菜单栏,可以使用 Electron 提供的 Menu 模块。以下是一个使用 Electron Vite Vue 实现自定义菜单栏的步骤: 1. 在 Vue 组件中引入 Electron 的 remote 模块,用于获取进程的 Menu 对象。 ```javascript import { remote } from 'electron' const Menu = remote.Menu ``` 2. 在 Vue 组件的生命周期钩子函数中创建菜单项,可以使用 Menu.buildFromTemplate 方法创建菜单项的数组。 ```javascript created() { const template = [ { label: '文件', submenu: [ { label: '新建', accelerator: 'CmdOrCtrl+N', click: this.handleNew }, { label: '打开', accelerator: 'CmdOrCtrl+O', click: this.handleOpen }, { type: 'separator' }, { label: '保存', accelerator: 'CmdOrCtrl+S', click: this.handleSave }, { label: '另存为', accelerator: 'Shift+CmdOrCtrl+S', click: this.handleSaveAs }, { type: 'separator' }, { label: '退出', accelerator: 'CmdOrCtrl+Q', click: this.handleQuit } ] }, { label: '编辑', submenu: [ { label: '撤销', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, { label: '重做', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, { type: 'separator' }, { label: '剪切', accelerator: 'CmdOrCtrl+X', role: 'cut' }, { label: '复制', accelerator: 'CmdOrCtrl+C', role: 'copy' }, { label: '粘贴', accelerator: 'CmdOrCtrl+V', role: 'paste' }, { label: '全选', accelerator: 'CmdOrCtrl+A', role: 'selectAll' } ] } ] const menu = Menu.buildFromTemplate(template) Menu.setApplicationMenu(menu) } ``` 3. 在 Vue 组件中实现菜单项的点击事件。 ```javascript methods: { handleNew() { // 新建文件 }, handleOpen() { // 打开文件 }, handleSave() { // 保存文件 }, handleSaveAs() { // 另存为文件 }, handleQuit() { // 退出应用程序 } } ``` 这样就可以在 Electron Vite Vue 应用程序中实现自定义菜单栏了。需要注意的是,菜单项的点击事件可以调用进程中的方法,例如使用 ipcRenderer 发送消息给进程,让进程执行相应的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BMG-Princess

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值