Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

Эмуляция стандартного меню   Найти похожие ветки 

 
fd00ch ©   (2007-07-09 21:49) [0]

Здравствуйте.
  Я делаю имитацию стандартных меню. Использую в качестве базы для отрисовки пунктов меню экземпляры класса TCustomForm. Столкнулся с такой проблемой. Каждую новую форму-подменю я показываю следующим образом (мне необходимы меню, находящиеся поверх всех окон в системе):
  SetWindowPos(FormHandle, HWND_TOPMOST, X, Y, AWidth, AHeight, 0);
  Если присмотреться к стандартным меню Windows, то у них каждое новое подменю "залезает" справа на 3-5 пикселей на родительское (т.е. левая позиция дочернего подменю рассчитывается, условно говоря, так:   ChildLeft := ParentLeft + ParentWidth - 3) и постоянно перекрывает его. Если же делать имитацию с помощью форм, то самой верхней формой является та, которая получила фокус, таким образом, иногда возникает ситуация, когда родительское форма-подменю перекрывает дочернее (т.е. наоборот со стандартным меню). Как можно сделать, чтобы, с одной стороны, все формы-подменю, создаваемые моей программой, отображались поверх всех окон в системе, но в то же время внутри приложения можно было жёстко указать Z-Order каждой формы-подменю (с возможностью иметь фокус ввода в каждой такой форме)?
  И ещё - существует какое-либо сообщение (сообщения), по которым необходимо закрывать меню? (вроде нажатия кнопки Alt)
  Ну и хотелось бы услышать общие комментарии и советы тех, кто занимался подобным.


 
Eraser ©   (2007-07-09 22:16) [1]


> fd00ch ©   (09.07.07 21:49) 

может стОит отказаться от эмуляции меню таким образом, по той причине, что это бессмысленно. Если уж эмулировать, то полностью, как в java.


 
Юрий Зотов ©   (2007-07-09 23:12) [2]

> fd00ch ©   (09.07.07 21:49)  

> хотелось бы услышать общие комментарии и советы тех

И система, и прикладные программы работают с меню, используя функции меню, сообщения меню и структуры данных меню и его пунктов. Если Вы хотите сделать свое меню, то в нем Вам придется реализовать и те же структуры данных, и поддержку тех же управляющих механизмов. Иначе получится не меню, а очередной велосипед с квадратными колесами (которые местные Кулибины изобретают чуть ли каждый день, но ничего действительно стоящего ни один из них пока еще не изобрел).

Если Вы не хотите стать еще одним таким Кулибиным, а хотите сделать действительно полезную вещь, то загляните в справку API, которая поставляется вместе с Delphi и наберите в предметном указателе слово "menu". Потом покрутите список вверх-вниз, почитайте справки по его пунктам и прикиньте, какой объем материала Вам придется ДОСКОНАЛЬНО изучить и какой объем работы Вам придется сделать.

После этого хорошо подумайте - Вам эта задача ДЕЙСТВИТЕЛЬНО под силу?


 
fd00ch ©   (2007-07-09 23:34) [3]


> И система, и прикладные программы работают с меню, используя
> функции меню, сообщения меню и структуры данных меню и его
> пунктов

По-видимому, я забыл сделать важную оговорку - я делаю эмуляцию меню для пользователя, а не для системы. Т.е. ни система, ни прикладные программы не будут работать с моими формами как с меню - я не собираюсь делать эмуляцию главного меню окна. Мне нужно по некоторому событию отображать на экране поверх всех окон всплывающие окна, которые визуально и функционально (со взгляда пользователя) будут повторять стандартные меню Windows (в качестве примера можно привести интерфейс выбора действия в программе Nero Express версий 6.х).

Вообще-то мне интересно, возможно ли решить главную проблему с наложением окон друг на друга.


 
Юрий Зотов ©   (2007-07-10 00:05) [4]

> fd00ch ©   (09.07.07 23:34) [3]

Если я правильно понял, Вам нужно получить свой ВНЕШНИЙ ВИД меню (и только его), а функциональность остается той же. Но тогда и проще, и лучше делать меню не с нуля, а использовать те уже ГОТОВЫЕ средства отрисовки, которые УЖЕ заложены в стандартных меню.

См. события класса TMenuItem.


 
fd00ch ©   (2007-07-10 00:14) [5]

Если бы всё было так просто...

Главная задача для меня - получить полный контроль над меню - реакция на дополнительные события, отрисовка (простой пример - изменение высоты пунктов, простое скрытие и показ пунктов при уже всплывшем меню - всё это невозможно реализовать с использованием стандартных средств), удобный вертикальный скроллинг, дочерние элементы управления, различная анимация.


 
Инс ©   (2007-07-10 00:18) [6]


> [5] fd00ch ©   (10.07.07 00:14)


О боже! Неужели вы считаете, что в Microsoft сидят дилетанты, которые совершенно не разбираются в эргономике, в проектировании пользовательского интерфейса. Уверен, что что-бы вы там не нагородили, вряд ли вы сделаете удобнее, чем обыкновенное стандартное меню.


 
Германн ©   (2007-07-10 00:47) [7]


> fd00ch ©   (10.07.07 00:14) [5]
>
> Если бы всё было так просто...
>
> Главная задача для меня - получить полный контроль над меню

Тогда ещё раз прочитай: Юрий Зотов ©   (09.07.07 23:12) [2]
Именно об этом там и сказано.


