Я думаю, що відповідь на ваше запитання здебільшого є історичною, якщо поглянути на те, як дві бібліотеки зароджувались та розвивались у часі.
Коротка відповідь - якщо ви нічого не робите «фантазії», використовуйте ATL. Це чудово підходить для простих користувальницьких інтерфейсів із вбудованим COM
Довга відповідь: MFC був побудований на початку 90-х, щоб випробувати цю нову мову під назвою C ++ та застосувати її до Windows. Це зробило Office подібним до функцій, доступних спільноті розробників, коли ОС їх ще не мала.
[Редагувати прикраси: я не працював у Microsoft, тому не знаю, чи Office коли-небудь будувався на MFC, але я думаю, що відповідь - ні. Ще в програмі Win 3.1, Win 95 днів команда Office UI винайде нові елементи керування, пакує їх у бібліотеки, тоді команди Windows та MFC включатимуть обгортки та API для цих елементів управління з перерозподіленими dlls. Я б здогадався, що між цими командами було трохи співпраці та обміну кодом. Врешті-решт, ці елементи керування перетворять їх у базову операційну систему в пакетах послуг або наступній версії Windows. Ця закономірність продовжувалась із стрічкою Office, яка була додана в Windows як додатковий компонент після завантаження Office, і тепер є частиною ОС Windows.]
У той час бібліотека була досить примітивною, як через мову C ++, так і для компілятора, і Microsoft створював її з часом, коли Office розвивався.
Через цю історію MFC:
- Має досить незграбний дизайн. Він розпочався як легка обгортка навколо API Windows, але зростав. Є купа маленьких "функцій", які довелося винайти, оскільки компілятор і мова просто не підтримували їх. Не було шаблонів, вони винайшли клас рядків, вони винайшли класи списків, створили власну ідентифікацію типу часу виконання тощо.
- Інкапсулює 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 технічна дорожня карта Майкрософт була зосереджена в основному на «Управління документами». Apple вбивала їх у настільному видавничому бізнесі. Office "Зв'язування та вставлення документів" було головним компонентом для вдосконалення функцій "Управління документами" Office для конкуренції в цьому просторі. COM - основна технологія, придумана для інтеграції програм, а API вбудовування документів базувався на COM. MFC було важко використовувати для цього випадку використання. ATL було хорошим рішенням, щоб полегшити цю технологію сторонній стороні для впровадження COM та використання функцій вбудовування документів.]
Ці невеликі вдосконалення значно полегшують роботу з ATL у простому додатку, якому не потрібні всі офіси, як функції MFC. Щось із простим інтерфейсом користувача та деякою автоматизованою системою Office. Це невеликий, швидкий, компільований час, що заощаджує багато часу та головного болю. MFC має величезну бібліотеку класів, яка може бути незграбною та складною для роботи.
На жаль, ATL застоювався. Він мав обгортки для підтримки API API та COM, і тоді він ніколи не виходив за рамки цього. Коли Інтернет вилетів, усі ці речі були наче забуті як старі новини.
[Редагувати прикрасу: Microsoft зрозуміла, що ця "Інтернет-річ" буде великою. Їх технічна дорожня карта кардинально змінилася, зосередившись на Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM на сервері розподілених транзакцій. Тож зв'язування та вкладання документів вже не було пріоритетним завданням.]
Величезний слід MFC унеможливив їх скидання, тому він все ще розвивається повільно. Шаблони знову включені в бібліотеку, а також інші вдосконалення мови та API. (Я не чув про WTL, поки не побачив це питання. :)
Зрештою, який саме використовувати - це просто питання переваги. Більшість необхідних функцій знаходяться в базовому API API, до якого можна зателефонувати безпосередньо з будь-якої бібліотеки, якщо в бібліотеці немає відповідного обгортка.
Просто мої 2 копійки на основі використання MFC протягом багатьох років, і я використовую його щодня. Я посварився в ATL, коли він був вперше випущений у кількох проектах за пару років. В ті часи це було ковтоком свіжого повітря, але ніколи насправді нікуди не ходили. І тоді Мережа з'явилася, і я забув про це все.
Редагувати: Ця відповідь має дивовижне довголіття. Оскільки він постійно вискакує на моїй сторінці переповнення стека, я подумав, що додаю прикраси до оригінальної відповіді, яку, на мою думку, бракує.