【问题标题】:Empty wxWidgets menus on OSXOSX 上的空 wxWidgets 菜单
【发布时间】:2013-05-05 03:36:50
【问题描述】:

我在 OSX 10.8.3built the library for Cocoa 上使用 wxWidgets 2.9.4

我想将带有一些菜单的菜单栏添加到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 所述),它会自动将 AboutExit 移动到应用程序菜单(我认为它被称为applemenu),但也会使 FileHelp 菜单为空:

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

实际上我试图删除它们:

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

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

【问题讨论】:

    标签: c++ macos menu wxwidgets menubar


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

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

      我们的问题是 trac.wxwidgets.org 的错误报告中的 reported and answered

      在 Mac 上,Quit 和 About 菜单项被设计为属于程序菜单。 (最左边的粗体字) 如果您尝试将带有 wxID_EXIT id 的菜单项添加到文件菜单,它将不会显示。

      如果您必须将 Quit 和/或 About 菜单项放在程序菜单之外的另一个菜单中,您可以通过为它分配除 wxID_EXIT 之外的不同 ID 来实现。比如 10 个。

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

      到:

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

      我以为我注定要失败。严重地。在我的程序中永远不能有菜单是不可想象的。但它只是为 Mac 上的程序菜单保留的少数标准菜单,如“退出”和“关于”。

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

      【讨论】:

      • 感谢您的意见。我一直在寻找一种方法来编写一些代码以独立于平台并遵守标准。我不介意为特定平台编写额外的代码以使其正常工作。我只是不想改变语义作为一种解决方法。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        相关资源
        最近更新 更多