> Инс ©   (10.07.07 00:18) [6]
>
> О боже! Неужели вы считаете, что в Microsoft сидят дилетанты,
>  которые совершенно не разбираются в эргономике, в проектировании
> пользовательского интерфейса.

Может и не сидят, но сначала в эпоху Win98 появляется программки aka WindowBlinds, а затем появляются темы WinXP. Это о чём-то говорит, не так ли?


 
Инс ©   (2007-07-10 00:57) [8]


> Может и не сидят, но сначала в эпоху Win98 появляется программки
> aka WindowBlinds, а затем появляются темы WinXP. Это о чём-то
> говорит, не так ли?


Я ничего не имею против тем оформления WinXP, но я против нестандартных элементов управления, и не только потому, что в 99% случаев с ними неудобно работать. Они как правило только своим внешним видом выдают, что тут поработал дилетант. Чтобы сделать что-то нестандартное красивым и удобным нужно быть профессионалом, четко понимающем что делаешь. А таковых, как показывает практика, немного.


 
Германн ©   (2007-07-10 01:08) [9]


> Инс ©   (10.07.07 00:57) [8]
>
>
> > Может и не сидят, но сначала в эпоху Win98 появляется
> программки
> > aka WindowBlinds, а затем появляются темы WinXP. Это о
> чём-то
> > говорит, не так ли?
>
>
> Я ничего не имею против тем оформления WinXP, но я против
> нестандартных элементов управления, и не только потому,
> что в 99% случаев с ними неудобно работать. Они как правило
> только своим внешним видом выдают, что тут поработал дилетант.
>  Чтобы сделать что-то нестандартное красивым и удобным нужно
> быть профессионалом, четко понимающем что делаешь. А таковых,
>  как показывает практика, немного.


А я много чего имею против "тем оформления WinXP", но не против "нестандартных элементов управления". Поскольку эти нестандарты порой позже становятся стандартами. А что касается вопросов "дилетантизма" и "профессионализма", в применении к данному сабжу, то это как раз описано в [2]. И если автор сабжа это осмыслит и сможет пойти по этому пути, может что и получится. Может число упомянутых в твоей последней фразе и увеличится таки :)


 
fd00ch ©   (2007-07-10 08:23) [10]

Да... Как много рассуждений не по теме :(

Поясню. Передо мной стояла задача получить контроль над стандартным всплывающим меню Windows (создаваемого с помощью функции CreatePopupMenu). Среди основных моментов было:
- возможность ПОЛНОЙ собственноручной отрисовки меню;
- добавление собственных элементов управления в меню (скажем, для фильтрации пунктов, как в меню Пуск Windows Vista);
- возможность назначения дополнительных контекстных меню к каждому пункту (как в том же меню Пуск);
- нормальный вертикальный скроллинг (как у обычных элементов управления) при большом количестве меню (стандартные стрелки прокрутки сложно назвать удобными и функциональными);
- генерирование несколько большего числа событий;
- и т.д.

Поразмыслив, понятно, что стандартные меню не могут предоставить из всего вышеперечисленного ни одной возможности (даже полная перерисовка невозможна - всегда будут отображаться стандартным цветом границы меню в 2-3 пикселя; треугольники-стрекли для пунктов, имеющих дочерние; пункты для скроллинга длинных меню). Поэтому я решил сделать эмуляцию стандартного меню с помощью форм. Сделал. В принципе, текущая работа моего меню меня устраевает - я не думаю, что ОБЫЧНЫЙ пользователь заметит различия между моим вариантом и системным. Однако небольшие отличия (о которых я писал в первом посте) несколько портят впечатления.

Поэтому мне прежде всего хотелось УЗНАТЬ ОТВЕТ НА МОЙ ПЕРВЫЙ ПОСТ - как сделать подобную функциональность с жестким Z-Order"ом форм внутри моего приложения.

Ну и для общего развития не помешало бы узнать, почему под Windows XP SP2 и Windows Vista (под другими не пробовал) при попытке использовать отрисовку с поддержкой визуальных стилей системы (с помощью модулей UxTheme, Themes) всё время вызов типа ThemeServices.Theme[teMenu] всё время  возвращает 0? Сейчас я сделал подобную отрисовку вручную - для XP это не так уж и сложно, а вот при использовании сторонних стилей под Vista могут получиться косяки. Возможно ли как-то делать нативную отрисовку пунктов моего меню с подержкой визуальных стилей Windows средствами самой системы?


 
fd00ch ©   (2007-07-10 08:40) [11]


>  Неужели вы считаете, что в Microsoft сидят дилетанты, которые
> совершенно не разбираются в эргономике, в проектировании
> пользовательского интерфейса.


Я вовсе так не считаю. Именно поэтому я стараюсь создать

> всплывающие окна, которые визуально и функционально (со
> взгляда пользователя) будут повторять стандартные меню Windows

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.064 c
2-1188120764
Daedr
2007-08-26 13:32
2007.09.16
Memo


15-1185015273
Иксик
2007-07-21 14:54
2007.09.16
Лисички


11-1165878940
Turbid
2006-12-12 02:15
2007.09.16
KOL и темы XP


2-1187598275
DevilDevil
2007-08-20 12:24
2007.09.16
Необоснованно приходит DoubleClick. У кого-либо возникало?


3-1179494173
SerMaxx
2007-05-18 17:16
2007.09.16
Работа компонента Table





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский