Electron计算子窗口相对主窗口的出现的位置


需求描述:

无论主窗口被拖至何处,子窗口被打开时都相对于主窗口出现。

1. 子窗口位于主窗口所在屏幕的最右侧最上方

实现效果图

在这里插入图片描述

实现代码

//获取主窗口bounds
    const { width:mainWidth, height:mainHeight, x:mainX, y:mainY } = windows.mainWindow.getBounds();
 
//获取距离主窗口最近的一个屏幕id(即获取主窗口所在的屏幕id)
const nearestScreenId =  screen.getDisplayNearestPoint({
    x: mainX,
    y: mainY
})?.id

//遍历所有屏幕,累加至距离主窗口所在的屏幕宽度
let totalWidth = 0;
for(let i = 0 ; i < screen.getAllDisplays().length; i++){
    const item = screen.getAllDisplays()[i];
    totalWidth += item.bounds.width;
    if(nearestScreenId === item.id){
        break
    }
}
//计算出 x 等于 主窗口所在屏幕的右侧
let x = totalWidth - childWidth;
let y = 0;

2. 子窗口位于主窗口所在屏幕的最左侧最上方

实现效果图

在这里插入图片描述

实现代码

//获取距离主窗口最近的一个屏幕id(即获取主窗口所在的屏幕id)
let nearestScreenId =  screen.getDisplayNearestPoint({
    x: mainX,
    y: mainY
})?.id

//遍历所有屏幕,累加至距离主窗口所在屏幕的前一个屏幕宽度
let totalWidth = 0;
for(let i = 0 ; i < screen.getAllDisplays().length; i++){
    const item = screen.getAllDisplays()[i];
    if(nearestScreenId === item.id){
        break
    }
    totalWidth += item.bounds.width;
}

//计算出 x 等于 主窗口所在屏幕的前一个屏幕的宽度
let x = totalWidth;
let y = 0;

3. 子窗口位于主窗口的中心

实现效果图

在这里插入图片描述

实现代码

//获取主窗口bounds
const { width:mainWidth, height:mainHeight, x:mainX, y:mainY } = windows.mainWindow.getBounds();
let x = mainX + Math.floor((mainWidth - childWidth)/2);
let y = mainY + Math.floor((mainHeight - childHeight)/2);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在electron-vue应用程序中打开一个新的窗口并渲染自己开发的vue组件页面,可以按照以下步骤进行操作: 1.在进程中创建一个新的BrowserWindow实例,该实例将作为窗口打开。 ```javascript // main.js const { BrowserWindow } = require('electron') let childWindow function createChildWindow() { childWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, contextIsolation: false, enableRemoteModule: true, }, }) childWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL + '/#/child') childWindow.on('closed', () => { childWindow = null }) } ``` 2.在vue组件中使用vue-router进行页面跳转,以便在窗口中渲染自己的组件页面。 ```javascript // router/index.js import Vue from 'vue' import Router from 'vue-router' import Child from '@/components/Child' Vue.use(Router) export default new Router({ routes: [ { path: '/child', name: 'Child', component: Child, }, ], }) ``` 3.在渲染进程中使用contextBridge将openWindow方法暴露给vue组件,以便在vue组件中调用该方法打开窗口。 ```javascript // renderer.js const { contextBridge, ipcRenderer } = require('electron') const openWindow = (param) => { ipcRenderer.invoke('on-open-event', param) } contextBridge.exposeInMainWorld('myApi', { openWindow }) ``` 4.在vue组件中调用openWindow方法打开窗口。 ```javascript // Child.vue <template> <div class="child"> <h1>This is a child window</h1> <button @click="openChildWindow">Open Child Window</button> </div> </template> <script> export default { methods: { openChildWindow() { window.myApi.openWindow() }, }, } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值