C++ OSX上的空wxWidgets菜单
我正在使用OSX 10.8.3和 我想将带有一些菜单的菜单栏添加到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-&
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"));