我在 OSX 10.8.3 和wxWidgets 2.9.4上使用built the library for Cocoa。
我想在菜单栏中添加一些菜单到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添加菜单项(如here所述),它会自动将关于和退出移动到应用程序菜单(我认为它被称为apple
menu
),但也会将文件和帮助菜单设为空:
有没有办法隐藏那些空菜单?
实际上我试图删除它们:
#if defined(__WXMAC__) || defined(__WXOSX__) || defined(__WXOSX_COCOA__)
menuBar->Remove(0);
menuBar->Remove(0);
#endif
但是这会导致约和退出菜单项 HelpText ,不会显示在我的框架 StatusBar 上(也可能有其他副作用。)
答案 0 :(得分:1)
在 wxWidgets 中隐藏菜单似乎没有标准方法。
我最后写了几行 Objective-C 代码来查找和隐藏空菜单:
// MacMenuWorkaround.h
#import <Cocoa/Cocoa.h>
@interface MacMenuWorkaround : NSObject
+(void) hideEmptyMenus;
@end
// MacMenuWorkaround.m
#import "MacMenuWorkaround.h"
@implementation MacMenuWorkaround
+(void) hideEmptyMenus {
NSMenu* mainMenu = [[NSApplication sharedApplication] mainMenu];
for (NSMenuItem* item in [mainMenu itemArray]) {
NSMenu* menu = [item submenu];
if ([[menu itemArray] count] < 2) {
[item setHidden:YES];
}
}
}
@end
// MacMenuWorkaroundBridge.h
#ifndef __wxstarter__MacMenuWorkaroundBridge__
#define __wxstarter__MacMenuWorkaroundBridge__
namespace CocoaBridge {
void hideEmptyMenus();
}
#endif /* defined(__wxstarter__MacMenuWorkaroundBridge__) */
// 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
答案 1 :(得分:1)
我是wxWidgets的新手,我遇到了完全相同的问题。 (或者似乎:) 它的惊人与我们的规格相似。我认为唯一的区别是我使用的是Mac OSX 10.8.4
我不想写一个Objective-C的工作,因为它对我来说似乎有点反直觉,(没有进攻,我很佩服你的坚持不懈)所以我发现了一个错误报告来回答这个问题。以为我会在这里发布给未来的访客。
我们的问题是reported and answered在trac.wxwidgets.org的错误报告中
在Mac上,Quit和About菜单项目设计为属于程序菜单。 (粗体,最左边) 如果您尝试将带有wxID_EXIT id的菜单项添加到文件菜单中,它将不会显示。
如果您必须将Quit和/或About菜单项放在程序菜单旁边的另一个菜单中,您可以通过为wxID_EXIT分配不同的ID来实现。比如10。
file->Append(wxID_EXIT, wxT("&Quit"));
为:
file->Append(10, wxT("&Quit"));
我以为我注定要失败。认真。永远不能在我的程序中有菜单是不可想象的。但它只是那些为Mac上的程序菜单保留的“Quit”和“About”等标准菜单。
我希望这能帮助你们。 快乐的小工具!
答案 2 :(得分:0)
这可以(并且希望在3.0之前)在wxOSX本身中得到改进,但是现在你需要解决这个特殊情况,当顶级菜单只包含一个带有标准标识符的菜单项时,该标识符被移动到OS X下的应用程序菜单。
对于“文件”菜单,这通常不是问题,在实际应用程序中几乎总会有其他项目,但这种情况确实经常发生在“帮助”菜单中。你现在可以做的最好的事情确实是在你的“帮助”菜单创建代码周围加#ifndef __WXOSX__
(这就足够了,顺便说一句,不需要测试其他两个,请参阅preprocessor symbols documentation)。相反,将wxID_ABOUT
添加到其他菜单中(无论如何移动哪一个都无关紧要,因此在#ifdef __WXOSX__
案例中可能是“文件”)。