创建带有公共头部的Electron窗口

创建带有公共头部的Electron窗口

创建一个公共头部的html文件

1.我们在项目根目录创建一个名为app-header的文件夹

2.在app-header创建一个文件名为header.html的文件

结构如下:

在这里插入图片描述

基本结构和脚本如下


<body>
<div class="header">
    <div class="left">
        <div class="back disabled" onclick="onBack()" id="backButton">
            <div class="backImg" id="backImgButton">
            </div>
        </div>
        <div class="forward disabled" onclick="onForward()" id="forwardButton">
            <div class="forwardImg" id="forwardImgButton">
            </div>
        </div>
        <div class="refresh" onclick="onRefresh()">
            <div class="refreshImg">
                <svg>...</svg>
            </div>
        </div>
    </div>
    <div class="center" id="centerName"></div>
    <div class="right">
        <div class="close" onclick="onCloseWindow()">
            <svg>...<svg>
        </div>
    </div>
</div>
<div class="lodings" id="lodings">
    <svg width="50%" height="50%" viewBox="0 0 50 50">
       ...
    </svg>
</div>
</body>

</html>
<script>

    function onBack() {
        window.electron.app.switchWindow(1);
    }

    function onForward() {
        window.electron.app.switchWindow(2);
    }

    function onRefresh() {
        window.electron.app.switchWindow(3);
    }
    //监听是否路由被改变 修改图标和点击状态
    window.electron.app.OnUpdateNavigationButtons((_event, args) => {
        if (args.canGoBack) {
            document.getElementById('backButton').classList.remove('disabled');
            document.getElementById('backImgButton').style.backgroundImage = 'url("./img/left_arrow.png")';
        } else {
            document.getElementById('backButton').classList.add('disabled');
            document.getElementById('backImgButton').style.backgroundImage = 'url("./img/left_arrow_tint.png")';
        }
        if (args.canGoForward) {
            document.getElementById('forwardButton').classList.remove('disabled');
            document.getElementById('forwardImgButton').style.backgroundImage = 'url("./img/right_arrow.png")';
        } else {
            document.getElementById('forwardButton').classList.add('disabled');
            document.getElementById('forwardImgButton').style.backgroundImage = 'url("./img/right_arrow_tint.png")';
        }

    })


    function onCloseWindow(){
        window.close()
    }
</script>
<style>
  /*
	省略
*/
</style>

结果运行如下:

在这里插入图片描述

创建broseWindow并嵌入broseView

根据应用传入的窗口大小,创建对应的broseWindow,并且引入公共头部文件

    let options = JSON.parse(JSON.stringify(args.options))
    // 窗口最小宽高
    if (!options.minWidth) {
      options.minWidth = options.width
    }
    if (!options.minHeight) {
      options.minHeight = options.height
    }
    options.show = false
    //隐藏工具栏
    options.autoHideMenuBar = true
    options.frame = false
    if (!options.webPreferences) {
      options.webPreferences = {}
    }

    options.webPreferences = Object.assign(options.webPreferences, {
      preload: path.join(app.getAppPath(), 'preload.js'),
      // preload: '../screenShotApp/app-header/header.html',
      webSecurity: false,
    })

    const win = new BrowserWindow(options)
    win.loadFile('../screenShotApp/app-header/header.html')

然后把要打开的页面放进broseView中


    //应用本体
    const view: View = new BrowserView({
      webPreferences: {
        preload: path.join(app.getAppPath(), 'preload.js'),
        webSecurity: false,
      },
    })
    
    // 禁止使用 ctrl+r、  F5 等刷新
    win.webContents.on('before-input-event', (event, input) => {
      if ((input.control || input.meta) && input.key === 'r') {
        event.preventDefault();
      }
      if (input.key === 'f5') {
        event.preventDefault();
      }
    })


    view.webContents.loadURL('打开的页面地址')

