Я думаю, что ответ на ваш вопрос в основном исторический, если вы оглянетесь на то, как две библиотеки возникли и развивались во времени.
Короткий ответ: если вы не делаете ничего особенного, используйте ATL. Он отлично подходит для простых пользовательских интерфейсов с добавленным COM.
Подробный ответ: MFC был создан в начале 90-х, чтобы опробовать этот новый язык под названием C ++ и применить его к Windows. Это сделало функции, подобные Office, доступными для сообщества разработчиков, когда в ОС их еще не было.
[Правка приукрашивания: я не работал в Microsoft, поэтому я не знаю, был ли Office когда-либо построен на MFC, но я думаю, что ответ отрицательный. Вернувшись в Win 3.1, Win 95 days, команда Office UI изобретала новые элементы управления, упаковывала их в библиотеки, а затем команды Windows и MFC включали оболочки и API в эти элементы управления с помощью распространяемых dll. Я предполагаю, что между этими командами было немного сотрудничества и обмена кодом. В конечном итоге эти элементы управления войдут в базовую операционную систему в пакетах обновления или в следующей версии Windows. Этот шаблон был продолжен с лентой Office, которая была добавлена в Windows в качестве дополнительного компонента после выпуска Office и теперь является частью ОС Windows.]
В то время библиотека была довольно примитивной как из-за того, что язык C ++ и компилятор были новыми, так и из-за того, что Microsoft наращивала ее с течением времени по мере развития Office.
Из-за этой истории MFC:
- Имеет довольно неуклюжий дизайн. Он начинался как легкая оболочка для Windows API, но затем вырос. Есть куча маленьких «функций», которые пришлось изобрести, потому что компилятор и язык просто не поддерживали их. Не было шаблонов, они изобрели строковый класс, они изобрели классы списков, они разработали свою собственную идентификацию типа во время выполнения и т. Д.
- Инкапсулирует 20-летнюю эволюцию Office и Windows, которая включает в себя массу вещей, которые вы, вероятно, никогда не будете использовать: интерфейсы с одним и несколькими документами, DDE, COM, COM +, DCOM, связывание и встраивание документов (так что вы можете вставлять текстовый документ в ваше приложение, если хотите), элементы управления ActiveX (эволюция встраивания объектов для Интернета!), Структурированное хранилище документов, сериализацию и управление версиями, автоматизацию (с ранних лет VBA) и, конечно, MVC. Последние версии поддерживают закрепление окон в стиле Visual Studio и ленту Office. Практически все технологии Редмонда за 20 лет где-то там. Это просто ОГРОМНО!
- Имеет массу мелких ошибок, ошибок, обходных путей, предположений, поддержку вещей, которые все еще существуют, которые вы никогда не будете использовать, и они вызывают проблемы. Вы должны быть хорошо знакомы с реализацией многих классов и с тем, как они взаимодействуют, чтобы использовать их в проекте приличного размера. Углубление в исходный код MFC во время отладки - обычное дело. Нахождение технической заметки 15-летней давности о нулевом указателе, вызывающем сбой, все равно происходит. Предположения об инициализации древних материалов для встраивания документов могут странным образом повлиять на ваше приложение. В MFC нет такой вещи, как абстракция, вам нужно ежедневно работать с его причудами и внутренностями, он ничего не скрывает. И не заставляйте меня начинать с мастера класса.
ATL был изобретен по мере развития языка C ++ и появления шаблонов. ATL был демонстрацией того, как использовать шаблоны, чтобы избежать проблем во время выполнения библиотеки MFC:
- Карты сообщений: поскольку они основаны на шаблонах, типы проверяются, и если вы испортите связанную функцию, она не будет построена. В MFC карты сообщений основаны на макросах и привязаны к времени выполнения. Это может вызвать странные ошибки, сообщение, перенаправленное в неправильное окно, сбой, если функция или макрос определены неправильно, или просто не работать, потому что что-то неправильно подключено. Гораздо труднее отлаживать и легче сломать, не заметив этого.
- COM / Автоматизация: Подобно картам сообщений, COM изначально был привязан к времени выполнения с использованием макросов, что требовало обработки большого количества ошибок и вызывало странные проблемы. ATL сделал его основанным на шаблоне, с ограничением времени компиляции и намного, намного более простым в использовании.
[Править приукрашивание: во время создания ATL техническая дорожная карта Microsoft была в основном сосредоточена на «управлении документами». Apple убивала их в настольном издательском бизнесе. «Связывание и встраивание документов» в Office было основным компонентом улучшения функций «Управление документами» в Office, чтобы они могли конкурировать в этой сфере. COM была основной технологией, изобретенной для интеграции приложений, а API встраивания документов были основаны на COM. MFC было сложно использовать для этого варианта использования. ATL был хорошим решением, упростившим эту конкретную технологию сторонним разработчикам для реализации COM и использования функций встраивания документов.]
Эти небольшие улучшения значительно упрощают работу с ATL в простом приложении, которому не нужны все офисные функции, такие как MFC. Что-то с простым пользовательским интерфейсом и некоторой автоматизацией Office. Оно маленькое, быстрое, ограниченное по времени компиляции, что экономит ваше время и избавляет от головной боли. MFC имеет огромную библиотеку классов, которые могут быть неуклюжими и с которыми сложно работать.
К сожалению, ATL застопорился. У него были оболочки для Windows API и поддержки COM, но дальше этого он никогда не выходил. Когда Интернет начал развиваться, все это было забыто как старые новости.
[Править Приукрашивание: Microsoft поняла, что эта «Интернет-вещь» будет большой. Их техническая дорожная карта радикально изменилась, и теперь они сосредоточены на Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM в сервере распределенных транзакций. Таким образом, связывание и встраивание документов больше не было приоритетом.]
Огромный размер MFC сделал невозможным их сброс, поэтому он все еще медленно развивается. В библиотеку были снова включены шаблоны, а также другие улучшения языка и API. (Я не слышал о WTL, пока не увидел этот вопрос. :)
В конце концов, какой из них использовать - это просто вопрос предпочтений. Большинство необходимых вам функций находится в базовом API ОС, который вы можете вызывать напрямую из любой библиотеки, если в библиотеке нет подходящей оболочки.
Только мои 2 цента, основанные на использовании MFC в течение многих лет, и теперь я использую его ежедневно. Я баловался ATL, когда он был впервые выпущен в нескольких проектах в течение нескольких лет. В те дни это был глоток свежего воздуха, но он никуда не делся. А потом появился Интернет, и я совершенно забыл о нем.
Изменить: этот ответ удивительно долговечен. Поскольку он продолжает появляться на моей странице переполнения стека, я подумал, что добавлю немного украшений к исходному ответу, которого, как мне казалось, не хватало.