will not run under Windows 98 because Windows 98 does not implement
As we'll see later in this book (particularly in Chapter 6, which covers using the keyboard), it is not easy writing a
Windows program that can handle the double-
byte character sets of the Far Eastern versions of Windows. This book does
not show you how, and for that reason some of the non-Unicode versions of the programs in this book do not run
properly under the Far Eastern versions of Windows. This is one reason why Unicode is so important to the future of
programming. Unicode allows programs to more easily cross national borders.
Chapter 3
Windows and Messages
In the first two chapters, the sample programs used the MessageBox function to deliver text output to the user. The
MessageBox function creates a "window." In Windows, the word "window" has a precise meaning. A window is a
rectangular area on the screen that receives user input and displays output in the form of text and graphics.
The MessageBox function creates a window, but it is a special-purpose window of limited flexibility. The message box
window has a title bar with a close button, an optional icon, one or more lines of text, and up to four buttons. However,
the icons and buttons must be chosen from a small collection that Windows provides for you.
The MessageBox function is certainly useful, but we're not going to get very far with it. We can't display graphics in a
message box, and we can't add a menu to a message box. For that we need to create our own windows, and now is the
time.
A Window of One's Own
Creating a window is as easy as calling the CreateWindow function.
Well, not really. Although the function to create a window is indeed named CreateWindow and you can find
documentation for this function at /Platform SDK/User Interface Services/Windowing/Windows/Window
Reference/Window Functions, you'll discover that the first argument to CreateWindow
is something called a "window class
name" and that a window class is connected to something called a "window procedure." Perhaps before we try calling
CreateWindow, a little background information might prove helpful.
An Architectural Overview
When programming for Windows, you're really engaged in a type of object-
oriented programming. This is most evident in
the object you'll be working with most in Windows, the object that gives Windows its name, the object that will soon
seem to take on anthropomorphic characteristics, the object that might even show up in your dreams: the object known
as the "window."
The most obvious windows adorning your desktop are application windows. These windows contain a title bar that shows
the program's name, a menu, and perhaps a toolbar and a scroll bar. Another type of window is the dialog box, which
may or may not have a title bar.
Less obvious are the various push buttons, radio buttons, check boxes, list boxes, scroll bars, and text-entry fields that
adorn the surfaces of dialog boxes. Each of these little visual objects is a window. More specifically, these are called "child
windows" or "control windows" or "child window controls."
The user sees these windows as objects on the screen and interacts directly with them using the keyboard or the mouse.
Interestingly enough, the programmer's perspective is analogous to the user's perspective. The window receives the user
input in the form of "messages" to the window. A window also uses messages to communicate with other windows.
Getting a good feel for messages is an important part of learning how to write programs for Windows.
Here's an example of Windows messages: As you know, most Windows programs have sizeable application windows.
That is, you can grab the window's border with the mouse and change the window's size. Often the program will respond
to this change in size by altering the contents of its window. You might guess (and you would be correct) that Windows
itself rather than the application is handling all the messy code involved with letting the user resize the window. Yet the
application "knows" that the window has been resized because it can change the format of what it displays.
How does the application know that the user has changed the window's size? For programmers accustomed to only
conventional character-
mode programming, there is no mechanism for the operating system to convey information of this
sort to the user. It turns out that the answer to this question is central to understanding the architecture of Windows.
When a user resizes a window, Windows sends a message to the program indicating the new window size. The program
can then adjust the contents of its window to reflect the new size.
"Windows sends a message to the program." I hope you didn't read that statement without blinking. What on earth could
it mean? We're talking about program code here, not a telegraph system. How can an operating system send a message
to a program?
When I say that "Windows sends a message to the program" I mean that Windows calls a function within the program—
function that you write and which is an essential part of your program's code. The parameters to this function describe
the particular message that is being sent by Windows and received by your program. This function in your program is
known as the "window procedure."
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' 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
19