Creo que la respuesta a tu pregunta es principalmente histórica, si miras hacia atrás en cómo se originaron y evolucionaron las dos bibliotecas a lo largo del tiempo.
La respuesta corta es, si no está haciendo nada "elegante", use ATL. Es ideal para interfaces de usuario simples con COM incluido.
La respuesta larga: MFC fue construido a principios de los 90 para probar este nuevo lenguaje llamado C ++ y aplicarlo a Windows. Puso funciones similares a las de Office disponibles para la comunidad de desarrolladores cuando el sistema operativo aún no las tenía.
[Editar embellecimiento: no trabajé en Microsoft, así que no sé si Office se creó alguna vez en MFC, pero creo que la respuesta es no. En Win 3.1, Win 95 days, el equipo de interfaz de usuario de Office inventaba nuevos controles, los empaquetaba en bibliotecas, luego los equipos de Windows y MFC incorporarían envoltorios y API a esos controles con dlls redistribuibles. Supongo que hubo un poco de colaboración y código compartido entre esos equipos. Con el tiempo, esos controles pasarían a formar parte del sistema operativo base en los Service Packs o en la próxima versión de Windows. Este patrón continuó con Office Ribbon, que se agregó a Windows como un componente adicional mucho después de que se envió Office, y ahora es parte del sistema operativo Windows.]
En ese momento, la biblioteca era bastante primitiva, tanto porque el lenguaje C ++ y el compilador eran nuevos, como porque Microsoft lo construyó con el tiempo a medida que Office evolucionó.
Debido a esta historia, MFC:
- Tiene un diseño bastante tosco. Comenzó como un envoltorio ligero alrededor de la API de Windows, pero creció. Hay un montón de pequeñas 'características' que tuvieron que inventarse porque el compilador y el lenguaje simplemente no las admitían. No había plantillas, inventaron una clase de cadena, inventaron clases de lista, diseñaron su propia identificación de tipo de tiempo de ejecución, etc.
- Encapsula 20 años de evolución de Office y Windows, que incluye una gran cantidad de cosas que probablemente nunca usará: interfaces de documentos únicos y múltiples, DDE, COM, COM +, DCOM, vinculación e incrustación de documentos (para que pueda incrustar un documento de Word en su aplicación si lo desea), controles ActiveX (¡evolución de la incrustación de objetos para la web!), Almacenamiento de documentos estructurados, serialización y control de versiones, automatización (desde los primeros años de VBA) y, por supuesto, MVC. Las últimas versiones son compatibles con el acoplamiento de ventanas de estilo Visual Studio y la cinta de Office. Básicamente, todas las tecnologías de Redmond en 20 años están ahí en alguna parte. ¡Es ENORME!
- Tiene un montón de pequeñas trampas, errores, soluciones, suposiciones, soporte para cosas que todavía están ahí y que nunca usarás y que causan problemas. Debe estar íntimamente familiarizado con la implementación de muchas clases y cómo interactúan para usarlo en un proyecto de tamaño decente. Es común profundizar en el código fuente de MFC durante la depuración. Aún ocurre encontrar una nota técnica de 15 años en que algún puntero es nulo y causa un bloqueo. Las suposiciones sobre la inicialización de elementos de incrustación de documentos antiguos pueden afectar su aplicación de maneras extrañas. No existe tal cosa como la abstracción en MFC, necesita trabajar con sus peculiaridades y aspectos internos a diario, no oculta nada. Y no me hagas empezar con el asistente de clases.
ATL se inventó a medida que evolucionó el lenguaje C ++ y llegaron las plantillas. ATL fue una muestra de cómo usar plantillas para evitar los problemas de tiempo de ejecución de la biblioteca MFC:
- Mapas de mensajes: dado que se basan en plantillas, los tipos se verifican y, si estropea la función enlazada, no se compila. En MFC, los mapas de mensajes se basan en macros y están sujetos al tiempo de ejecución. Esto puede causar errores extraños, mensaje enrutado a la ventana incorrecta, un bloqueo si tiene una función o macro definida incorrectamente, o simplemente no funciona porque algo no está bien conectado. Mucho más difícil de depurar y más fácil de romper sin darse cuenta.
- COM / Automatización: similar a los mapas de mensajes, COM originalmente se limitaba al tiempo de ejecución mediante macros, lo que requería una gran cantidad de manejo de errores y causaba problemas extraños. ATL lo hizo basado en plantillas, compilado con límite de tiempo y mucho, mucho más fácil de manejar.
[Editar embellecimiento: en el momento en que se creó ATL, la hoja de ruta técnica de Microsoft se centró principalmente en la "Gestión de documentos". Apple los estaba matando en el negocio de la autoedición. La 'vinculación e incrustación de documentos' de Office fue un componente principal para mejorar las características de 'Gestión de documentos' de Office para competir en este espacio. COM fue una tecnología central inventada para la integración de aplicaciones, y las API de incrustación de documentos se basaron en COM. MFC fue difícil de usar para este caso de uso. ATL fue una buena solución para hacer que esta tecnología en particular sea más fácil para que terceros implementen COM y utilicen funciones de incrustación de documentos.]
Estas pequeñas mejoras hacen que ATL sea mucho más fácil de manejar en una aplicación simple que no necesita todas las características de oficina de MFC. Algo con una interfaz de usuario simple y algo de automatización de Office. Es pequeño, rápido, tiene un tiempo de compilación limitado, lo que le ahorra mucho tiempo y dolor de cabeza. MFC tiene una enorme biblioteca de clases con las que puede resultar complicado trabajar.
Desafortunadamente, ATL se estancó. Tenía envoltorios para la API de Windows y el soporte COM, y nunca fue más allá de eso. Cuando despegó la Web, todas estas cosas se olvidaron como viejas noticias.
[Editar Embellecimiento: Microsoft se dio cuenta de que esta 'cosa de Internet' iba a ser grande. Su hoja de ruta técnica cambió drásticamente para centrarse en Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM en Distributed Transaction Server. Así que la vinculación e incrustación de documentos ya no era una prioridad alta.
La enorme huella de MFC hizo que fuera imposible que volcaran, por lo que aún evoluciona lentamente. Las plantillas se han incorporado nuevamente a la biblioteca, así como otras mejoras de lenguaje y API. (No había oído hablar de WTL hasta que vi esta pregunta. :)
En última instancia, cuál usar es simplemente una cuestión de preferencia. La mayoría de las funciones que necesita se encuentran en la API del sistema operativo base, a la que puede llamar directamente desde cualquiera de las bibliotecas, si no hay un contenedor adecuado en la biblioteca.
Solo mis 2 centavos basados en el uso de MFC durante muchos años, y lo uso ahora a diario. Incurrí en ATL cuando se lanzó por primera vez en algunos proyectos durante un par de años. Fue un soplo de aire fresco en esos días, pero nunca llegó a ninguna parte. Y luego apareció la Web y me olvidé de ella.
Editar: esta respuesta tiene una longevidad sorprendente. Como sigue apareciendo en mi página de desbordamiento de pila, pensé en agregar un poco de adorno a la respuesta original que pensé que faltaba.