程序创建的每一个窗口都有相关的窗口过程。这个 窗口过程是一个函数,既可以在程序中,也可以 在动态链接库中。Vindowsi通过调用窗口过程来 给窗口发送消息。窗口过程根据此消息进行处理, 然后将控制返回给Windows。更确切地说,窗口 通常是在“窗口类”的基础上创建的。窗口类标识 了处理窗口消息的窗口过程。使用窗口类使多个窗口能够基于同 一个窗口类,并且使用同一个窗口过程。例如,所有Windows程序 中的所有按钮均基于同一个窗口类。这个窗口类与一个位于 Windowsz动态链接库(处理所有的按钮窗口消息)的窗口过程相联 系。在面向对象的程序设计中,对象是代码与数据的组合。窗口是 一种对象,其代码是窗口过程。数据是窗口过程保存的信息,以及 Windows为每个窗口系统中那个窗口类保存的信息。窗口过程处理 给窗口发送的消息。这些消息经常是告知窗口,用户正使用键盘或 鼠标进行输入。这正是按钮窗口知道它被“按下”的奥妙所在。在 窗口大小改变或窗口表面需要重画时,由其他消息通知窗口
程序创建的每一个窗口都有相关的窗口过程。这个 窗口过程是一个函数,既可以在程序中,也可以 在动态链接库中。Windows通过调用窗口过程来 给窗口发送消息。窗口过程根据此消息进行处理, 然后将控制返回给Windows。 更确切地说,窗口 通常是在“窗口类”的基础上创建的。窗口类标识 了处理窗口消息的窗口过程。使用窗口类使多个窗口能够基于同 一个窗口类,并且使用同一个窗口过程。例如,所有Windows程序 中的所有按钮均基于同一个窗口类 。这个窗口类与一个位于 Windows动态链接库(处理所有的按钮窗口消息)的窗口过程相联 系。在面向对象的程序设计中,对象是代码与数据的组合。窗口是 一种对象,其代码是窗口过程。数据是窗口过程保存的信息,以及 Windows为每个窗口系统中那个窗口类保存的信息。窗口过程处理 给窗口发送的消息。这些消息经常是告知窗口,用户正使用键盘或 鼠标进行输入。这正是按钮窗口知道它被“按下”的奥妙所在。在 窗口大小改变或窗口表面需要重画时,由其他消息通知窗口
Windows程序开始执行后,Windows为该 程序创建一个“消息队列”。这个消息队列 用来存放该程序可能创建的各种不同窗口 的消息。程序中有一小段代码,叫做“消息 循环”,用来从队列中取出消息,并且将它 们发送给相应的窗口过程。有些消息直接发送给窗口过 程,不用放人消息队列中。如果您对这段有关Windows体 系结构的过于简略的描述将信将疑,就让我们去看看在实 际的程序中,窗口、窗口类、窗口过程、消息队列、消息 循环和窗口消息是如何相互配合的。这或许对您会有些帮 助。创建一个窗口首先需要注册一个窗口类,那需要一个 窗口过程来处理窗口消息。这包括一段几乎出现在每 个Window程序中的固定代码。程序2.1所示的HELLOWIN 程序就是一个包括这段固定代码的简单程序
Windows程序开始执行后,Windows为该 程序创建一个“消息队列” 。这个消息队列 用来存放该程序可能创建的各种不同窗口 的消息。程序中有一小段代码,叫做“消息 循环” ,用来从队列中取出消息,并且将它 们发送给相应的窗口过程。有些消息直接发送给窗口过 程,不用放人消息队列中。如果您对这段有关Windows体 系结构的过于简略的描述将信将疑,就让我们去看看在实 际的程序中,窗口、窗口类、窗口过程、消息队列、消息 循环和窗口消息是如何相互配合的。这或许对您会有些帮 助。创建一个窗口首先需要注册一个窗口类,那需要一个 窗口过程来处理窗口消息。这包 括一段几乎出现在每一 个Window程序中的固定代码。程序2.1所示的HELLOWIN 程序就是一个包括这段固定代码的简单程序
二、程序2.1 #include <windows.h> LRESULT CALLBACK WndProc (HWND,UINT, WPARAM,LPARAM); int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR SZCmdLine,int iCmdShow) { static TCHAR SzAppName[]TEXT ("HelloWin"); HWND hwnd MSG msg WNDCLASS wndclass wndclass.style =CS HREDRAW CS VREDRAW wndclass.lpfn WndProc WndProc wndclass.cbClsExtra =0; wndclass.cbWndExtra =0;
二、程序2.1 #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ;
wndclass.hInstance hInstance wndclass.hIcon=LoadIcon(NULL, IDI APPLICATION) wndclass.hCursor=LoadCursor (NULL, IDC ARROW); wndclass.hbrBackground =(HBRUSH) GetStockObject (WHITE BRUSH); wndclass.lpszMenuName NULL wndclass.lpszClassName SZAppName if (!RegisterClass (&wndclass)) MessageBox (NULL,TEXT ("This program requires Windows NT!"), SzAppName,MB ICONERROR) return 0
wndclass.hInstance = hInstance ; wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION) ; wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; }
hwnd Create Window (szAppName, //window class name TEXT("The Hello Program"),/∥window caption WS OVERLAPPEDWINDOW, /window style CW USEDEFAULT. /initial x position CW USEDEFAULT. /initial y position CW USEDEFAULT. /∥initial x size CW USEDEFAULT. /initial y size NULL, /parent window handle NULL, ∥window menu handle hInstance, /program instance handle NULL): /creation parameters
hwnd = CreateWindow (szAppName, // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters