Пустые меню wxWidgets в OSX

я использую 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, не будет отображаться в моем кадре Статус бар (может иметь и другие побочные эффекты.)

2

Решение

Кажется, нет стандартного способа скрыть меню в 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

Другие решения

Я новичок в 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.

Надеюсь, это помогло вам, ребята.
Удачного виджета!

1

Это то, что можно (и, будем надеяться, до 3.0) улучшить в самом wxOSX, но сейчас вам нужно обойти этот особый случай, когда меню верхнего уровня содержит только пункт меню со стандартным идентификатором, который перемещается в меню приложения. под OS X.

Для меню «Файл» это обычно вообще не проблема, в реальном приложении в нем почти всегда есть другие элементы, но это часто случается с меню «Справка». Лучшее, что вы можете сделать прямо сейчас, это действительно поставить #ifndef __WXOSX__ (этого достаточно, кстати, не нужно тестировать для двух других, см. документация по символам препроцессора) вокруг вашего кода «Помощь» создания кода и, наоборот, добавить wxID_ABOUT в какое-то другое меню (не важно, какое из них будет перемещено, так что в вашем примере это может быть «Файл») в #ifdef __WXOSX__ дело.

0
По вопросам рекламы [email protected]