electron-vue 实现自定义拖拽、最小化、最大化、关闭、置顶功能

  1. 使用 vue init simulatedgreg/electron-vue my-project 创建项目
    运行 npm run dev 报错
    在这里插入图片描述
    解决办法:
    在项目的.electron-vue文件下的 webpack.renderer.config.js 和 webpack.web.config.js文件的 plugins里加
 templateParameters(compilation, assets, options) {
        return {
          compilation: compilation,
          webpack: compilation.getStats().toJson(),
          webpackConfig: compilation.options,
          htmlWebpackPlugin: {
            files: assets,
            options: options
          },
          process,
        };
      },

在这里插入图片描述

加入之后重新运行:npm run dev 就ok了。

2.拖拽
在需要拖拽的元素加上:
css: -webkit-app-region: drag;
取消拖拽:
css: -webkit-app-region: no-drag;
3. Home.vue 的代码

<template>
  <div>

    <div class="top_nav">
      <button class="top_btn" :title="top_title" @click="onTopping"></button>
      <button class="min_btn" title="最小化" @click="onMinimize"></button>
      <button class="max_btn" :title="max_title" :style="{backgroundImage:'url('+ max_icon +')'}"
              @click="onMaximize"></button>
      <button class="close_btn" title="关闭" @click="onClose"></button>
    </div>

    你好
  </div>
</template>

<script>


export default {
  name: "Home",
  data() {
    return {
      top_title:"置顶",
      max_title: "最大化",
      max_icon: require("../assets/max.png"),
    }
  },
  mounted() {
    //监听窗口变化
    this.$electron.ipcRenderer.on('restoreMaximize', (event, data) => {
      switch (data) {
        case 'restore':
          this.max_title = "最大化";
          this.max_icon = require("../assets/max.png");
          break;
        case 'maximize':
          this.max_title = "向下还原";
          this.max_icon = require("../assets/reset_max.png");
          break;
      }
    });

    this.$electron.ipcRenderer.on('alwaysOnTop',(event,data)=>{
      switch (data) {
        case 'yes':
            this.top_title = "取消置顶";
          break;
          case 'no':
            this.top_title = "置顶";
            break;
      }
    })
  },
  methods: {
    //置顶功能
    onTopping() {
      this.$electron.ipcRenderer.send('window-top');
    },


    //最小化
    onMinimize() {
      this.$electron.ipcRenderer.send('window-min');
    },
    //最大化
    onMaximize() {
      this.$electron.ipcRenderer.send('window-max');
    },
    //关闭
    onClose() {
      this.$electron.ipcRenderer.send('window-close');
    }
  }
}
</script>

<style scoped lang="scss">
.top_nav {
  height: 32px;
  background: #fff;
  -webkit-app-region: drag;
  display: flex;
  align-items: center;
  justify-content: flex-end;

  button {
    border: none;
    background: none;
    -webkit-app-region: no-drag;
    outline: none;
  }

  button:focus {
    outline: none;
  }

  /*for IE*/
  button::-moz-focus-inner {
    border-color: transparent;
  }

  /*for mozilla*/
  button:focus {
    border: none;
  }

  .top_btn, .min_btn, .max_btn, .close_btn {
    width: 45px;
    height: 32px;
    background-position: center;
    background-repeat: no-repeat;
    background-size: 40%;
  }

  .top_btn:hover,
  .min_btn:hover,
  .max_btn:hover {
    cursor: pointer;
    background-color: #e5e5e5;
  }

  .close_btn:hover {
    background-image: url("../assets/hover_close.png");
    cursor: pointer;
    background-color: #f10707;
  }

  .top_btn {
    background-image: url("../assets/topping.png");
  }

  .min_btn {
    background-image: url("../assets/min.png");
  }

  .close_btn {
    background-image: url("../assets/close.png");
  }
}
</style>

4.ipcMain.js 的代码

const {ipcMain, BrowserWindow} = require('electron');

var mainWindow = BrowserWindow.getFocusedWindow();

//监听窗口变化  实现修改最大化和还原的图标
mainWindow.on('resize',()=>{
    if (!mainWindow.isMaximized()){
        BrowserWindow.getFocusedWindow().webContents.send('restoreMaximize','restore');
    }else {
        BrowserWindow.getFocusedWindow().webContents.send('restoreMaximize','maximize');
    }
})
//置顶
ipcMain.on('window-top', () => {
    if (mainWindow.isAlwaysOnTop()){
        mainWindow.setAlwaysOnTop(false);
        BrowserWindow.getFocusedWindow().webContents.send('alwaysOnTop','no');
    }else {
        mainWindow.setAlwaysOnTop(true);
        BrowserWindow.getFocusedWindow().webContents.send('alwaysOnTop','yes');
    }
});

//最小化
ipcMain.on('window-min', () => {
    mainWindow.minimize();
});

//最大化
ipcMain.on('window-max', () => {

    if (mainWindow.isMaximized()){
        mainWindow.restore();
        //主进程 个渲染进程 发送数据
        BrowserWindow.getFocusedWindow().webContents.send('restoreMaximize','restore');
    }else {
        mainWindow.maximize();
        //主进程 个渲染进程 发送数据
        BrowserWindow.getFocusedWindow().webContents.send('restoreMaximize','maximize');
    }

});
//关闭
ipcMain.on('window-close', () => {
    mainWindow.close();
});



最终效果:
在这里插入图片描述

码云仓库地址:https://gitee.com/huajiuZhao/electron-ment.git

实现拖拽读取文件,可以使用 HTML5 的拖拽 API,结合 Electron 的 IPC 机制来实现。 首先在 HTML 文件中添加一个容器,可以是一个 div 或者其他元素,用来接收文件拖拽事件: ```html <div id="drop-area"> <div class="drop-message">将文件拖拽到此处</div> </div> ``` 然后在渲染进程中,使用 JavaScript 来监听拖拽事件: ```javascript const { ipcRenderer } = require('electron') const dropArea = document.getElementById('drop-area') // 阻止默认的拖拽行为 dropArea.addEventListener('dragover', (event) => { event.preventDefault() }) // 显示拖拽提示信息 dropArea.addEventListener('dragenter', (event) => { event.preventDefault() dropArea.classList.add('drag-over') }) // 隐藏拖拽提示信息 dropArea.addEventListener('dragleave', (event) => { event.preventDefault() dropArea.classList.remove('drag-over') }) // 处理拖拽文件 dropArea.addEventListener('drop', async (event) => { event.preventDefault() dropArea.classList.remove('drag-over') const files = event.dataTransfer.files if (files.length > 0) { const filePath = files[0].path console.log('文件路径:', filePath) ipcRenderer.send('file-dropped', filePath) } }) ``` 这里通过 `ipcRenderer.send` 将文件路径发送给主进程,主进程可以在 `ipcMain` 中监听到这个事件,并进行相应的处理: ```javascript const { ipcMain } = require('electron') const fs = require('fs') ipcMain.on('file-dropped', (event, filePath) => { console.log('文件路径:', filePath) // 读取文件内容 fs.readFile(filePath, 'utf-8', (err, data) => { if (err) { console.error(err) event.reply('file-read-error', err.message) return } console.log('文件内容:', data) event.reply('file-read', data) }) }) ``` 这里使用了 Node.js 的 `fs` 模块来读取文件内容,读取完成后通过 `event.reply` 将文件内容返回给渲染进程。如果读取过程中出现错误,也通过 `event.reply` 返回错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值