• 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,
         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 = {
         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)
  • 相关阅读:
    cogs 1272. [AHOI2009] 行星序列
    1027. 打印沙漏(20)
    1026. 程序运行时间(15)
    1023. 组个最小数 (20)
    《C语言程序设计(第四版)》阅读心得(四 文件操作)
    1022. D进制的A+B (20)
    1021. 个位数统计 (15)
    1020. 月饼 (25)
    1015. 德才论 (25)
    1009. 说反话 (20)
  • 原文地址:https://www.cnblogs.com/onesea/p/15330772.html
Copyright © 2020-2023  润新知