Skip to main content

Command Palette

Search for a command to run...

wxWidgets实现托盘图标动态右键菜单

Updated
1 min read

首先,按标准流程,基于wxTaskbarIcon实现一个类

namespace TrayThem {
class TrayIcon : public wxTaskBarIcon {
protected:
  virtual wxMenu *CreatePopupMenu();

public:
  explicit TrayIcon(wxTaskBarIconType iconType = wxTBI_DEFAULT_TYPE);
  ~TrayIcon();
};
};

然后,重载它的CreatePopupMenu方法,每次对它点击右键时,就会调用这个方法返回的wxMenu指针,菜单关闭时,这个wxMenu对象就会被销毁

示例代码如下:

wxMenu *TrayThem::TrayIcon::CreatePopupMenu() {
  wxMenu *cm = new wxMenu();
  wxMenuItem *menuShow = cm->Append(wxID_ANY, "Show Program");
  this->Bind(wxEVT_MENU, &TrayThem::TrayIcon::OnMenuShow, this,
             menuShow->GetId());
  wxMenu *mp = new wxMenu();
  cm->AppendSubMenu(mp, "Programs");
  BizBus::GetInstance()->TraverseProgram(
      [](void *opaque, std::shared_ptr<ProgramInfo> info, bool isRunning) {
        wxMenu *mp = static_cast<wxMenu *>(opaque);
        wxMenuItem *item = mp->AppendCheckItem(wxID_ANY, info->program_name);
        item->Check(isRunning);
      },
      mp);
  cm->AppendSeparator();
  wxMenuItem *menuExit = cm->Append(wxID_ANY, "Exit");
  this->Bind(wxEVT_MENU, &TrayThem::TrayIcon::OnMenuExit, this,
             menuExit->GetId());
  return cm;
}

注意,由于每次使用右键菜单后,菜单就会被销毁,因此菜单项的选中状态不会保存,需要自己另外存储,下次创建菜单时,再调用Check方法选中

More from this blog

解决QWidget用winId获取HWND而导致Qt程序无事件消息的问题

问题原因: 当对一个QWidget调用winId时,默认情况下,Qt会对该窗口进行Native化,从而导致如鼠标等事件被其它原生窗口接管,表现出来的现像就是窗口不响应任何事件 解决思路: 防止Qt窗口Native化 解决办法: 第一步,在创建QApplication对象之前设置: QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); //注意:Qt::AA_NativeWindows受环境变量 QT_USE_NATI...

Jul 7, 20251 min read

解决因OpenGL渲染窗口高宽比导致图形变形

在 OpenGL 中,由于窗口的 宽高比(aspect ratio) 与绘制内容的坐标系统不一致,图像会出现拉伸、压缩等变形现象。为了解决这个问题,可根据窗口的大小调整投影矩阵,确保图像在视觉上保持原始比例。 先通过glViewPort调整视口 void resizeGL(int w, int h) { glViewport(0, 0, w, h); } 再根据窗口高宽比,计算出合适的投影矩阵,这样体现出来的样式,就是截掉了宽高比之外的内容,显示的内容不变形,正圆就是正圆,不会被拉伸成...

Jun 18, 20251 min read

雷的部落格威力缩小版

29 posts

雷的部落格威力缩小版