2017-02-01 14 views
0

Я хотел бы иметь NSMenu с несколькими NSMenuItem s в нем. Эти элементы должны вести себя так же, как «нормальный» NSMenuItem с, за одним исключением: я хотел бы иметь возможность нарисовать содержимое (т. Е. «Переднем плане») каждого элемента самостоятельно.Простой способ реализовать пользовательские образы NSMenuItem

То есть:

  • Я хотел бы операционную систему нарисовать синюю подсветку, когда я зависать с помощью мыши, нарисуйте метку или тире (для обозначения «выбрано»/"часть мульти -подбор "). Более того, мне бы хотелось «нормального», т. Е. Встроенного в меню мыши/клавиатуры поведения.

  • Я хотел бы обратить на «содержание» себя: В идеале, я бы себе представить, что я должен был бы реализовать/переопределить один единственный метод drawMenuItem:withCGContext:inRectangle:withTextColor, который в основном получает деталь, то CGContext рисовать в, то NSRect и цвет текста , который будет использоваться Mac OS, если он сам нарисовал элемент.

Я знаю (подозреваю, очень stronlgy), что мое желание, вероятно, слишком много, но я бы прекрасно с чем-то адекватным (например, я мог себе представить выборку в NSRect из NSMenuItem себя, получая цвет, используя что-то вроде [NSColor selectedMenuItemTextColor], а контекст использует что-то вроде [NSContext currentContext]).

Конечно, я считал Apple's instruction on this. Тем не менее, это не позволяет меню рисовать синий фон подсветки и галочку. Более того, насколько я мог видеть, мне пришлось бы реализовать, например, mouseUp сам.

Подводя итог: есть ли способ получить (почти) полностью функциональное меню, где я только настраиваю содержимое, где обычно заголовок пункта меню (возможно, даже без пользовательских представлений)?

+0

Не можете ли вы установить изображение элемента меню? – Willeke

+0

@Willeke Я подумал об этом, но был несколько неуверен, так как теперь я знаю, было ли это задуманное изображение. Более того, я не был уверен, что динамично менять цвет переднего плана динамически, основываясь на «изюминке» состояния «NSMenuItem». – phimuemue

ответ

2

Ответ: Нет

Поскольку вы заменяете весь вид пункта меню вы ответственны за рисунок и обрабатывать события.

+0

Ваш ответ, вероятно, верен. Но разве это не могло быть так, что мне, возможно, не нужно использовать пользовательский вид в первую очередь? Я надеялся, что есть какая-то техника, возможно, без индивидуального представления, чтобы добиться того, что я хочу. – phimuemue

+0

К сожалению, 'NSMenuItem' наследует от' NSObject', поэтому нет (public) view related API для переопределения. – vadian

+0

Правда, и я наблюдал в отладчике иерархии представлений, что «NSMenu» с обычными элементами ванили не содержит подсмотров для каждого элемента, но вместо этого, похоже, все рисует в «NSView» всего меню. Поэтому я подумал: «Возможно, я мог бы подклассифицировать этот ...» – phimuemue