Win32, especially when it comes to GUI programming, is one of the worst APIs out there.

MFC is also quite bad because of huge abstraction leakages; it fills like Win32 with bolted on classes.

It seems like Win32 happened a bit by accident, a bit by overengineering and a bit by Microsoft's attempt to lock everyone to their 'special' development environments, which did not include C as a conscious choice by Microsoft.

I think it's one of the best, because it's also the most efficient way to write GUIs on Windows. Definitely not overengineered.

MFC is horrible, I agree. I've had to work with it and the indirection just gets in the way and creates bloat. That is overengineering.

MFC was built for a reason. To provide that doc/view/OLE GUI. If you wander too far away from that it becomes well, lets just say, 'interesting' to use. I would many times just include MFC just to get some of those helper classes though. CString was way ahead of the game. C++ did not get a std::string standard that most people could use until well into the 2000s. Its database classes were good in a pinch to abstract away the nitpicky junk in ODBC. Then C++ took a 15 year sideways journey into getting templates right. During that time MS created C# and basically took away any reasons to really use MFC and C++ on windows for business applications.

I did some MFC for my job and disliked it. It didn't help that the software in my job was made up of thousands and thousands of COM objects and everything felt like treacle to write (got to implement those interface functions I'm never going to use!).

I have used wxWidgets a lot and really like it, but for modern C++ on Windows what do Microsoft recommend?

I can't seem to get any idea. Honestly, I would like to know.