Предлагаю
вашему вниманию интересное письмо,
пришедшее
пока я был в отпуске. В
нем затрагивается очень больная тема для всех MFC-программистов:
Я
только что подписался на Вашу рассылку и прочитал весь архив. В первую очередь
хочу присоединиться ко всеобщим поздравлениям (хоть и с нескольким опозданием)
и поблагодарить Вас за то что принялись за столь нелегкий и, насколько я
понимаю, практически бесприбыльный труд. Так уж получилось, что в этой области
работает очень много профессионалов и любителей, поэтому вопросов накопилось
очень много. Я крайне рекомендую Вам почаще направлять вопрошающих на
microsoft.public.ru.vc и microsoft.public.ru.russian.programming где подобные
вещи более уместны. Хоть это и самые активные русскоязычные конференции на
тему, но они недотягивают то своих западных конкурентов, поэтому свежая кровь
им явно не повредит.
[...] К делу:
Может я и ошибаюсь, но насколько я знаком с психологией Microsoft, можно
судить, что MFC доживает свои последние дни. Она морально устарела, скорее
всего эта библиотека уйдет в небытие "оставлено для совместимости" уже со
следующей версией VS. Я очень хочу, чтобы Вы в своей рассылке обратили
внимание на WTL (Windows Template Library) - это библиотека шаблонов похожая
на ATL, способная частично (или полностью) заменить MFC. Она входит в Platform
SDK начиная с Jan'2000. Пока это пробный камень, поэтому практически
недокументирована. Microsoft не слишком афиширует ее появление, и те немногие
программисты, которые ее используют, вынуждены разбираться во всем
самостоятельно. А выгод при ее использовании очень много. Например она
значительно дружественнее к WinAPI, который активно рассматривается в
рассылке, чем MFC. Возможно с выходом следующей версии VS WTL будет дополнена
или даже изменена и выставлена как основное средство разработки приложений в
VC, так как больше отвечает предназначению C++ - созданию компактных, быстрых
и эффективных приложений. Именно по этим причинам я считаю очень полезным
рассмотреть эту библиотеку в рассылке, а в будущем, возможно, уделить ей
больше внимания чем MFC.
- Ярослав
Говорунов
Итак, есть два вопроса. Вопрос первый - что будет с MFC в будущем? Вопрос второй : что это еще за
зверь - WTL?
На первый этих двух вопросов не существует однозначного ответа.
Если я разверну дискуссию на эту тему в рассылке, то наверное вы не скоро
дождетесь ее окончания, настолько это острый вопрос. Скорую смерть MFC
предсказывали не раз и не два, но почему-то эта смерть все никак не
наступит. Даже наоборот, сейчас трудно найти объявление о найме
программиста на С++ под Windows, где не
требовалось бы знание MFC (и чаще всего еще и ActiveX/COM).
Работодатели задают тон, и поэтому MFC и сейчас так же популярен, несмотря
на всю свою нелогичность, неудобство, малонадежность и множество других
недостатков. Наверное, пока что его доствоиства (а они, надо признать, все-таки
есть) плюс усилия всемогущей Microsoft по его поддержке перевешивают. Да и
в обозримом будущем, скорее всего, ситуация мало изменится - в следующую
версию Visual Studio (о которой я писал в выпуске No. 8) MFC, вне
всякого сомнения, войдет. Будет ли это в виде "оставлено для
совместимости"? Я думаю, вряд ли. MFC cлишком уж широко используемая библиотека.
Хотя это, конечно, не более чем мое личное мнение.
А вот второй вопрос действительно
интересен. Неужели появилась достойная альтернатива MFC? Чтобы каждый из вас сам
ответил для себя на этот вопрос, хочу предложить вашему вниманию статью Ричарда
Граймса, на которую я наткнулся в интернете, и она мне настолько
понравилась, что я решил специально для вас ее перевести и опубликовать.
Что я и делаю с любезного разрешения автора статьи.
Автор: Ричард Граймс
Источник: iDevResource.com Ltd. Оригинал:
"What is WTL?" by Richard Grimes Пер. с англ. Алекс Jenter
Вступление
О
WTL шепчут уже более года, и был даже пущен слух, что эта библиотека
используется внутри самой Microsoft, и что она базируется на ATL. Конечно же,
это привлекло внимание сообщества ATL-разработчиков, которые создавали
пользовательский интерфейс для элементов управления ATL еще со времени появления
ATL 1.1, и обнаруживали, что код, который они писали, был большей частью чистым
кодом Win32 GDI. Я могу кое-что вам сообщить: WTL построен по такому же
принципу.
Является ли это разочарованием? Нет, потому что сама ATL -
всего лишь тонкая обертка COM, и в этом-то и заключается ее сила. Конечно, вам
необходимо знать COM для того, чтобы использовать ATL, но дополнительные усилия,
затраченные на изучение ATL пренебрежимо малы по сравнению с теми, которые нужны
для освоения COM. Сравните это с другими библиотеками классов, где основной упор
делается на изучение самой библиотеки, а что вы фактически будете знать по
окончании обучения? Не так уж много о COM, это определенно.
С WTL все в принципе так же. Вы должны уметь программировать, используя
Win32 и GDI. Но если вы это знаете, тогда WTL для вас - не более чем глоток
свежего воздуха. Если же вы не имеете представления о Win32 и GDI, тогда лучше
вам писать пользовательский интерфейс на VB.
Что включает в себя WTL?
Библиотека имеет основной набор классов для приложения.
Заметьте, что хотя у вас нет классов-документов (documents), как в MFC, у вас
все еще есть классы-представления (views). В WTL очень много кода,
предназначенного для того, чтобы позволить вам манипулировать представлениями, а
также легко добавлять ваш собственный код. Существует свой мастер
AppWizard, с помощью которого можно легко создавать каркасы SDI-, MDI- и
многопоточных SDI-приложений (т.н. Multi-SDI-приложение выглядит, как будто
открыто много экземпляров обычного SDI-приложения, но на самом деле это разные
окна одного и того же процесса. Примером такого приложения может служить IE или
Windows Explorer). Плюс к этому, ваша программа может быть приложением на основе
диалога (dialog-based) или на основе представления (view-based). Сами
представления могут быть основаны на классе CWindowImpl, на каком-либо элементе
управления, или даже на HTML-странице. Вы также можете выбирать, будет ли ваше
приложение иметь панель инструментов в стиле IE (rebar), в стиле Windows CE
(command bar), или простую (toolbar); можно добавить строку статуса (status
bar). Ваше приложение может внедрять элементы управления ActiveX и может быть
COM-сервером.
Есть выбор среди нескольких
видов классов-представлений, которые вы можете использовать. WTL представляет классы
окон
с разделителями (splitter-window), так что вы можете иметь два окна в одном
представлении, и классы окон с прокруткой (scroller-window), где окно может
быть меньшего размера, чем представление, которое оно отбражает. Существует
также некий аналог UpdateUI из MFC, хотя в WTL он работает немного
по-другому - основное отличие в том, что вы сами указываете, какие
элементы могут обновляться посредством карты сообщений (message map), и вы должны
добавить код в ваш класс, чтобы выполнить UpdateUI. Библиотека
поддерживает технологии DDX/DDV, которые, опять же, очень похожи на их аналоги из
MFC, с
той только разницей, что у вас есть карта сообщений, которая реализует DoDataExchange
и вам нужно добавлять код для осуществления этой операции.
Присутствуют
теперь и классы GDI. Класс-оболочка HDC очень похож на CWindow в том,
что очень тонок, - добавляет мало новой функциональности. Тем не менее, в
нем есть поддержка метафайлов и OpenGL. Я думаю, основное применение будут иметь
классы-наследники для работы с принтерными контекстами устройства - в WTL есть
поддержка печати и даже предварительного просмотра (print preview). Имеются
также классы-обертки для GDI-объектов, кистей (brushes), перьев (pens), регионов
(regions), и т.д.
Еще в библиотеке
можно обнаружить классы для всех стандартных Win32 и W2K
(Windows 2000) диалогов (common dialogs), опять же, хотя эти обертки довольно
тонки, они делают задачу выбора шрифта или, скажем, файла действительно простой.
Старый файл
AtlControls.h был включен из ATL в WTL, и содержит несколько
новых классов для элементов управления W2K, наряду с некоторыми классами для
элементов управления, не относящихся к Win32, таких как клон панели команд
(command bar clone), кнопка с изображением (bitmap button), гиперссылка
(hyperlink) и курсор "песочные часы" (wait cursor). [...]
И,
наконец, в библиотеке имеются служебные классы, самым значимым из которых
является CString. Да, это клон класса CString из MFC, который реализует
(насколько я знаю) все его методы. Еще есть класс-оболочка для поиска файлов
(find file API) и классы-аналоги CRect, CSize и CPoint.
Резюме
Если вы собираетесь писать
Win32-приложение с пользовательским интерфейсом, я рекомендую вам попробовать
WTL прежде чем думать об MFC. Если вы пишете код в WTL, он будет меньше в объеме
и более эффективен, и вы будете иметь все преимущества поддержки COM в ATL,
которая, увы, отсутствует в MFC. [
]
Итак, WTL - очень
перспективная библиотека на основе ATL, которая, однако, НЕ ИЗБАВЛЯЕТ вас,
как программиста, от необходимости знания WinAPI. И я могу привести кучу доводов
в пользу такой архитектуры, многие из которых достаточно очевидны. Но, как
всегда, есть и аргументы contra. MFC намного мощнее, и имеет
намного больше возможностей. Из них, в частности, модель
"документ/представление", поддержка документов OLE, автоматизированный обмен
данными, пристыковывающиеся панели/диалоги и многое другое.
Объем кода, который вам приходится писать
самому, в WTL больше. Не думайте также, что в WTL нет ошибок: как
показывает практика, их там тоже полным-полно (я видел список известных на
данный момент багов). Библиотека еще сыровата. Так что не следует переоценивать
WTL, но и спускать со счетов тоже не стоит. Конечно, она пока не стала
стандартом и официально Microsoft не поддерживается. Но, как говорят на западе,
things can change. В нашей профессии всегда приходится держать ухо
востро на все инновации, т.к. они имеют неприятную особенность
становиться стандартами.
А что касается рассмотрения WTL в рассылке:
в принципе я не
против, если вы не против. Смущает меня только одно: тем для рассылки
становиться настолько
много, что впору было бы создавать несколько
рассылок, - одну про WinAPI, другую про MFC, третью про WTL, и т.д.
Знаю, многие сочтут это просто отличной идеей, т.к. смогут подписаться
именно на то, что их интересует. Но, к сожалению, я один, и физически не
смогу все эти рассылки готовить, а помощников нет. Конечно, я
буду стараться осветить самое важное и интересное. Как кто-то сказал, "нельзя
объять необъятное... а если и можно, то только по частям и не сразу" ;) Так что
давайте договоримся: пока будем придерживаться общепринятого стандарта - C++,
WinAPI и MFC. А WTL (или С#, или чем-то другим) займемся, когда ее название
будет фигурировать в объявлениях типа "требуется программист" чаще,
чем MFC.