Моя бесконечная история: Меню

В статье речь пойдет о известных мне классах и шаблонах меню. Описание краткое и поверхностное. Думать над текстом не надо. Читаем легко и быстро.

Моя бесконечная история: Меню
Отречение: IMHO

CVO Menu Bar

В далеком 2005 году Andrew Finn написал и выложил как freeware шаблон для изменения внешнего вида меню. Меню напоминало чем-то отдаленно меню MS Office 2000.

Это первый мой код, который я досконально разобрал, и, наверное, первое погружение глубоко в Windows API.

В общем и целом, CVO Menu Bar не работал. Я не помню причин, но использовать в своих рабочих приложениях его было нельзя.

xXPPopup

На основе CVO Menu Bar был создан шаблон и класс xXPPopup. xXPPopup служит для создания контекстного меню. Сам шаблон получился достаточно удобным.
Меню также похоже на меню в MS Office 2000. Тогда я еще не умел делать его «плоским». Т.е. если отключить темы в XP, то видно, что меню имеет 3d рамку.

По сравнению с CVO, были исправлены критические ошибки, вроде ликов GDI. Появилась возможность настройки шрифта, которым выводятся пункты меню. Мелочи, вроде горячих клавиш.

Суть класса состояла в том, чтобы разобрать строку, которая получается в стандартном ABC классе PopupClass. И потом, на ее основе создать свое меню при помощи WinAPI функций.

Шаблон существует до сих пор. Для xUSSR он не выкладывался как freeware. Посмотреть о том что это можно здесь.

xXPFrame

После выпуска xXPPopup я зарекся заниматься рисованием. Потому как для меня это было сложным и неочевидным. Работа с API казалось невероятно сложной. Часто бывает, что необходимо описать множество прототипов и структур, прежде чем выполнить с виду простую операцию. Я решил, что больше никогда не возьмусь за это.

Я уже не помню каким образом, но через год, а дата выпуска обозначена как май 2006 года, я выпустил xXPFrame.
Это классы и шаблон для меню.

Практически весь код для xXPpopup был повторен и переписан. Стало красивее :).

Была также мысль переписать xXPPopup заново, но некоторые ближайшие товарищи указали на нецелесообразность этого.

xXPFrame был выложен для xUSSR во freeware. Просто так он не распространялся. Необходимо было зарегистрироваться. Всего было подано примерно 160 заявок на регистрацию.

Суть xXPFrame состоит в сканировании существующего Кларион меню и переопределении перерисовки. Достаточно сложно вообщем что либо делать в Кларионе, когда сам «Кларион» не знает ничего о твоих действиях. Я думаю, что разработчики и не предполагали, что кто-либо будет задавать стиль OWNERDRAW для меню Клариона.

Интересная ситуация и с merge-меню. Изначально, я думал, что при объединении меню, новые пункты просто добавляются в существующее меню динамически. В действительности, создается новое меню, содержащее новые пункты. Новое меню создается с нуля, т.е. не учитываются свойства, заданные для прежнего меню. При закрытии MDI окна, старое меню возвращается на место.

Было еще множество достаточно интересных моментов. Большинство сложностей были преодолены. К примеру, было выяснено является ли подменю открытым и была нарисована рамка вокруг окна меню. Это рамка придает «плоский» вид окну подменю.

Из незаконченных вещей. Верхний уровень меню не удалось отрисовать «красиво». Для меня это главный минус. Я так и не понял каким образом происходит обновление верхнего уровня меню. Из-за этого различные workaround-ы, но осадок, что сделано неправильно остался.

Также, при включенном в системе fade и развертывании меню, отрисовка не работает вообще. Этот момент, кстати, не удалось решить до сих пор. Как обходной путь: на время работы приложения fade и развертывание меню выключались. Когда фокус уходит с приложения, или приложение закрывается, предыдущие значения восстанавливаются.

Осталось нерешенной проблема вычисления длины строки – текста пункта меню. Почему-то длина высчитывалась всегда больше, чем строка занимает в действительности. Тогда, я решил, что это связано именно с выводом русского текста.

Посмотреть на xXPFrame можно здесь.

PowerOffice PowerToolbar

На моей памяти выход xXPFrame был примерно в тоже время, что и выход тулбара от PowerOffice. Хотя по датам релиза – PowerOffice выпустились раньше на полгода.

Этот продукт меня реально поразил. То, что я считал сделать невозможным, было сделано.

