2013-05-10 23 views
2

我在上使用wxWidgets 2.9.4 OSX 10.8.3built the library for CocoaOSX上的空wxWidgets菜单

我想用一些菜单的菜单栏添加到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),它会自动移动关于退出到应用程序菜单(我认为这就是所谓的applemenu),也使得文件帮助菜单为空:

Demonstration

有什么方法可以隐藏这些空菜单吗?

其实我试图删除它们:

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

但造成约和退出菜单项HELPTEXT,不要被我的躯体状态栏上显示(可能有其他的副作用,以及。 )

回答

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 
0

这是在wxOSX本身可以(并希望会在3.0之前)得到改进的东西,但现在您需要解决这个特殊情况时,顶级菜单只包含一个标准标识符的菜单项转移到应用程序离线菜单。

对于“文件”菜单,通常这根本不是问题,您几乎总是会在实际应用程序中包含其他项目,但这确实发生在“帮助”菜单上经常。你现在可以做的最好的确是在你的“帮助”菜单创建代码周围放置一个#ifndef __WXOSX__(这是足够的,顺便说一句,不需要测试其他两个,请参阅preprocessor symbols documentation),相反,将wxID_ABOUT添加到其他一些菜单(不管哪一个,因为它将会被移动,所以可能是在你的例子中的“文件”)在#ifdef __WXOSX__的情况下。

1

我是新来的wxWidgets和我遇到相同问题就来了。 (或似乎:) 它的惊人之处,我们的规格是如何相似。我认为唯一的区别是我在Mac OSX 10.8.4

我不想写一个Objective-C的工作,因为它似乎有点违反我的直觉,(没有进攻,我很佩服你毅力),所以我找到了一个回答问题的错误报告。以为我会在这里张贴给未来的访客。

我们的问题是在一个bug报告reported and answered在trac.wxwidgets.org

在Mac上,退出和关于菜单项目的设计在程序菜单中属于。 (粗体字,最左边) 如果你尝试添加一个带wxID_EXIT标识的菜单项到文件菜单中,它将不会显示出来。

如果您必须将“退出”和/或“关于”菜单项置于程序菜单之外的其他菜单中,则可以通过为wxID_EXIT分配不同的ID来执行此操作。比如10个。

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

到:

file->Append(10, wxT("&Quit")); 

我以为我死定了。认真。永远不能在我的程序中使用菜单是不可想象的。但是它只是那些为Mac上的程序菜单保留的几个标准菜单,如“退出”和“关于”。

我希望这可以帮助你们。 快乐部件!

+0

感谢您的输入。我正在寻找一种方法来编写一些代码以独立于平台并遵守这些标准。我不介意为特定的平台编写额外的代码以使其正确工作。我只是不想将语义更改为解决方法。 – fardjad 2013-11-09 23:32:05