OSX上的空wxWidgets菜单

时间:2013-05-10 12:40:04

标签: c++ macos menu wxwidgets menubar

我在 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),但也会将文件帮助菜单设为空:

Demonstration

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

实际上我试图删除它们:

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

但是这会导致约和退出菜单项 HelpText ,不会显示在我的框架 StatusBar 上(也可能有其他副作用。)

3 个答案:

答案 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__案例中可能是“文件”)。