第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)

这篇具有很好参考价值的文章主要介绍了第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍 😆 😁 😉

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发经验(这段话是来自官网)。

这里我已经搭建好了项目 👉👉👉 快速搭建Electron+Vite3+Vue3+TypeScript5脚手架

在没有任何配置的情况下,项目启动以后会自己带着logo、title、最大化最小化关闭以及工具栏。这些都是可以通过配置去自定义的。原项目启动的UI如下

第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)

二、去掉Electron自带的导航 😝 😝 😝

修改Electron下的main.ts文件,修改完成以后重新启动自带的导航就不会在显示了。

第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)

win = new BrowserWindow({
    icon: './public/logo.png',
    frame: false, // 去掉导航最大化最小化以及关闭按钮
    width: 1200,
    height: 800,
    minWidth: 1200,
    minHeight: 800,
    center: true,
    skipTaskbar: false,
    transparent: false,
    webPreferences: {
        contextIsolation: false,
        webSecurity: false,
    }
})

三、增加自定义导航 😝 😝 😝

自定义导航其实很简单,只需要根据自己的需求去编写相对应的导航vue页面即可。UI组件的化根据自己的需求安装,这里我以element-plus为例。为了后续能够一次性完成代码的编写,把路由也一起安装了。

1、安装依赖 👇 👇 👇

yarn add element-plus vue-router 

因为electron已经删除了remote,所以还需要安装一下@electron/remote

yarn add @electron/remote

2、初始化remote 👇 👇 👇

修改electron下的main.ts,这里除了初始化remote,重点还在nodeIntegration和contextIsolation的设置,为了能在vue文件中使用require。

const { app, BrowserWindow } = require('electron')
const path = require('path')
const remote = require("@electron/remote/main");
remote.initialize();

const NODE_ENV = process.env.NODE_ENV
let win

/**
 * @Description: electron程序入口
 * @Author: Etc.End
 * @Copyright: TigerSong
 * @CreationDate 2023-05-20 14:39:26
 */
const createWindow = () => {
    win = new BrowserWindow({
        icon: './public/logo.png',
        frame: false, // 去掉导航最大化最小化以及关闭按钮
        width: 1200,
        height: 800,
        minWidth: 1200,
        minHeight: 800,
        center: true,
        skipTaskbar: false,
        transparent: false,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            webSecurity: false,
        }
    })

    win.loadURL(
        NODE_ENV === 'development' ? 'http://localhost:5173/' : `file://${path.join(__dirname, '../dist/index.html')}`
    )

    if (NODE_ENV === 'development') {
        win.webContents.openDevTools()
    }

    remote.enable(win.webContents);
}

app.whenReady().then(() => {
    createWindow()
})

/**
 * @Description: 限制只能打开一个页面
 * @CreationDate 2023-05-20 14:35:52
 */
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
    app.quit()
} else {
    app.on('second-instance', (event, commandLine, workingDirectory) => {
        if (win) {
            if (win.isMinimized()) win.restore()
            win.focus()
        }
    })
}

app.on('window-all-closed', function () {
    if(process.platform !== 'darwin') app.quit()
})

3、编写自定义导航 👇 👇 👇

在src/components下新建文件夹header,接着在header文件夹下创建index.vue文件,这里面除了Electron的API调用意外,还有一个重点就是-webkit-app-region: drag;的样式设置,让我们的元素具有拖拽效果,整个header都可以拖拽,但是最小化最大化关闭又得关闭拖拽,让其可以点击,所以又加上了-webkit-app-region: no-drag;的样式属性。

<template>
  <div class="ts-header">
    <div>
        <span>Tiger Song</span>
    </div>
    <div style="-webkit-app-region: no-drag;">
        <el-button title="最小化" @click="minimize()" link type="primary">
            最小化
        </el-button>
        <el-button title="最大化" v-if="!isMaximized" @click="maximize()" link type="primary">
            最大化
        </el-button>
        <el-button title="还原" v-else @click="maximize()" link type="primary">
            还原
        </el-button>
        <el-button title="退出" @click="close()" link type="primary">
            退出
        </el-button>
    </div>
  </div>
</template>

<script lang="ts">
import {defineComponent, onMounted, reactive, toRefs} from "vue";
import 'element-plus/es/components/button/style/css'
import { ElButton } from 'element-plus'
export default defineComponent({
    name: 'Header',
    components: {
        ElButton
    },
    setup() {

        // @ts-ignore
        const remote = require("@electron/remote");
        const win = remote.getCurrentWindow()

        const state = reactive({
            isMaximized: false
        })

        const minimize = () => {
            win.minimize()
        }

        const maximize = () => {
            if (win.isMaximized()) {
                state.isMaximized = false
                win.restore()
            } else {
                state.isMaximized = true
                win.maximize()
            }
        }

        const close = () => {
            win.close()
        }

        onMounted(() => {
            state.isMaximized = remote.getCurrentWindow().isMaximized()
        })

        return {
            ...toRefs(state),
            minimize,
            maximize,
            close,
        }
    }
})
</script>

<style>
.ts-header {
    moz-user-select: -moz-none;
    -moz-user-select: none;
    -o-user-select:none;
    -khtml-user-select:none;
    -webkit-user-select:none;
    -ms-user-select:none;
    user-select:none;
    -webkit-app-region: drag;
    background-color: #2b2b2b;
    color: white!important;
    font-size: 14px;
    padding: 0 16px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 60px;
}
</style>

