2

我在OSX 10.8.3上使用wxWidgets 2.9.4并为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 来添加菜单项(如此所述),它会自动将AboutExit移动到应用程序菜单(我认为它被称为),但也会使FileHelp菜单为空:apple menu

示范

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

实际上我试图删除它们:

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

但这导致 about 和 exit 菜单项HelpText不会显示在我的框架StatusBar上(可能还有其他副作用。)

4

3 回答 3

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
于 2013-05-11T09:26:36.670 回答
1

我是 wxWidgets 的新手,遇到了完全相同的问题。(或者看起来是这样的:)令人惊讶的是,我们的规格如此相似。我认为唯一的区别是我使用的是 Mac OSX 10.8.4

我不想写一个 Objective-C 工作,因为这对我来说似乎有点违反直觉,(不冒犯,我钦佩你的毅力)所以我找到了一个错误报告来回答这个问题。以为我会把它贴在这里供未来的访客使用。

我们的问题在 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 上的程序菜单保留的少数标准菜单,如“退出”和“关于”。

我希望这对你们有帮助。快乐的小部件!

于 2013-11-09T20:17:21.950 回答
0

这是可以(并且希望在 3.0 之前)在 wxOSX 本身中改进的东西,但是现在您需要解决这种特殊情况,即顶级菜单仅包含具有标准标识符的菜单项,该菜单项已移动到应用程序菜单在 OS X 下。

对于“文件”菜单,这通常根本不是问题,在实际应用程序中您几乎总是会有其他项目,但“帮助”菜单确实经常发生这种情况。您现在可以做的最好的事情确实是在您的“帮助”菜单创建代码周围放置一个#ifndef __WXOSX__(这已经足够了,顺便说一句,无需测试其他两个,请参阅预处理器符号文档wxID_ABOUT),相反,添加到其他一些菜单(不管是哪一个,因为无论如何它都会被移动,所以在你的例子中可能是“文件”)#ifdef __WXOSX__以防万一。

于 2013-05-10T15:02:10.747 回答