electron+vue製作桌面應用--自定義標題欄最大/小化和關閉

weixin_33806914發表於2017-10-29

上一篇:electron+vue製作桌面應用--自定義標題欄中我們介紹瞭如何使用electon製作自定義樣式的標題欄
接下來,我們介紹一下標題欄上的最大化、最小化和關閉按鈕如何實現

首先查閱electron文件BrowserWindow部分,我們發現electron已經準備好win.close()、win.maximize()和win.minimize()三個方法供我們呼叫了。

那麼問題來了,我的渲染程式獲取到了點選事件,如何到主程式中呼叫對應的方法呢?

這裡有兩種方法,一種是使用ipc,另一種是使用romate
這裡先介紹下ipc
新建元件Titlebtn,'src\renderer\components\mytitle\Titlebtn.vue'

<template>
  <div 
    class="titlebtn" 
    v-bind:style="style"
    v-on:click="click"/>
</template>

<script>
    const {ipcRenderer: ipc} = require('electron');
    const style = {
        min: {
            backgroundColor: 'green',
            right: '100px'
        },
        max: {
            backgroundColor: 'yellow',
            right: '60px'
        },
        close: {
            backgroundColor: 'black',
            right: '20px'
        }
    };
    export default {
        name: 'Titlebtn',
        props: ['type'],
        computed: {
            style: function () {
                return style[this.type];
            }
        },
        methods: {
            click: function () {
                ipc.send(this.type);
            }
        }
    }
</script>
    
<style>
.titlebtn {
    position: absolute;
    width: 20px;
    height: 20px;
    top: 0;
    bottom: 0;
    margin: auto 0;
    -webkit-app-region: no-drag;
}
</style>

這裡需要注意一下,因為之前我們設定標題欄樣式-webkit-app-region: drag,這裡按鈕必須設定樣式-webkit-app-region: no-drag,不然按鈕將無法選中或點選
滑鼠點選按鈕後,通過ipcRenderer向主程式傳送訊息
然後修改我們的Titlebtn元件,如下

<template>
    <div id="mytitle">
        <Titlebtn type="min" />
        <Titlebtn type="max" />
        <Titlebtn type="close" />
    </div>
</template>

<script>
    import Titlebtn from './Titlebtn.vue';
    export default {
        name: 'Mytitle',
        components: {
            Titlebtn
        }
    }
</script>
    
<style>
#mytitle {
    position: absolute;
    width: 100%;
    height: 52px;
    background-color: rgb(198, 47, 47);
    -webkit-app-region: drag;
}
</style>

修改主程式index.js,監聽渲染程式的訊息,並根據訊息執行相應的動作

import { ipcMain } from 'electron'
ipcMain.on('min', e=> mainWindow.minimize());
ipcMain.on('max', e=> {
    if (mainWindow.isMaximized()) {
        mainWindow.unmaximize()
    } else {
        mainWindow.maximize()
    }
});
ipcMain.on('close', e=> mainWindow.close());

相關文章