4、修改App.vue 👇 👇 👇

<template>
    <Header />
    <div>123</div>
</template>

<script lang="ts">
import {defineComponent} from "vue";
import Header from './components/header/index.vue'
export default defineComponent({
    components: {
        Header
    },
    setup() {
        return {
        }
    }
})
</script>

<style>
html, body, #app {
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
}
</style>

5、src下的main.ts去掉样式 👇 👇 👇

第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)

此时如果你src下的main,ts在编辑器里面报错TS2307: Cannot find module './App.vue' or its corresponding type declarations.的话,修改src文件夹下的vite-env.d.ts

declare module '*.vue' {
    import {DefineComponent} from 'vue'
    const component: DefineComponent<{}, {}, any>
    export default component
}

6、全部修改完成以后重新启动应用即可。 👇 👇 👇

这里我只是一个demo演示,如果需要把最大化最小化关闭等设置成图标,整个vite项目自动按需引入的话可以查看我的另一篇文章,照着配置即可。Vite4+Pinia2+vue-router4+ElmentPlus搭建Vue3项目(组件、图标等按需引入)[保姆级]

四、最终效果预览 😝 😝 😝

第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)

 我是Etc.End。如果文章对你有所帮助,能否帮我点个免费的赞和收藏😍。

第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)

 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇文章来源地址https://www.toymoban.com/news/detail-454575.html

到了这里,关于第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第二章 翻译

    Section Ⅲ Translation Directions: In this section, there is a text in English. Translate it into Chinese. Write your translation on ANSWER SHEET 2. (15points) “Sustainability” has become a popular word these days, but to Ted Ning, the concept will always have personal meaning. Having endured a painful period of unsustainability in his own life made it

    2024年02月08日
    浏览(66)
  • 第二章 进程管理

    目录 2.1  进程的引入 2.1.1程序的顺序执行 1.程序的顺序执行 2.程序顺序执行时的特征 2.1.2  程序的并发执行及其特征 1.并发执行的概念 2.程序并发执行时的特征 2.1.3  进程的定义与特征 1.进程的定义 2.进程的特征 2.1.4  进程的基本状态及转换 1.进程的三个基本状态

    2024年02月04日
    浏览(59)
  • 操作系统——第二章

    一.单选题(共30题,60.0分) 1 ()是指从作业提交给系统到作业完成的时间间隔 (2.0分) A、 周转时间 B、 响应时间 C、 等待时间 D、 运行时间 正确答案: A 2 引入多道程序设计技术之后,处理器的利用率() (2.0分) A、 有所改善 B、 极大提高 C、 降低 D、 无变化 正确答

    2023年04月08日
    浏览(52)
  • 第二章 编程基础

    内容框图 单行注释: 快速注释: 多行注释: 使用+号拼接 使用拼接函数 列表 列表是一个有序的序列结构,可以存放不同数据类型的数据。 列表每一个元素有一个索引。 列表可以进行一系列操作,添加,删除,修改元素。 元组是一个有序的序列结构,基本结构和列表类似。

    2024年02月06日
    浏览(64)
  • 第二章 变量和引用

    目录 2.1. 深入认识变量 2.1.1. 什么是变量 2.1.2. 变量的名称 2.1.3. 变量的类型 2.1.4. 变量的定义 2.1.5. 自定义变量 2.1.6. 环境变量 2.1.7. 位置变量 2.2. 变量赋值和作用域 2.2.1. 显示赋值:变量名=变量值 2.2.2. read 从键盘读入变量值 2.2.3. 变量和引号 2.2.4. 变量的作用域 变量是在程序

    2024年02月20日
    浏览(53)
  • 第二章-算法

    算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法有五个基本特征:输入、输出、有穷性、确定性和可行性。 输入:算法具有零个或者多个输入。 输出:算法至少有一个或多个输出。 有穷性:算法在执行了有

    2024年02月14日
    浏览(40)
  • 第二章 re模块

    在处理字符串时,经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 Python 提供了 re 模块用于实现正则表达式的操作。在实现时,可以使用 re 模块提供的方法,如search()、match()、fi

    2024年02月09日
    浏览(39)
  • 第二章 集合

    提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 HashSet 底层就是基于 HashMap 实现的。两者主要区别: 线程是否安全: HashMap 是非

    2024年02月02日
    浏览(60)
  • 第二章:基本概念(下)

    人们往往将信号称为**“软件中断”**。进程收到信号,就意味着某一事件或异常情况的发生。 信号的类型很多,每一种分别标识不同的事件或情况。采用 不同的整数 来标识各种信号类型,并以SIGxxxx 形式的符号名加以定义。 内核、其他进程(只要具有相应的权限)或进程自

    2024年02月08日
    浏览(48)
  • 信息系统安全(第二章)

    2.1.1基本概念 在网络开放环境中,信息系统易遭受各种各样的攻击,例如消息窃听,身份伪装,消息伪造与篡 改,消息重放等。这种入侵行为的实施相当一部分建立在入侵者获得已经存在的通信通道或伪装身 份与系统建立通信通道的基础上。因此,在信息系统中,用户在登

    2024年04月09日
    浏览(88)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包