You are undoubtedly accustomed to the idea of a program making calls to the operating system. This is how a program opens a disk file, for example. What you may not be accustomed to is the idea of an operating system making calls to a program. Yet this is fundamental to Windows' object-oriented architecture.
Every window that a program creates has an associated window procedure. This window procedure is a function that could be either in the program itself or in a dynamic link library. Windows sends a message to a window by calling the window procedure. The window procedure does some processing based on the message and then returns control to Windows.
More precisely, a window is always created based on a ”window class.“ The window class identifies the window procedure that processes messages to the window. The use of a window class allows multiple windows to be based on the same window class and hence use the same window procedure. For example, all buttons in all Windows programs are based on the same window class. This window class is associated with a window procedure (located in the Windows USER.EXE dynamic link library) that processes messages to all the button windows.
In object-oriented programming, an ”object“ is a combination of code and data. A window is an object. The code is the window procedure. The data is information retained by the window procedure and information retained by Windows for each window and window class that exists in the system.
A window procedure processes messages to the window. Very often these messages inform a window of user input from the keyboard or mouse. This is how a push-button window knows that it's being ”pressed,“ for example. Other messages tell a window when it is being resized, or when the surface of the window needs to be repainted.
When a Windows program begins execution, Windows creates a ”message queue“ for the program. This message queue stores messages to all the various windows a program may create. The program includes a short chunk of code called the ”message loop“ to retrieve these messages from the queue and dispatch them to the appropriate window procedure. Other messages are sent directly to the window procedure without being placed in the message queue.
If your eyes are beginning to glaze over with this excessively abstract description of Windows architecture, maybe it will help to see how the window, the window class, the window procedure, the message queue, the message loop, and the window messages all fit together in the context of a real program.