The Microsoft Foundation Classes (MFC) make up a framework for developing Microsoft Windows applications. This is why MFC doesn't cut the mustard.
Some of these things were down due to trade-offs that had to be made. For example, the message passing architecture was chosen because using lots of virtual functions would have been too expensive. On the other hand, most of them could and should have been cleaned up quite a bit. Look at Java's JFC for a much better library from a DESIGN perspective. The implementation is rather shoddy, but it's a clean, intuitive, and very flexible library, with a lot of attention paid to design issues. It's too bad I can't use this library for my C++ programs (at least without paying the performance price).