如何在wxWidgets中使用窗口的系统菜单?

问题描述 投票:0回答:1

我已经为我的窗口实现了一个自定义标题栏,我想在右键单击它时显示默认的系统(上下文)菜单。我目前的做法如下:

auto sysMenu = ctrl_->MSWGetSystemMenu();
if( sysMenu )
{
  //sysMenu->Bind( wxEVT_MENU, &WxWindow::onSystemMenu, this );
  ctrl_->PopupMenu( sysMenu, pos );
}

成功显示系统菜单,但点击任意项目似乎没有任何效果。我最初以为它会向窗口的消息处理程序发送相关消息,例如

SC_CLOSE
,但它没有发生。我的第二个假设是我可能需要创建自己的处理程序并在那里处理消息。因此,我创建了一个名为
onSystemMenu
的处理函数,如下所示:

void onSystemMenu( wxCommandEvent& e )
{
  int id = e.GetId();

  switch( id )
  {
    case wxID_MAXIMIZE_FRAME: // Maximize the window
      ctrl_->Maximize();
      break;

    case wxID_RESTORE_FRAME: // Restore the window to its previous size and position
      ctrl_->Restore();
      break;

    case wxID_ICONIZE_FRAME: // Minimize the window
      ctrl_->Iconize();
      break;

    case wxID_CLOSE_FRAME: // Close the window
      ctrl_->Close();
      break;

  }
}

但是,接收到的 ID 总是与预期值不同。例如,我收到像

-4048
这样的值,它与我列出的任何 ID 都不对应。我仍然相信应该有一种方法可以实现这一点,而无需手动创建处理程序。有人可以帮忙吗?

c++ winapi wxwidgets
1个回答
0
投票

看来以下代码有效:

        auto pos = wxGetMousePosition();
        auto hwnd = ctrl_->GetHandle();
        auto menu = GetSystemMenu( hwnd, FALSE );
        auto Selected =
          TrackPopupMenu( menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pos.x, pos.y, 0, hwnd, NULL );
        if( Selected )
          PostMessage( hwnd, WM_SYSCOMMAND, Selected, 0 );

也许是 wxWidgets

PopupMenu
中的一个错误?!

© www.soinside.com 2019 - 2024. All rights reserved.