я использую wxWidgets 2.9.4 на OSX 10.8.3 а также построил библиотеку для Какао.
Я хочу добавить строку меню с некоторыми меню в 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);
Поскольку я использую стандартные идентификаторы для добавления пунктов меню (как описано Вот), он автоматически перемещается Около а также Выход в меню приложения (я думаю, что это называется apple
menu
), но также делает файл а также Помогите меню пусто:
Есть ли способы скрыть эти пустые меню?
На самом деле я пытался удалить их:
#if defined(__WXMAC__) || defined(__WXOSX__) || defined(__WXOSX_COCOA__)
menuBar->Remove(0);
menuBar->Remove(0);
#endif
но это вызвало о и пункты меню выхода HelpText, не будет отображаться в моем кадре Статус бар (может иметь и другие побочные эффекты.)
Кажется, нет стандартного способа скрыть меню в 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
Я новичок в wxWidgets, и я столкнулся с точно такой же проблемой. (Или так казалось 🙂
Удивительно, насколько похожи наши спецификации. Я думаю, что единственная разница в том, что я на Mac OSX 10.8.4
Я не хотел писать работу над Objective-C, поскольку она казалась мне немного нелогичной (без обид, я восхищаюсь вашей настойчивостью), поэтому я нашел сообщение об ошибке, которое ответило на вопрос. Думал, что выложу это здесь для будущих посетителей.
Наша проблема была сообщил и ответил в отчете об ошибке на trac.wxwidgets.org
На Mac элементы меню «Выход» и «О программе» предназначены для включения в меню программы. (Тот, что выделен жирным шрифтом, слева)
И если вы попытаетесь добавить пункт меню с идентификатором wxID_EXIT в меню файлов, он не появится.
Если вы ДОЛЖНЫ поместить элементы меню Quit и / или About в другое меню, кроме меню программы, вы можете сделать это, назначив ему другой идентификатор помимо wxID_EXIT. Например, 10.
file->Append(wxID_EXIT, wxT("&Quit"));
чтобы:
file->Append(10, wxT("&Quit"));
Я думал, что обречен. Шутки в сторону. Никогда не иметь возможности иметь меню в моих программах было немыслимо. Но это всего лишь несколько стандартных меню, таких как «Выход» и «О программе», которые зарезервированы для меню программы на Mac.
Надеюсь, это помогло вам, ребята.
Удачного виджета!
Это то, что можно (и, будем надеяться, до 3.0) улучшить в самом wxOSX, но сейчас вам нужно обойти этот особый случай, когда меню верхнего уровня содержит только пункт меню со стандартным идентификатором, который перемещается в меню приложения. под OS X.
Для меню «Файл» это обычно вообще не проблема, в реальном приложении в нем почти всегда есть другие элементы, но это часто случается с меню «Справка». Лучшее, что вы можете сделать прямо сейчас, это действительно поставить #ifndef __WXOSX__
(этого достаточно, кстати, не нужно тестировать для двух других, см. документация по символам препроцессора) вокруг вашего кода «Помощь» создания кода и, наоборот, добавить wxID_ABOUT
в какое-то другое меню (не важно, какое из них будет перемещено, так что в вашем примере это может быть «Файл») в #ifdef __WXOSX__
дело.