electron窗口相关操作(放大缩小退出,可拖动,可resize等)
如下是对窗口最大化,最小化等相关操作:
import { ipcMain, ipcRenderer, remote } from 'electron'
import is from 'electron-is'
// ipc 通信发送的窗口状态改变事件的channel名称
export const windowStateChangeChannel = 'window-state-changed'
// window的当前状态
export const WINDOW_STATE = {
FULLSCREEN: 'full-screen',
MAXIMIZED: 'maximized',
MINIMIZED: 'minimized',
HIDDEN: 'hidden',
NORMAL: 'normal',
}
// window可执行的操作,通过发送消息触发
const windowAction = {
maximize: 'window-maximize',
unmaximize: 'window-unmaximize',
minimize: 'window-minimize',
close: 'window-close',
}
/**
* 获取window的状态
* @param {window对象} window
*/
export function getWindowState(window) {
if (window.isFullScreen()) {
return WINDOW_STATE.FULLSCREEN
} if (window.isMaximized()) {
return WINDOW_STATE.MAXIMIZED
} if (window.isMinimized()) {
return WINDOW_STATE.MINIMIZED
} if (!window.isVisible()) {
return WINDOW_STATE.HIDDEN
}
return WINDOW_STATE.NORMAL
}
/**
* 发送一个 window-state-changed 消息到 renderer 进程
* @param {\*} window
* @param {\*} state
*/
function sendWindowStateEvent(window, state) {
window.webContents.send(windowStateChangeChannel, state)
}
/**
* 注册 window 状态变化后事件,它会发送一个消息到 renderer 进程
* @param {window对象} window
*/
export function registerWindowStateChangedEvents(window) {
window.on('enter-full-screen', () => sendWindowStateEvent(window, 'full-screen'))
window.on('leave-full-screen', () => sendWindowStateEvent(window, 'normal'))
window.on('maximize', () => sendWindowStateEvent(window, 'maximized'))
window.on('minimize', () => sendWindowStateEvent(window, 'minimized'))
window.on('unmaximize', () => sendWindowStateEvent(window, 'normal'))
window.on('restore', () => sendWindowStateEvent(window, 'normal'))
window.on('hide', () => sendWindowStateEvent(window, 'hidden'))
window.on('show', () => sendWindowStateEvent(window, 'normal'))
}
/**
* 注册 window 状态变化动作,使用 ipc.send 对应的消息触发*
* @param {window对象} window
*/
export function registerWindowStateChangeActions(window) {
// 窗口最小化
ipcMain.on(windowAction.minimize, () => {
window.minimize()
})
// 窗口最大化
ipcMain.on(windowAction.maximize, () => {
window.maximize()
})
// 窗口取消最大化
ipcMain.on(windowAction.unmaximize, () => {
window.unmaximize()
})
// 窗口关闭
ipcMain.on(windowAction.close, () => {
window.close()
})
}
/**
* 生成带有promise的操作窗口的函数,可以进一步处理事件结束后的逻辑
* @param {窗口可执行的操作} windowAction
*/
function generatePromisedWindowStateFunc(action) {
return () => {
return new Promise((resolve) => {
ipcRenderer.send(action)
ipcRenderer.once(windowStateChangeChannel, (event, args) => {
resolve(args)
})
})
}
}
/**
* 生成不带有promise的操作窗口函数,只负责触发事件
* @param {窗口可执行的操作} windowAction
*/
function generateWindowStateFunc(action) {
return () => {
ipcRenderer.send(action)
}
}
/**
* 最大化窗口的方法,因为windows和macOS之间的差异,单独写成一个函数
*/
function handleMaximizeWindow() {
if (is.windows()) {
remote.getCurrentWindow().maximize()
return Promise.resolve(WINDOW_STATE.MAXIMIZED)
}
return new Promise((resolve) => {
ipcRenderer.send(windowAction.maximize)
ipcRenderer.once(windowStateChangeChannel, (event, args) => {
resolve(args)
})
})
}
/**
* 窗口操作方法,包括最大化,最小化,关闭
* 每个方法返回一个promise,方便处理后续逻辑
*/
export const windowStateActionResponse = {
maximize: handleMaximizeWindow,
unmaximize: generatePromisedWindowStateFunc(windowAction.unmaximize),
minimize: generatePromisedWindowStateFunc(windowAction.minimize),
close: generatePromisedWindowStateFunc(windowAction.close),
}
/**
* 窗口操作方法,包括最大化,最小化,关闭
* 只发送消息,不处理成功之后的回调
*/
export const WindowStateAction = {
maximize: generateWindowStateFunc(windowAction.maximize),
unmaximize: generateWindowStateFunc(windowAction.unmaximize),
minimize: generateWindowStateFunc(windowAction.minimize),
close: generateWindowStateFunc(windowAction.close),
}
/**
* 给窗口改变事件增加监听
* @param {事件触发后的回调} handle
*/
export function listenToWindowStateChange(handle) {
ipcRenderer.on(windowStateChangeChannel, handle)
return () => {
ipcRenderer.removeListener(windowStateChangeChannel, handle)
}
}
下面是electron配置:
import { BrowserWindow, screen } from 'electron'
function createWebRTCInternalWindow() {
const displayWorkAreaSize = screen.getAllDisplays()[0].workArea
const options = {
x: displayWorkAreaSize.x,
y: displayWorkAreaSize.y,
width: displayWorkAreaSize.width,
height: displayWorkAreaSize.height,
resizable: true,
movable: true,
fullscreenable: false,
enableLargerThanScreen: false,
frame: true,
transparent: false,
alwaysOnTop: false,
hasShadow: false,
minWidth: 1000,
minHeight: 648,
webPreferences: {
devTools: true,
webSecurity: false,
plugins: true,
experimentalFeatures: true,
experimentalCanvasFeatures: true,
minimumFontSize: 10,
},
}
const mainWindow = new BrowserWindow(options)
return mainWindow
}
export default createWebRTCInternalWindow
import { BrowserWindow, screen } from 'electron'
function createBrowserWindow() {
const displayWorkAreaSize = screen.getAllDisplays()[0].workArea
const options = {
width: parseInt(displayWorkAreaSize.width * 0.85, 10),
height: parseInt(displayWorkAreaSize.height * 0.85, 10),
center: true,
resizable: true,
movable: true,
fullscreenable: false,
enableLargerThanScreen: false,
frame: false,
transparent: true,
alwaysOnTop: false,
clickThrough: 'pointer-events',
acceptFirstMouse: true,
hasShadow: false,
minWidth: 1000,
minHeight: 648,
webPreferences: {
devTools: true,
webSecurity: false,
plugins: true,
experimentalFeatures: true,
experimentalCanvasFeatures: true,
minimumFontSize: 10,
},
}
const mainWindow = new BrowserWindow(options)
return mainWindow
}
export default createBrowserWindow
如上配置中可设置一系列初始值,其中包括 是否可resize,是否可拖动等。如果想在其它地方修改初始值,可按照如下实现:
const currentWindow = require('electron').remote.getCurrentWindow()
currentWindow.setResizable(false)
currentWindow.setMovable(false)
// 禁止Windows下双击最大化和调用maximize行为不一致导致的窗口尺寸变化
currentWindow.setMaximizable(false)
electron窗口相关操作(放大缩小退出,可拖动,可resize等)的更多相关文章
- WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用
一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...
- 解决多指操作放大缩小 指针错误 java.lang.IllegalArgumentException: pointerIndex out of range
/** Custom your own ViewPager to extends support ViewPager. java source: */ /** Created by azi on 20 ...
- Atom窗口切换和放大或者缩小
Atom窗口切换和放大或者缩小 快捷键就是 F11
- WebView 判断放大缩小操作
using Android.App; using Android.Widget; using Android.OS; using Android.Content; using Android.Runt ...
- 猫猫学IOS(二)UI之button操作 点击变换 移动 放大缩小 旋转
不多说,先上图片看效果,猫猫分享.必须精品 原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:viewmode=contents">http://blog.csdn.net/u013 ...
- AJ学IOS(02)UI之按钮操作 点击变换 移动 放大缩小 旋转
不多说,先上图片看效果,AJ分享,必须精品 这个小程序主要实现点击方向键可以让图标上下左右动还有放大缩小以及旋转的功能,点击图片会显示另一张图片. 点击变换 其实用到了按钮的两个状态,再State C ...
- Canvas实现图片放大缩小移动操作
对于HTML5相信大家都不陌生,很早就出来了,但是貌似都没有真正的使用过.最近做项目时要实现这样一个需求:一个图片,大小不固定,要求能实现类似地图一样放大.缩小.移动功能.这里就很合适使用html5的 ...
- Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)
惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...
- 手把手教你打造ImageView支持手势放大缩小
写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过…… ...
随机推荐
- 为centos7配置阿里yum源遇到的问题以及解决方法
[问题背景] 卸载安装的Ambari,之前都是因为卸载不干净.这次重写安装,卸载完之后,发现httpd无法启动,所以想卸载httpd进行重新安装,但是执行命令yum list | grep httpd ...
- java基础类型源码解析之String
差点忘了最常用的String类型,我们对String的大多数方法都已经很熟了,这里就挑几个平时不会直接接触的点来解析一下. 先来看看它的成员变量 public final class String { ...
- [RK3399] Jack server installation not found
CPU:RK3399 系统:Android 7.1 服务器上第一次编译 Android 7.1 的代码,提示 Jack server 没有安装. Jack server installation no ...
- Hibernate 生成策略和缓存策略
主键生成策略 一.主键分类 1. 自然主键 主键本身就是表中的一个字段,实体中一个具体的属性,对象本身唯一的特性 比如:创建一个学生表:姓名.年龄.身份证号(自然主键) 2. 代理主键 主键本身不是表 ...
- this.getClass()和super.getClass()得到的是同一个类
今天dubug代码时发现this.getClass()和super.getClass()得到的竟然是同一个类,都是当前类. 遍访网络资料得出: getClass()不受this和super影响,而是有 ...
- linux操作利器alias用法
写在前边 学习这件事,有时候并不一定很刻意,而是从生活,从经验中去积累,不知道什么时候就发生了. type 命令 一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法 ...
- Android高频单词
Display 显示 Camera 照相机 Bluetooth 蓝牙 Flash Memory 闪存 Audio 音频 Management 管理 SurFace 界面 Media 多媒体 Frame ...
- YApi内部部署文档
旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API 1.安装Node.js环境(7.6+) 1.官网下载适合的nodejs版本放置在/usr/package ...
- VisualStudio版本号
VisualStudio的工程文件,后面的数字对应的VS的版本号, 71表示的VS2003, 80表示VS2005, 90表示VS2008, 10表示VS2010等.
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_16-认证接口开发-Api接口定义
4.3 认证服务 4.3.1 需求分析 认证服务需要实现的功能如下: 1.登录接口 前端post提交账号.密码等,用户身份校验通过,生成令牌,并将令牌存储到redis. 将令牌写入cookie. 2. ...