文档手册

右键菜单

2024-05-14 09:24:21

系统菜单:

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
})