将创建好的broseView添加到公共的broseWindows中,创建后的broseView 需要header头下偏移,不然会覆盖掉头部样式

 // view.setBounds({ x: 0, y: 45, width: options.width, height: options.height })
    win.on('ready-to-show', () => {
      win.show()
      win.addBrowserView(view);

      const bounds = win.getBounds()
      view.setBounds({ x: 0, y: 40, width: bounds.width, height: bounds.height - 35 })
    })

    win?.on('resize', () => {
      const bounds = win.getBounds()
      view.setBounds({ x: 0, y: 40, width: bounds.width, height: bounds.height - 35 })
    })
    win?.on('close', () => {
      view.webContents.close();
      win?.close();
    })

监听路由是否发生变化 改变左上角图标的状态

    // 监听子窗口路由变化
    view.webContents.on('did-navigate-in-page', (event, url) => {
      const canGoForward = view.webContents.canGoForward();
      const canGoBack = view.webContents.canGoBack();
      win.webContents?.send(channel.appUpdateNavigationButtons, { canGoForward, canGoBack, args });
    });

    BrowserWindow.getAllWindows()
    BrowserWindow.getFocusedWindow()

结果如下:

在这里插入图片描述

总结

本文通过将公共头部的HTML代码分离到一个独立的文件中,可以方便地在多个窗口之间共享和重用头部代码。这样的结构有助于保持代码的整洁和可维护性,同时使得界面设计更加一致。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/645147.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目模块组成 1.2 设计思路 二、(硬件控制端)硬件选型2.1 STM32开发板2.2 PCB板2.3 USB下载线2.4 NBIOT模块2.5 杜邦线&#xff08;2排&#xff09;2.6 稳压模块2.7 电源插头2.8 水温检测传感器2.9 水质检测…

Python 中别再用 ‘+‘ 拼接字符串了!

当我开始学习 Python 时&#xff0c;使用加号来连接字符串非常直观和容易&#xff0c;就像许多其他编程语言&#xff08;比如Java&#xff09;一样。 然而&#xff0c;很快我意识到许多开发者似乎更喜欢使用.join()方法而不是。 在本文中&#xff0c;我将介绍这两种方法之间的…