Внешний вид практически повторяет вид MS Office 2003, возможность переключение стилей меню и тулбара, градиентные заливки, отрисовка кнопок «Закрыть, Свернуть, Развернуть», нестандартная ширина меню. Как это все было сделано?

Была проделана громадная работа. Одни исходные тексты классов весят 350кБ! Документация максимально подробная и может служить эталоном оформления. Единственный минус это цена в $200… и еще пара моментов.

Суть тулбара: это отрисовка руками всех возможных контролов. Т.е. это именно тулбар, а не меню и тулбар.

Верхний уровень меню представляет собой кнопки, при нажатии на которые появляется popup-меню. Таким образом, скрывая Кларион-меню и рисуя прямо на тулбаре, можно изменить ширину top level пунктов меню.

Код тулбара мною особо не изучался. Были взяты некоторые идеи и части кода для дальнейшего использования.

В тубларе также не решена проблема fade. Они также отключают fade и развертывание, но непосредственно перед отображением popup-меню.

Несколько позднее я встречал упоминание о ликах GDI, найденных в коде класса. PowerOffice к тому времени были фактически out of business, потому саппорт как таковой отсутствовал. Лики достаточно сложно найти, особенно в такой структуре класса.

Я не стал использовать этот тулбар в своих приложениях по двум причинам.

Во-первых, не работала клавиша Alt для доступа к меню. Т.е. нажимаешь одиночный Alt и попадаешь на верхний уровень меню. Этого не было. Работало Alt+F и Alt+W, а просто Alt не работал. Причем, в какой-то демо версии я видел, что Alt и F10 работают, но при использовании шаблона я не увидел этого. Возможно необходимо было разобраться, но… Вот такие, казалось бы мелочи, а отталкивают пользователей 🙂

Во-вторых, с некоторого времени я стараюсь не пользоваться ворованным софтом. Это плохо. А тратить $200 на меню и тулбар я не готов.

Можно и третью причину, продукт был всегда на стадии beta. Т.е. недошел до релиза. Возможно, как раз из-за того, что автор не смог (не успел, не хотел, не было времени) оттестировать продукт, оттуда же и ненайденные им лики.

Буквально на днях, все продукты PowerOffice купила Icetips.com.

Clarion 7

Одной из главной фич, выставляемых SV для Clarion 7, является меню в стиле MS Office. Т.е. теперь не нужно покупать PowerToolbar. Можно использовать родное.
Здесь у меня некоторая ирония. Я не знаю как реализована отрисовка меню в Кларион. Но те примеры, что приводятся, несколько неудачны. Т.е. даже внешний вид меню уступает тому же PowerToolbar-у.

Я полагаю, что сама динамика изменения меню осталась. Т.е. для добавления кнопки на тулбар или пункта меню, необходимо использовать команду CREATE, а не метод какого-либо класса. А для изменения свойств кнопки или пункта соответствующий PROP.

Т.е. для добавления кнопки на тулбар вам необходимо рассчитать ее размеры и задать местоположение. Как положить кнопку между другими кнопками, трудно себе представить. Все можно конечно, но целесообразность под вопросом.

Думаю, что большинство пользователей будут использовать в будущем именно родное меню Clarion 7.

CFC Library

Отступление: Дабы убежать от серых будней разработки корпоративных приложений, после пары лет затишья 🙂 … Вообщем, теперь использование API кажется достаточно простым и приятным и кодинг приносит моральное удовлетворение 🙂

Мною было принято решение отказаться полностью от Кларион-меню. Т.е. его не должно быть. Все меню создается рукописным кодом или шаблоном на WinAPI. Этот момент очень важный. Теперь никто не мешает рисовать.

Все препоны со стороны Кларион-меню были сняты, поэтому класс меню был написан достаточно быстро, правильно и красиво.

Появились тени у top level пунктов, градиентная заливка, позаимствованная у PowerOffice, правильная отрисовка top level меню, без излишних морганий, Alt и F10 работают! Корректно рассчитывается длина текста пунктов меню.

Если вы обратите внимание на стандартное Кларион-меню (Windows-меню, Paint, калькулятор) в Кларион 6.х, то увидите непосредственно под top level меню белую полоску шириной 1px. Я закрашиваю ее 🙂

CFC Library находится в разработке на данный момент. Как все будет выглядеть в момент релиза, я не знаю даже сам.

Из всех вышеперечисленных классов/шаблонов я интенсивно использую только xXPPopup, остальные «лежат на полке». Станет ли CFC Library таким же продуктом покажет время.