Всем доброго дня.
Тема обсуждалась неоднократно, например
здесьАвтор: xerox
Дата: 08.07.11
.
Тем не менее, есть желание подытожить, что ли (уверен — я не одинок).
Итак, на чем лучше всего делать GUI для Windows-программы ?
Интересуют именно профессиональные инструменты и библиотеки, позволяющие, помимо
серых форм с двумя кнопками и чекбоксом, программировать по-настоящему качественные и
продвинутые UI, желательно поддерживающие какие-то модели или мастера, упрощающие и
автоматизирующие процесс. И вообще супер, если они выполнены с жесточайшим соблюдением
принципа "code behind" (полумеры все портят), то есть — дизайн отдельно, логика отдельно.
Язык, в принципе, не важен, но .NET и Java-рантаймы по определенным причинам отпадают.
Кроссплатформенность не интересует, софт исключительно для Windows.
Грубо говоря, процесс создания пользовательского интерфейса в моем понимании выглядит так:
Дизайнеры, специалисты по эргономике и юзабилити проектируют интерфейс и исполняют его в
виде набора макетов (PSD, JPEG, PNG, BMP или вообще HTML+CSS — как угодно).
Затем программист в некой IDE создает формы определенного размера, размещает на них
сами контролы и "одевает" это все в подготовленные дизайнерами "одежки".
Возможно, это даже лишнее — сделанные дизайнерами формы уже можно открывать, тыкать по
кнопкам, менять стили и так далее. Очень важно, чтобы на этом этапе "игры в Барби" все
визуальные аспекты поведения форм и контролов были запрограммированы — то есть,
программисту позже не придется вручную делать всякие затухания кнопок или анимацию меню.
Следующий этап — программирование того, что я называю GUI Finite State Machine.
Это всевозможные комбинации состояний контролов и их реакций на всякие события.
Например, кнопка "Применить" подсвечивается только если список не пуст, а полоса
прокрутки появляется когда таблица не вмещает все элементы. Ну и так далее.
Возможно, этот этап не менее важен, чем первый, и он в какой-то степени должен
быть удобен, чтобы, скажем, отключение кнопки достигалось одним-двумя вызовами
функций или свойств соответствующего контрола.
Третий этап очевиден. К готовой модели GUI просто подключается бизнес-логика,
сконцентрированная в других модулях (dll, например).
Кстати, здесь есть маленькая, но важная деталь. Хорошо, если библиотека/фреймворк
поддерживает сборку под x64. Зачем нужен x64 ? — спросите. А затем, что все
равно придется как-то связывать модули программы один с другим и, вероятно,
передавать какие-то данные, а тут и различия в размерах типов, и выравнивание, и
невозможность загрузки dll одной разрядности в exe другой, и прочее.
Теперь из этого прекрасного мира спустимся на землю и обозрим имеющиеся тулзы и либы.
И рассмотрим, почему именно они ну никак не могут претендовать на высшие почетные звания.
Начнем с диких и необузданных тварей, постепенно продвигаясь к более цивилизованным особям.
1. Win32 API.
Гордый и старый одинокий мустанг, полные сведения можно найти только в энциклопедиях MSDN.
Оседлать его могут только такие же брутальные создания, как и он сам.
На оседлание тратятся недели и месяцы непрерывных скачек, приветствуются частые
забеги на водопои вроде Codeproject. Последний раз его видели где-то в 2005-2006 году.
Ходят слухи, что отдельным мастерам Win32 API Kung-Fu удавалось слепить приличный GUI,
не слезая с седла.
2. MFC (My Fucking Code).
Породистая кобыла, внучатый племянник Win32 API (родство легко выявляется даже неспециалистами).
От своего норовистого предка отличается разве что многочисленными упряжками да позолотой.
Родилась в эпоху лихих девяностых, впитала весь бандитский дух того времени, который
сохранила до сих пор. За годы жизни была изрядно покоцана конкурентами, да и внешне может
показаться не совсем презентабельной, но, что удивительно, — еще многих в состоянии об
скакать.
3. WTL (По одноименной песне "WhaT is Love").
Мелкий и задиристый жеребец. По слухам — сын Win32 API и MFC.
Долгое время не знал, куда девать свою силу, поэтому юность и зрелось прошли практически в забвении.
Несколько лет назад его заприметили заезжие циркачи, и с тех пор имя WTL можно увидеть в ряде вакансий.
Лепить жеребец умеет так же хорошо/плохо, как его родители.
По части шаблонов ушел далеко вперед, но, так как яблоко от яблони падает недалеко,
ни в чем выдающемся пока замечен не был.
4. ATL.
Сводный брат WTL, буква "A" исключительно для удобства различия.
Собственно, лепить формы (из песка) никогда не умел и не любил.
Юность провел в каталогизации GUID-ов на фабрике классов, затем был
импортирован в другой апартмент, но по ошибке маршаллинга вернулся без HRESULT-а.
Затем устроился в библиотеку импорта и в течение многих лет его труды были
оазисом для тех, кто испытывал проблемы "Dll Hell", совместимости компонентов и
удаленного взаимодействия. К GUI не имеет почти никакого отношения, хотя редкий
извращенец обойдет стороной идею сделать GUI с помощью ATL.
5. wxWidgets.
Хитрый верблюд, имя которого расшифровывается примерно как "выбери меня,
если хочешь чтобы тебя поимели". Исключительно доброе и открытое существо,
лишенное всяких "комплексов победителя". Проблема же в том, что перед
отправкой в дорогу оно сознательно обо многом умалчивает.
Вам придется испытывать жажду и питаться колючками, причем сам wx
делает это с удовольствием, демонстрируя превосходство над земными.
Узнать о нем больше, увы, не удается — даже в официальных документах
весьма скудные сведения и нам лишь остается довольствоваться редкими
рассказами очевидцев.
6. Delphi/Builder/RAD Studio и другие.
Семейство зверьков непонятной породы. Один из членов семейства многие годы прикрывался
добрым именем Бледа Паскаля, успев за это время несколько раз продаться и перепродаться.
"Из Бормана в кардеры" — так, вроде, гласит старинная пословица.
Значительное время группировка доминировала в бухгалтерии и банковской сфере, а
также была связана с
бандами базами данных, но репутацию заработала так себе, в
первую очередь из-за своих кочевнических замашек. Несколько лет семъя прожила в
нищете и страшном забвении, но совсем недавно дело начало сдвигаться с мертвой точки.
Имеет богатую коллекцию компонентов, разбросанных по форумам всего света, и
армию поклонников, как правило молодых и не очень грамотных.
Подкупает своей видимой простотой.
7. HTMLayout.
Молодая и энергичная обезъянка, не упускающая случая похвастаться:
"Эх, а вот у нас там в вебе"... Бегает шустро, и никогда не разлучается со
своими друзьями — HTML и CSS. Красуется на обложках Alawar и Norton.
В связях, порочащих ее (Win32, MFC, ...) замечена не была.
Из огромных плюсов — умеет дружить как с программистами, так и с дизайнерами.
Впрочем, не лишена пары "детских болезней", хотя постоянно тренируется и
очень скоро собирается победить ближайших конкурентов. Все благодаря
стараниям отца (c-smile), который вразумляет ее и учит как надо.
8. Qt.
Слон. Амбициозен, грациозен, статен. Передвигается медленно.
Никакое кунг-фу против него не поможет. Если Qt что-то не понравится в вашей манере
разговаривать с ним, вы будете медленно раздавлены, не успев подать сигнал или даже слот.
Имеет богатый выбор всяких седушек, тесемок и бахромы (стырено у хозяев-индусов).
Ходят нелепые слухи, что некто Nokia собиралась задействовать слона Qt в своих
мобильных подразделениях, но то ли ввиду гарбаритов, то ли еще чего-то, отказалась.
В отличие от большинства представителей, описанных ранее, Qt умеет пересекать границы, и
делает это с большим успехом, собирая повсюду толпы восторженных поклонников.
Однако взобраться на слона довольно непросто, и еще непросто потом понять
свой успех и повторить/закрепить его. Туториалы общедоступны, однако главы "как взобраться
на Qt" в них нету.
Вот.
Описал "зоопарк", с почти всеми представителями которого приходилось либо
плотно работать, либо по крайней мере взаимодейтствовать.
Удовлетворения от использования данных инструментов не испытывал, почти все из
перечисленного не имеет нормальной IDE, либо плохо интегрируется в существующий код,
либо сильно "завязано" на каких-то специфических вещах, с которыми приходится
мириться, либо требует изрядного "допиливания" для решения нужных задач.
При описании старался чувств не задевать, все написанное — плод фантазии,
возможно, не совсем здоровой (зато трезвой и откровенной).
Прошу в тему.