【问题标题】:How do i make a separate menu for a specific window in electron?如何为电子中的特定窗口制作单独的菜单?
【发布时间】:2020-01-22 10:54:10
【问题描述】:

我正在 Windows 上开发一个关于此应用程序的窗口,我想为我的关于窗口制作一个自定义菜单栏。由于我已经有一个自定义菜单,有没有办法可以创建另一个菜单并将其仅应用于该特定窗口?

旁注: 这是我的新窗口代码,它应该阻止它被调整并进入全屏,但由于某种原因,最小化和放大按钮仍然有效。

app.on('ready', createWindow);
electron.app.on('ready', () => {
  //Triger update check
  if (!isDev) {
    autoUpdater.checkForUpdates();
  }
})

function createWindow(){
  //create brower window
  win = new BrowserWindow({
  backgroundColor: '#2e2c29',
  width: 800,
  height: 600,
  //transparent: true,
  frame: false,
  titleBarStyle: 'hidden',
  backgroundColor: '#0000',
  webPreferences: {
    nodeIntegration: true
}
  });


//Quit when all windows are closed
  app.on('window-all-closed', () => {
    app.quit()
  })

app.once('ready', function() {

const template = [
  {
    label: 'File',
    submenu: [
      {
          label: 'About Hubris',
          click: () =>
          openAboutWindow()
          },
      { type: 'separator' },
      { role: 'hide' },
      { role: 'hideothers' },
      { role: 'unhide' },
      { type: 'separator' },
      { role: 'quit' }
    ]
  },
  {
label: 'View',
submenu: [

  { role: 'minimize' },
  { role: 'zoom' },
  { type: 'separator' },
  { role: 'togglefullscreen' }
    ]
  },
]

const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)



//here is the code for the about window
var newWindow = null

function openAboutWindow() {

  if (newWindow) {
    newWindow.focus()
    return
  }

  newWindow = new BrowserWindow({
    height: 439,
    resizable: false,
    width: 599,
    title: 'About Hubris',
    minimizable: false,
    fullscreenable: false,
    frame: false,
    titleBarStyle: 'hidden',

  })

  newWindow.loadURL('file://' + __dirname + '/about-this-app.html')

  newWindow.on('closed', function() {
    newWindow = null
  })
}
});

【问题讨论】:

标签: javascript windows electron menubar titlebar


【解决方案1】:

为此,您必须在 main.js 文件的顶部从电子中导入菜单:

// From
const {app, BrowserWindow} = require('electron')

// To
const {app, BrowserWindow, Menu} = require('electron'). 

然后,在 createWindow() 函数的底部附近,我们添加:

function createWindow () {

  // some code here removed for brevity 

  var menu = Menu.buildFromTemplate([
      {
          label: 'Menu',
          submenu: [
              {label:'Adjust Notification Value'},
              {label:'CoinMarketCap'},
              {label:'Exit'}
          ]
      }
  ])
  Menu.setApplicationMenu(menu); 
}

接下来,我们在一系列数组和对象中引用 Menu.buildFromTemplate([{}]),这是我们的菜单实际定义和构建的地方。

“标签”代表您希望菜单显示的名称,因此请输入您喜欢的名称。

“submenu”属性是一个对象数组,每个对象定义点击标签时实际显示的菜单项。

最后,使用 .setApplicationMenu 设置菜单。如果您保存项目,并在控制台中运行 npm start,您将看到显示其项目(数组)的菜单,但如果您单击它们,则没有任何反应。 您可以通过返回到我们的 main.js 来更改此设置,添加以下代码以使我们的退出按钮关闭应用程序:

var menu = Menu.buildFromTemplate([
    {
        label: 'Menu',
            submenu: [
            {label:'Adjust Notification Value'},
            {label:'CoinMarketCap'},
            {
                label:'Exit', 
                click() { 
                    app.quit() 
                } 
            }
        ]
    }
  ])

因此,要使菜单项可点击,我们只需在标签值后添加一个逗号,并引用“click() { }”

在这种情况下,我们在单击 Exit 子菜单项时调用 app.quit()"。通过在控制台中运行 npm start 并单击 Exit 来尝试一下。 而已!

【讨论】:

  • 对不起,我想我不清楚。我添加了我的代码向您展示。发生的事情是我已经有一个自定义菜单,但我想为 about 窗口创建另一个自定义菜单。
【解决方案2】:

您可以即时切换菜单。我有一个具有“编辑器”和“演示”模式的应用程序。我为每种模式创建并存储了一个菜单(它们有不同的菜单项):

let editorMenu = Menu.buildFromTemplate(menuTemplate);

并订阅相关的窗口事件(焦点、模糊等)。然后当一个窗口获得焦点时

Menu.setApplicationMenu(editorMenu);

【讨论】:

  • 我明白你在说什么,但我不知道该怎么做。我真的是电子新手(3 天)。
  • 做一个测试项目;在main.js,创建 2 个窗口,2 个由不同模板构建的菜单,玩各种窗口事件。将“关于窗口”留待以后使用。
猜你喜欢
  • 2019-11-03
  • 2019-09-15
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多