计算机网络(1

网络初识 目录 网络初识一. 网络分类1. 局域网LAN(Local Area Network):2. 广域网WAN(Wide Area Network): 二. 组建网络的基础设备1. 路由器2. 交换机 三. 标识符 协议 (protocol)一. 协议分层1. 分层的好处2. OSI七层分层3. TCP/IP五层模型(或四层) 模型(1. 物理层(可不算)(2…

从零开始:手把手教你使用Python实现PDF到Excel的转换

来百 在日常工作和学习中&#xff0c;我们经常会遇到需要将PDF文件中的数据提取到Excel表格中的情况。可能是为了进行数据分析、报告生成或者其他目的。虽然手动复制粘贴是一种方法&#xff0c;但对于大量的数据来说&#xff0c;这种方式显然效率太低。幸运的是&#xff0c;Py…

摸鱼大数据——Hive基础理论知识——Hive基础架构

1、Hive和MapReduce的关系 1- 用户在Hive上编写数据分析的SQL语句&#xff0c;然后再通过Hive将SQL语句翻译成MapReduce程序代码&#xff0c;最后提交到Yarn集群上进行运行 2- 大家可以将Hive理解成有道词典&#xff0c;帮助你翻译英文 2、Hive架构 用户接口: 包括 CLI、JDBC/…

ISCC——AI

得到一个T4.pyc 回编译一下 得到下面代码 import base64def encrypt_and_compare(user_input, offset_str, target_base64):if len(user_input) ! 24:return Please enter a string with a length of 24encrypted Nonefor i, char in enumerate(user_input):offset int(off…

自然资源-各级国土空间总体规划的审查要点及流程总结

自然资源-各级国土空间总体规划的审查要点及流程总结 国土空间规划是对一定区域国土空间开发保护在空间和时间上作出的安排&#xff0c;包括总体规划、详细规划和相关专项规划。 国土空间规划管理是国土空间规划中重要的一环。中共中央、国务院发布《关于建立国土空间规划体系…

C++ Primer Plus第十八章复习题

1、使用用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组ar。 class z200 { private:int j;char ch;double z; public:Z200(int jv,char chv&#xff0c;zv) : j(jv), ch (chv), z(zv){} };double x 8.8; std::string s "what a bracing effect ! …

添砖Java(十一)——常见类的使用Object,Math,System,BigDeciaml,包装类

目录 object&#xff1a; toString&#xff1a; equals: ​编辑 Math&#xff1a;​编辑 System: BigDecimal: 基本数据的包装类&#xff1a;​编辑 object&#xff1a; 我们知道&#xff0c;所有的类都是间接或直接继承了object类。然后object里面有几个用得很多的方法…

使用printf的两种方法,解决printf不能使用的问题

使用printf的两种方法&#xff0c;解决printf不能使用的问题 一、微库法 我们使用printf前要加上重定向fputc //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)0);//循环发送,直到发送完毕 USART1->DR (uint8_t) ch; return…

【JVM实践与应用】

JVM实践与应用 1.类加载器(加载、连接、初始化)1.1 类加载要完成的功能1.2 加载类的方式1.3 类加载器1.4 双亲委派模型1.5自定义ClassLoader1.6 破坏双亲委派模型2.1 类连接主要验证内容2.2 类连接中的解析2.3 类的初始化3.1 类的初始化时机3.2 类的初始化机制和顺序3.2 类的卸…

RedHat9 | DNS剖析-配置辅助DNS服务器

一、实验环境 1、辅助域名DNS服务器 DNS通过划分为若干个区域进行管理&#xff0c;每一个区域由1台或多台DNS服务器负责解析&#xff0c;如果仅仅采用1台DNS服务器&#xff0c;在DNS服务器出现故障后&#xff0c;用户将无法完成解析。 辅助DNS服务器的优点 容灾备份&#x…

Star-CCM+中滞环的实现—场平均监视

前言 前文有介绍过通过更新事件来实现滞环,但是更新事件的方法比较繁琐,应用起来比较困难,本文将介绍一种简单的方法来实现滞环功能。即通过场平均监视来实现,具体方法如下: 一 创建场平均监视 首先在检测量下创建“场平均监视”,具体操作步骤如下图所示: 二 创建质量…

企业客户信息反馈|基于SprinBoot+vue的企业客户信息反馈平台(源码+数据库+文档)

企业客户信息反馈平台 目录 基于SprinBootvue的企业客户信息反馈平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台登录 5.2.1管理员功能 5.2.2客户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

如何使用DotNet-MetaData识别.NET恶意软件源码文件元数据

关于DotNet-MetaData DotNet-MetaData是一款针对.NET恶意软件的安全分析工具&#xff0c;该工具专为蓝队研究人员设计&#xff0c;可以帮助广大研究人员轻松识别.NET恶意软件二进制源代码文件中的元数据。 工具架构 当前版本的DotNet-MetaData主要由以下两个部分组成&#xf…

matlab 使用Otsu方法计算图像全局阈值

目录 一、概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述

Java----Maven详解

前言 Maven是Java项目的构建工具&#xff0c;通过项目对象模型&#xff08;POM&#xff09;管理项目配置信息&#xff0c;自动化构建、测试和部署过程。开发人员可定义项目结构、依赖和构建流程&#xff0c;提高开发效率和质量。本文介绍基本概念和用法&#xff0c;帮助您更好…

大工作量LUAD代谢重编程模型多组学(J Transl Med)

目录 1&#xff0c;单细胞早期、晚期和转移性 LUAD 的细胞动力学变化 2&#xff0c;细胞代谢重编程介导的LUAD驱动恶性转移的异质性 3&#xff0c;模型构建 S-MMR评分管线构建 4&#xff0c;S-MMR 模型的预后评估 5&#xff0c; 还开发了S-MMR 评分网络工具 6&#xff0c…

笔记89:LeetCode_135_分发糖果

前言&#xff1a; 注&#xff1a;代码随想录中没有很清楚的提起想出方法的思路&#xff0c;只是给出了解决这个问题的大致思路和代码&#xff1b;下面我将介绍一下我的思考过程&#xff0c;并贴出实现代码&#xff1b; a a a a 思考过程&#xff1a; 思路1&#xff1a;为了…