Penso che la risposta alla tua domanda sia per lo più storica, se guardi indietro a come le due biblioteche hanno avuto origine e si sono evolute nel tempo.
La risposta breve è, se non stai facendo nulla di "stravagante", usa ATL. È ottimo per semplici interfacce utente con COM lanciato.
La risposta lunga: MFC è stato creato all'inizio degli anni '90 per provare questo nuovo linguaggio chiamato C ++ e applicarlo a Windows. Ha reso disponibili funzionalità simili a Office alla comunità di sviluppo quando il sistema operativo non le aveva ancora.
[Modifica abbellimento: non ho lavorato in Microsoft, quindi non so se Office sia mai stato costruito su MFC, ma penso che la risposta sia no. Tornando a Win 3.1, Win 95 giorni, il team dell'interfaccia utente di Office inventò nuovi controlli, li impacchettò in librerie, quindi i team Windows e MFC incorporarono wrapper e API a quei controlli con DLL ridistribuibili. Immagino che ci sia stata un po 'di collaborazione e condivisione del codice tra quei team. Alla fine quei controlli sarebbero entrati nel sistema operativo di base nei service pack o nella prossima versione di Windows. Questo modello è continuato con la barra multifunzione di Office che è stata aggiunta in Windows come componente aggiuntivo ben dopo la distribuzione di Office e ora fa parte del sistema operativo Windows.]
A quel tempo la libreria era piuttosto primitiva, sia perché il linguaggio C ++ e il compilatore erano nuovi, sia perché Microsoft lo costruiva nel tempo con l'evoluzione di Office.
A causa di questa storia, MFC:
- Ha un design abbastanza goffo. È iniziato come un involucro leggero attorno all'API di Windows, ma è cresciuto. Ci sono un sacco di piccole "funzionalità" che hanno dovuto essere inventate perché il compilatore e il linguaggio semplicemente non le supportavano. Non c'erano modelli, hanno inventato una classe di stringhe, hanno inventato classi di elenchi, hanno progettato la propria identificazione del tipo in fase di esecuzione, ecc.
- Incapsula 20 anni di evoluzione di Office e Windows, che include un intero carico di cose che probabilmente non userete mai: interfacce per documenti singoli e multipli, DDE, COM, COM +, DCOM, collegamento e incorporamento di documenti (quindi puoi incorporare un documento di Word in la tua app se lo desideri), controlli ActiveX (evoluzione dell'incorporamento di oggetti per il web!), Archiviazione di documenti strutturati, serializzazione e controllo delle versioni, automazione (dai primi anni di VBA) e, naturalmente, MVC. Le versioni più recenti supportano l'ancoraggio delle finestre in stile Visual Studio e la barra multifunzione di Office. Fondamentalmente ogni tecnologia di Redmond in 20 anni è lì da qualche parte. È semplicemente ENORME!
- Ha un sacco di piccoli trucchi, bug, soluzioni alternative, presupposti, supporto per cose che sono ancora lì che non userete mai e che causano problemi. È necessario avere familiarità con l'implementazione di molte classi e il modo in cui interagiscono per utilizzarle in un progetto di dimensioni decenti. L'analisi del codice sorgente MFC durante il debug è comune. Trovare una nota tecnica di 15 anni su un puntatore nullo che causa un arresto anomalo si verifica ancora. I presupposti sull'inizializzazione di elementi che incorporano documenti antichi possono influenzare la tua applicazione in modi strani. Non esiste astrazione in MFC, è necessario lavorare quotidianamente con le sue stranezze e le sue parti interne, non nasconde nulla. E non farmi iniziare con la procedura guidata di classe.
ATL è stato inventato con l'evoluzione del linguaggio C ++ e sono arrivati i modelli. ATL era una vetrina di come utilizzare i modelli per evitare i problemi di runtime della libreria MFC:
- Mappe dei messaggi: poiché sono basate su modelli, i tipi vengono controllati e se si rovina la funzione associata, non si crea. In MFC le mappe dei messaggi sono basate su macro e associate al runtime. Ciò può causare strani bug, messaggi indirizzati alla finestra sbagliata, un arresto anomalo se la funzione o la macro è stata definita in modo errato o semplicemente non funziona perché qualcosa non è collegato correttamente. Molto più difficile da eseguire il debug e più facile da interrompere senza accorgersene.
- COM / Automazione: simile alle mappe dei messaggi, COM era originariamente associato al runtime utilizzando le macro, richiedendo molti errori e causando problemi dispari. ATL lo ha reso basato su modelli, compilato con limiti di tempo e molto, molto più facile da gestire.
[Modifica abbellimento: al momento della creazione di ATL, la road map tecnica di Microsoft si concentrava principalmente sulla "Gestione dei documenti". Apple li stava uccidendo nel settore del desktop publishing. "Collegamento e incorporamento di documenti" di Office è stato un componente principale per migliorare le funzionalità di "gestione dei documenti" di Office per competere in questo spazio. COM era una tecnologia di base inventata per l'integrazione delle applicazioni e le API di incorporamento dei documenti erano basate su COM. MFC era difficile da usare per questo caso d'uso. ATL è stata una buona soluzione per rendere questa particolare tecnologia più facile per terze parti nell'implementare COM e utilizzare le funzionalità di incorporamento dei documenti.]
Questi piccoli miglioramenti rendono ATL estremamente più facile da gestire su una semplice applicazione che non necessita di tutte le funzionalità di MFC per ufficio. Qualcosa con una semplice interfaccia utente e un po 'di automazione d'ufficio. È piccolo, è veloce, è limitato dal tempo di compilazione, facendoti risparmiare molto tempo e mal di testa. MFC ha una vasta libreria di classi che possono essere goffe e difficili da lavorare.
Purtroppo ATL ha ristagnato. Aveva wrapper per l'API di Windows e il supporto COM, quindi non è mai andato oltre. Quando il Web è decollato, tutte queste cose sono state dimenticate come vecchie notizie.
[Modifica abbellimento: Microsoft si rese conto che questo "Internet Thing" sarebbe stato grande. La loro road map tecnica è cambiata drasticamente per concentrarsi su Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM in Distributed Transaction Server. Quindi il collegamento e l'incorporamento dei documenti non era più una priorità assoluta.]
L'enorme impronta di MFC ha reso impossibile il dumping, quindi si evolve ancora lentamente. I modelli sono stati incorporati di nuovo nella libreria, così come altri miglioramenti del linguaggio e delle API. (Non avevo sentito parlare di WTL finché non ho visto questa domanda. :)
In definitiva, quale usare è semplicemente una questione di preferenza. La maggior parte delle funzionalità di cui hai bisogno si trova nell'API del sistema operativo di base, che puoi chiamare direttamente da entrambe le librerie, se non è presente un wrapper adatto nella libreria.
Solo i miei 2 centesimi basati sull'utilizzo di MFC per molti anni e lo uso ora ogni giorno. Mi sono dilettato in ATL quando è stato rilasciato per la prima volta su alcuni progetti per un paio d'anni. Era una boccata d'aria fresca a quei tempi, ma non andava mai da nessuna parte. E poi è arrivato il Web e me ne sono dimenticato.
Modifica: questa risposta ha una longevità sorprendente. Dal momento che continua a comparire nella mia pagina di overflow dello stack, ho pensato di aggiungere qualche abbellimento alla risposta originale che pensavo mancasse.