C++ OSX上的空wxWidgets菜单

C++ OSX上的空wxWidgets菜单,c++,macos,menu,wxwidgets,menubar,C++,Macos,Menu,Wxwidgets,Menubar,我正在使用OSX 10.8.3和 我想将带有一些菜单的菜单栏添加到wxFrame: wxMenuBar* menuBar = new wxMenuBar(); wxMenu* fileMenu = new wxMenu(); wxMenu* helpMenu = new wxMenu(); helpMenu->Append(wxID_ABOUT, wxT("About")); fileMenu->Append(wxID_EXIT, wxT("Exit")); menuBar-&

我正在使用OSX 10.8.3和

我想将带有一些菜单的菜单栏添加到
wxFrame

wxMenuBar* menuBar = new wxMenuBar();

wxMenu* fileMenu = new wxMenu();
wxMenu* helpMenu = new wxMenu();

helpMenu->Append(wxID_ABOUT, wxT("About"));
fileMenu->Append(wxID_EXIT, wxT("Exit"));

menuBar->Append(fileMenu, wxT("File"));
menuBar->Append(helpMenu, wxT("About"));

SetMenuBar(menuBar);
由于我使用标准ID添加菜单项(如上所述),它会自动将关于退出移动到应用程序菜单(我认为它被调用),但也会使文件帮助菜单为空:

有没有办法隐藏那些空菜单

事实上,我试图移除它们:

#if defined(__WXMAC__) || defined(__WXOSX__) || defined(__WXOSX_COCOA__)
    menuBar->Remove(0);
    menuBar->Remove(0);
#endif

但这导致“关于”和“退出”菜单项“帮助文本”无法显示在“我的框架”状态栏上(也可能有其他副作用)。

这是可能的(希望在3.0之前也会如此)wxOSX本身可能会有所改进,但目前您需要解决这种特殊情况,即顶级菜单仅包含一个带有标准标识符的菜单项,该菜单项将移动到OSX下的应用程序菜单中


对于“文件”菜单来说,这通常根本不是问题,在实际应用程序中,几乎总是会有其他项目,但对于“帮助”菜单来说,这种情况确实经常发生。你现在能做的最好的事情就是在你的“帮助”菜单创建代码周围放一个
\ifndef\uuu WXOSX\uuuuu
(顺便说一句,这就足够了,不需要测试其他两个,请参见)相反,将
wxID\uAbout
添加到其他菜单中(不管是哪一个,因为它将被移动,所以在你的示例中可能是“文件”)在
#ifdef uu WXOSX uu
的情况下。

似乎没有标准的方法在wxWidgets中隐藏菜单

最后,我编写了几行Objective-C代码来查找和隐藏空菜单:

// MacMenuWorkaround.h

#import <Cocoa/Cocoa.h>

@interface MacMenuWorkaround : NSObject

+(void) hideEmptyMenus;

@end


然后在我的代码中:

#include "MacMenuWorkaroundBridge.h"
//...
#if defined(__WXMAC__) || defined(__WXOSX__) || defined(__WXOSX_COCOA__)
CocoaBridge::hideEmptyMenus();
#endif

我是wxWidgets的新手,遇到了完全相同的问题。(似乎是这样:) 令人惊讶的是,我们的规格如此相似。我想唯一的区别是我使用的是MacOSX10.8.4

我不想写一个Objective-C解决方案,因为它对我来说似乎有点违反直觉,(无意冒犯,我钦佩你的毅力),所以我找到了一个bug报告来回答这个问题。我想我会把它贴在这里给未来的访客

我们的问题出现在trac.wxwidgets.org上的错误报告中

在Mac上,“退出”和“关于”菜单项被设计为属于“程序”菜单。(最左边的粗体字) 如果您尝试将带有wxID_EXIT id的菜单项添加到文件菜单中,它将不会显示

如果必须将“退出”和/或“关于”菜单项放在除“程序”菜单之外的另一个菜单中,则可以通过为其分配除wxID_EXIT之外的不同ID来完成。比如说10个

file->Append(wxID_EXIT, wxT("&Quit"));
致:

我以为我注定了。认真地在我的程序中永远不能有菜单是不可想象的。但是,只有“退出”和“关于”这几个标准菜单是为Mac上的程序菜单保留的

我希望这对你们有帮助。
守寡快乐

谢谢你的意见。我正在寻找一种方法来编写一些独立于平台并遵守标准的代码。我不介意为特定的平台编写额外的代码以使其正常工作。我只是不想把改变语义作为一种解决方法。
// MacMenuWorkaroundBridge.cpp
// Set file type to Objective-C++ Source

#import "MacMenuWorkaround.h"
#include "MacMenuWorkaroundBridge.h"

namespace CocoaBridge {
    void hideEmptyMenus() {
        [MacMenuWorkaround hideEmptyMenus];
    }
}
#include "MacMenuWorkaroundBridge.h"
//...
#if defined(__WXMAC__) || defined(__WXOSX__) || defined(__WXOSX_COCOA__)
CocoaBridge::hideEmptyMenus();
#endif
file->Append(wxID_EXIT, wxT("&Quit"));
file->Append(10, wxT("&Quit"));