const ( MENU_ID_BACK MenuId = 100 // 回退 MENU_ID_FORWARD MenuId = 101 // 前进 MENU_ID_RELOAD MenuId = 102 // 重新加载 MENU_ID_RELOAD_NOCACHE MenuId = 103 // 重新加载(忽略缓存) MENU_ID_STOPLOAD MenuId = 104 // 停止加载 MENU_ID_UNDO MenuId = 110 // 撤销 MENU_ID_REDO MenuId = 111 // 重做 MENU_ID_CUT MenuId = 112 // 剪切 MENU_ID_COPY MenuId = 113 // 复制 MENU_ID_PASTE MenuId = 114 // 粘贴 MENU_ID_DELETE MenuId = 115 // 删除 MENU_ID_SELECT_ALL MenuId = 116 // 全选 MENU_ID_FIND MenuId = 130 // 查找 MENU_ID_PRINT MenuId = 131 // 打印 MENU_ID_VIEW_SOURCE MenuId = 132 // 查看页面源代码 MENU_ID_SPELLCHECK_SUGGESTION_0 MenuId = 200 // 拼写检查建议 0 MENU_ID_SPELLCHECK_SUGGESTION_1 MenuId = 201 // 拼写检查建议 1 MENU_ID_SPELLCHECK_SUGGESTION_2 MenuId = 202 // 拼写检查建议 2 MENU_ID_SPELLCHECK_SUGGESTION_3 MenuId = 203 // 拼写检查建议 3 MENU_ID_SPELLCHECK_SUGGESTION_4 MenuId = 204 // 拼写检查建议 4 MENU_ID_SPELLCHECK_SUGGESTION_LAST MenuId = 204 // 最后一个拼写检查建议 MENU_ID_NO_SPELLING_SUGGESTIONS MenuId = 205 // 没有拼写建议 MENU_ID_ADD_TO_DICTIONARY MenuId = 206 // 添加到字典 MENU_ID_CUSTOM_FIRST MenuId = 220 // 自定义菜单项起始 MENU_ID_CUSTOM_LAST MenuId = 250 // 自定义菜单项结束 MENU_ID_USER_FIRST MenuId = 26500 // 用户菜单项起始 MENU_ID_USER_LAST MenuId = 28500 // 用户菜单项结束 )
var ( menuId01 consts.MenuId menuId02 consts.MenuId menuId03 consts.MenuId menuId0301 consts.MenuId menuId0302 consts.MenuId menuIdCheck consts.MenuId isMenuIdCheck = true menuIdEnable consts.MenuId isMenuIdEnable = true menuIdEnableCtl consts.MenuId menuIdRadio101 consts.MenuId menuIdRadio102 consts.MenuId menuIdRadio103 consts.MenuId radioDefault1Check consts.MenuId menuIdRadio201 consts.MenuId menuIdRadio202 consts.MenuId menuIdRadio203 consts.MenuId radioDefault2Check consts.MenuId ) //右键弹出菜单 event.SetOnBeforeContextMenu(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, params *cef.ICefContextMenuParams, model *cef.ICefMenuModel, window cef.IBrowserWindow) bool { //既然是自定义,当然要去除之前事先定义好的 model.Clear() //开始创建菜单,每个菜单项都有自己的ID, 所以要先定义一个能保存这些菜单项的ID的变量 fmt.Printf("%+v\n", params) //注意: 每个菜单项的ID有固定的 ID 生成函数 //获取一个菜单项ID menuId01 = model.CefMis.NextCommandId() model.AddItem(menuId01, "菜单一 html 文字变红色") menuId02 = model.CefMis.NextCommandId() model.AddItem(menuId02, "菜单二 html 文字变绿色") menuId03 = model.CefMis.NextCommandId() menu03 := model.AddSubMenu(menuId03, "菜单三 带有子菜单") menuId0301 = model.CefMis.NextCommandId() menu03.AddItem(menuId0301, "菜单三的子菜单一 ") menuId0302 = model.CefMis.NextCommandId() menu03.AddItem(menuId0302, "菜单三的子菜单二") model.AddSeparator() //check menuIdCheck = model.CefMis.NextCommandId() model.AddCheckItem(menuIdCheck, "这是一个checkItem-好像就windows有效") model.SetChecked(menuIdCheck, isMenuIdCheck) //enable model.AddSeparator() menuIdEnable = model.CefMis.NextCommandId() if isMenuIdEnable { model.AddItem(menuIdEnable, "菜单-已启用") model.SetColor(menuIdEnable, consts.CEF_MENU_COLOR_TEXT, consts.NewCefARGB(255, 111, 12, 200)) } else { model.AddItem(menuIdEnable, "菜单-已禁用") } model.SetEnabled(menuIdEnable, isMenuIdEnable) menuIdEnableCtl = model.CefMis.NextCommandId() model.AddItem(menuIdEnableCtl, "启用上面菜单") //为什么要用Visible而不是不创建这个菜单? 因为菜单项的ID是动态的啊。 model.SetVisible(menuIdEnableCtl, !isMenuIdEnable) if !isMenuIdEnable { model.SetColor(menuIdEnableCtl, consts.CEF_MENU_COLOR_TEXT, consts.NewCefARGB(255, 222, 111, 0)) } model.AddSeparator() //radio 1组 menuIdRadio101 = model.CefMis.NextCommandId() menuIdRadio102 = model.CefMis.NextCommandId() menuIdRadio103 = model.CefMis.NextCommandId() model.AddRadioItem(menuIdRadio101, "单选按钮 1 1组", 1001) model.AddRadioItem(menuIdRadio102, "单选按钮 2 1组", 1001) model.AddRadioItem(menuIdRadio103, "单选按钮 3 1组", 1001) if radioDefault1Check == 0 { radioDefault1Check = menuIdRadio101 } model.SetChecked(radioDefault1Check, true) model.AddSeparator() //radio 2组 menuIdRadio201 = model.CefMis.NextCommandId() menuIdRadio202 = model.CefMis.NextCommandId() menuIdRadio203 = model.CefMis.NextCommandId() model.AddRadioItem(menuIdRadio201, "单选按钮 1 2组", 1002) model.AddRadioItem(menuIdRadio202, "单选按钮 2 2组", 1002) model.AddRadioItem(menuIdRadio203, "单选按钮 3 2组", 1002) if radioDefault2Check == 0 { radioDefault2Check = menuIdRadio201 } model.SetChecked(radioDefault2Check, true) return true })
event.SetOnContextMenuCommand(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, params *cef.ICefContextMenuParams, menuId consts.MenuId, eventFlags uint32, window cef.IBrowserWindow) bool { fmt.Printf("params: %+v\n", params) fmt.Println("menuId: ", menuId, eventFlags) //在这里处理某个菜单项的点击事件所触发的命令,这里的命令对应着一个菜单项的ID var clickMenuId = 0 switch menuId { case menuId01: clickMenuId = 1 case menuId02: clickMenuId = 2 case menuIdEnable: isMenuIdEnable = !isMenuIdEnable case menuIdCheck: isMenuIdCheck = !isMenuIdCheck case menuIdEnableCtl: isMenuIdEnable = true case menuIdRadio101, menuIdRadio102, menuIdRadio103: radioDefault1Check = menuId case menuIdRadio201, menuIdRadio202, menuIdRadio203: radioDefault2Check = menuId } ipc.Emit("menu", clickMenuId, fmt.Sprintf("菜单 %d 随便传点什么吧 但是,字符串参数字符串参数字符串参数字符串参数字符串参数字符串参数字符串参数.", menuId)) //*result = true return true })
下面是子窗口启用Dev Tools :
//点击菜单后执行的内容 newllqChromium.SetOnContextMenuCommand(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, params *cef.ICefContextMenuParams, commandId consts.MenuId, eventFlags uint32) bool { fmt.Printf("params: %+v\n", params) fmt.Println("menuId: ", commandId, eventFlags) //在这里处理某个菜单项的点击事件所触发的命令,这里的命令对应着一个菜单项的ID switch commandId { case menuDev: browser.ShowDevTools(window, Quark) } //发送信号 ipc.Emit("menu", fmt.Sprintf("菜单 %d 随便传点什么吧 但是,字符串参数字符串参数字符串参数字符串参数字符串参数字符串参数字符串参数.", commandId)) //*result = true return true })