The question is not so trivial as it may seem.
There are two different understanding of "sub-classing". First one is related to pure raw Windows API. This interface, from the standpoint of the application developer, is not object-oriented (some say "object based"). Even though the objects themselves are based on OOP inside, from the standpoint of the API users, they are just objects, without "classes". Everything is done inside the API implementation. If you obtain some object, say a window handle, you can use it only by passing it back to the API. The application program remains agnostic about the nature of such objects and the internal structure of the object "handled" by the handles. Using this approach, it was possible to use non-OOP languages for application development, such as C, Pascal (even non-OOP Pascal, not Borland or Free Pascal) or other languages like that. Based on this approach, API introduced so called "windows classes". From the standpoint of application developers, they are not real classes. Rather, they play the role of
meta-objects:
http://en.wikipedia.org/wiki/Metaobject[
^].
You can read about those "Windows Classes" here:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632596%28v=vs.85%29.aspx[
^].
On top of that, you can use object-oriented languages to derive classes from other classes. In this sense, you are using the classes how they are understood in the OOP language.
As to MFC, it uses both approaches. The trend is: the library itself uses both approaches, while an application programmer tends to use C++ OOP. This way, most or all user classes do not create new windows classes, use the same defined in Windows and MFC, changing its behavior based on C++ OOP. This approach provides enough expressing capabilities, just because, in particular, the user can override methods handling any events, which leverage all the Windows power.
In general, to use MFC effectively, the user should have in-depth knowledge of "classical" OOP: virtual methods, overriding, late binding and polymorphism.
My final note: in my opinion, MFC is too old and morally obsolete, the level of maintainability of code is lower then in later technologies. However, comparison of the quality of API and techniques is complicated and never straightforward.
—SA