2013-05-10 50 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