• 7、Electron优雅地加载页面、父子窗口、模态窗口、用代码关闭多个窗口、窗口之间的交互


    index.js

    /**
     * 优雅地加载页面
     * show:false,创建一个隐蔽的窗口
     * win.on("ready-to-show",()=>{
            win.show();
        });//加载完才显示
     */
    
    /**
     * 父子窗口(Mac OS X和Windows有一定差异)
     * 1、子窗口总是在父窗口之上 
     * 2、如果父窗口关闭,子窗口自动关闭
     * 
     * 子窗口相当于父窗口的悬浮窗口
     * Mac OS X和Windows的父子窗口的区别是:
     * 在Mac OS X下,移动父窗口,子窗口会随着父窗口移动
     * 在Windows下子窗口不会移动
     */    
    
    /**
     * 模态窗口(Mac OS X和Windows差异比较大)
     * 模态窗口是指禁用父窗口的子窗口,也就是说,处于模态的子窗口显示后,无法使用父窗口,直到子窗口关闭
     * 1、模态窗口需要是另外一个窗口的子窗口
     * 2、一旦模态窗口显示,父窗口将无法使用
     * 
     * modal=true
     * 
     * Mac OS X 和Windows的模态窗口差异 
     * 1、模态窗口在Mac OS X下会隐藏的标题栏,只能通过close方法关闭模态子窗口
     * 在Windows下,模态子窗口仍然会显示菜单和标题栏
     * 2、在Mac OS X下,模态子窗口显示后,父窗口仍然可以拖动,但无法关闭,在Windows下,模态子窗口显示后父窗口无法拖动
     * 应用:主要用于桌面应用的对话框显示,如设置对话框、打开对话框。
     */
    
    /**用代码关闭多个窗口
     * BrowserWindow对象的close方法用于关闭当前窗口
     * 关闭多窗口的基本原理:将所有窗口的BrowserWindow对象保存起来,只需要调用指定窗口的close方法,就可以关闭指定的一些窗口
     * 
     * global:全局变量,将所有窗口的BrowserWindow对象保存到windows数组中,将该数组保存到global中
     */
    
    /**窗口之间的交互(传递数据)
     * window1和windw2,window1<->window2
     * 窗口之间的交互就是两个窗口之间的双向数据传递
     * 
     * 使用ipc(interProcess Communication,进程间通迅)方式在窗口间传递数据
     * ipcMain和ipcRenderer 
     * ipcMain用于主窗口中
     * ipcRenderer可用于其他窗口
     * 
     * 主窗口:window1,其他窗口:window2
     * 
     * 在Window2中会通过ipcRenderer触发一个事件,用于接收window1传递过来的数据,
     * 在window2关闭时,会通过ipcRenderer给window1发送一个消息,window1通过ipcMain触发一个事件,用于获取window2发过来的数据。
     */
    const {app,BrowserWindow} = require('electron');
    function createWindow(){
        win = new BrowserWindow({
            //show:false,
            webPreferences:{
                nodeIntegration: true, // 是否集成 Nodejs
                enableRemoteModule: true,
                contextIsolation: false,
            }
        });
        childWin=new BrowserWindow({
            parent:win,400,height:300,
            //module:true
        });
        win.loadFile('index.html');
        childWin.loadFile('child.html');
        win.on("ready-to-show",()=>{
            win.show();
        });
        if(process.platform!="darwin"){
            win.setIcon("images\logn.jpg");
        }
        win.on('closed',()=>{
            console.log('closed')
            win=null;
        });
        childWin.on('closed',()=>{
            console.log('closed')
            childWin=null;
        });
    }
    app.on('ready',createWindow);
    app.on('window-all-closed',()=>{
        console.log('window-all-closed');
        if(process.platform!='darwin'){
    
        }
    });
    app.on('activate',()=>{
        console.log('activate');
        if(win==null){
            createWindow();
        }
    });
    View Code

    index.html

    <!DOCTYPE html>
    <html>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>父窗口</title>
    <script src="event.js"></script>
    <body>
        <img src="./images/shj8.jpg">
        
        <h1>书名:<i>山海经</i></h1>
        <br/>
        <br/>
        出版社:<u>大地出版社</u>
        <br/>
        <br/>
        原价:<strike>69</strike>元    促销价:59
        <br/>
        <br/>
        <button id="idInLock" onclick="onClick_close()">关闭窗口</button>
        <br/>
        <button onclick="onClick_CreateMultiWindos()">创建多个窗口</button>
        <br/>
        <button onclick="onClick_CloseAllWindows()">关闭所有窗口</button>
        <br/>
        <button onclick="onclick_SendData()">向新窗口发送数据</button>
        <br/>
        <label id="label_return"></label>
    </body>
    </html>
    View Code

    child.html

    <!DOCTYPE html>
    <html>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>子窗口</title>
    <script src="event.js"></script>
    <body>
        <img src="./images/shj8.jpg">
        
        <h1>书名:<i>子不语</i></h1>
        <br/>
        <br/>
        出版社:<u>大地出版社</u>
        <br/>
        <br/>
        原价:<strike>69</strike>元    促销价:59
        <br/>
        <br/>
        <button id="idInLock" onclick="onClick()">进入锁定模式</button>
    </body>
    </html>
    View Code

    other.html

    <!DOCTYPE html>
    <html>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>接受</title>
    <script src="event.js"></script>
    <body onload="onLoad()">
        <h1>姓名:<label id="label_name"></label></h1>
        <h1>薪水:<label id="label_salary"></label></h1>
        <button id="idInLock" onclick="onClick_Close()">关闭当前窗口,并返回数据</button>
    </body>
    </html>
    View Code

    event.js

    const remote = window.require('electron').remote;
    const BrowserWindow= remote.BrowserWindow;
    
    //关闭当前窗口
    function onClick_close()
    {
        win =remote.getCurrentWindow();
        win.close();
    }
    
    //创建多个窗口
    function onClick_CreateMultiWindos()
    {
        if(global.windows==undefined){
            global.windows=[];
        }
    
        var win=new BrowserWindow({show:false,x:10,y:20,400,height:300});
        global.windows.push(win);
        win.loadFile('child.html');
        win.on("ready-to-show",()=>{
            win.show();
        });
    }
    
    //关闭除主窗口的所有窗口
    function onClick_CloseAllWindows()
    {
        if(global.windows!=undefined){
           for(var i=0;i<global.windows.length;i++)
           {
            global.windows[i].close();
           }
           global.windows.length=0;
           global.windows=undefined;
        }
    }
    
    //获取ipcMain对象
    const ipcMain=remote.ipcMain;
    const {ipcRenderer}=window.require('electron');
    ipcMain.on("other",(event,str)=>{
        const lableReturn=document.getElementById("label_return");
        lableReturn.innerText=str;
    })
    //主窗口向other窗口发送数据
    function onclick_SendData()
    {
        var win=new BrowserWindow({show:false,x:10,y:20,400,height:300,
            webPreferences:{
                nodeIntegration: true, // 是否集成 Nodejs
                enableRemoteModule: true,
                contextIsolation: false,
            }
        });
        win.loadFile('./other.html');
        win.on("ready-to-show",()=>{
            win.show();
            win.webContents.send("data",{name:'xxx',salary:300000});
        });
    }
    
    //other窗口装载页面时显示主窗口传过来的数据
    function onLoad(){
        ipcRenderer.on("data",(event,obj)=>{
            debugger;
            const lableName=document.getElementById("label_name");
            const lableSalary=document.getElementById("label_salary");
            lableName.innerText=obj.name;
            lableSalary.innerText=obj.salary;
        });
    
    }
    
    //关闭other窗口
    function onClick_Close(){
        const win=remote.getCurrentWindow();
        ipcRenderer.send("other","窗口已关闭");
        win.close();
    }
    View Code
  • 相关阅读:
    关于OPENSSL的EVP函数的使用
    在docker下面安装Nginx PHP mysql let's encrypt
    【转】如何统计网站(如个人博客)访问量
    CoolEdit对比两段音频文件:将两段音频文件放在左右声道
    matlab常用的清空和关闭命令(清空变量区、清空命令行、清空图像等)
    TMS320F28335利用ePWM改变ADC采样频率(双通道)示例代码
    Matlab中rand、randn、randi、rands的区别以及用randn生成白噪声的示例
    Matlab中find()寻找函数的常见用法
    【转】 博客园自定义样式修改网页icon图标
    UltraEdit 高亮文档中同名变量
  • 原文地址:https://www.cnblogs.com/xiaoruilin/p/14799594.html
Copyright © 2020-2023  润新知