1、第四章 应用程序基本结构与运行方式,4.1 窗口一、窗口的在应用程序中的意义1、窗口是Windows应用程序的用户图形交互界面。2、应用程序基本的组成框架。 3、Windows操作系统基本的管理单位二、以窗口为主体的用户图形界面具有以下特点:1、形式规范2、交互方式多样3、易于操作,三、窗口的外观与组成,4.2 Windows扩充的不同于C语言的数据类型Word 16位无符号整数。Dword 32位无符号整数。Long 32位整数。Handle 16位无符号整数, 常用于建立某个对象的句柄,使用此句柄相当于引用该对象。HWnd 16位无符号整数,常用于表示打开的窗口句柄,使该句柄相当于引用该对
2、象。Bool 16位布尔值Byte 8位无符号整数Farproc 32位指向函数指针Dlgproc 32位指向对话框过程的函数指针Lpstr 32位指向字符串数据的指针Unit 16位无符号整数Lparam 32位整数,常用于Windows的参数,Wparam 16位整数,常用于Windows的函数参数Atom 作为一个原子的16位句柄Colorref 用作颜色值的32位数Hfile 用作文件句柄的16位数句柄: 1、在标准C中,句柄可用于文件的输入和输出。 如:int fHandle;fHandle = open(“filename”,”r”);if( fHandle )read(fHand
3、le,block,bytesToRead);close(fHandle); 2、在Windows中,句柄是Windows用于标识应用程序中建立的或使用的对象的唯一整数。,实例:在Windows下,不仅可以同时运行多个程序,还可以同时运 行同一应用程序的多份拷贝,每份拷贝叫做一个实例,由不同的 实例句柄来标识。一个实例句柄是应用程序的一个单独可以执行的副本,是唯一 标识此实例的整数。,4.2 消息,一、消息的组成 Windows消息由消息号和参数两部分组成: 1、消息号。 Windows操作系统通过32为整数标识一条Windows消息,称为消息号。具有以下三个特点: 唯一性:只对于Windows
4、操作系统中的每一条消息存在且只存在一个消息号与之相对应。 直观性:消息号在形式上表现为消息名,消息名通常直观地说明了消息的产生方式和类型,比如WM_LBUTTONDOWN直观地反映了鼠标左键按下时所产生的消息。 可自定义:Windows系统定义了一系列的消息号和消息名,程序员可以使用这些消息号,也可以使用自己定义的消息。,自定义消息的形式如下: #define 消息名 消息号 为了不与现有的Windows消息相冲突,在消息号的定义通常采用如下的形式:WM_USER + n其中WM_USER是Windows操作系统定义的用户的消息起始值,程序员必须在该起始值之后来选取消息号。 如: #defin
5、e MESSAGE_1 WM_USER + 1,2、参数。Windows的消息具有以下两个参数: 字参数(wParam) 长参数(lParam) 字参数和长参数都是32为整数,用于提供消息的附带信息,是消息传递过程中参数的载体。 二、消息的分类 1、 输入消息:包括键盘和鼠标的输入。这类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理该消息。 2、控制消息:用来与Windows的控制对象进行双向通信。比如:列表框、按钮等。,3、系统消息: 对程序中的某些事件或系统时钟中断作出响应。一些系统消息要通过Windows系统消息队列(如DDE,动态数据交换
6、消息),有的则不通过系统消息队列而直接送入应用程序的消息队列中,如创建窗口消息。4、用户消息:程序员自己定义并在应用程序中主动发出的消息,一般由应用程序的某一部分内部处理。 三、常用消息举例 1、WM_LBUTTONDOWN 产生:当鼠标左键被按下时。 参数:wParam:整数值,用来说明左键按下时,键盘上的Shift和Ctrl是否同时被按下。lParam:低字节包含消息产生时光标的x坐标值,高字节包含y坐标值。 与此类似的消息: WM_LBUTTONUP WM_RBUTTONDOWN WM_RBUTTONUP WM_LBUTTONBLCLK WM_RBUTTONBLCLK,2、WM_KEYD
7、OWN 产生:在键盘上按下一个非系统键时。 参数:wParam:按下键的虚拟键码,(其用来标识按下的是那个键),在Windows.h中有定义。 lParam:长参数,其中记录了按键的重复次数、扫描码、转移代码、先前键的状态信息。 与此类似的还有: WM_KEYUP 3、WM_CHAR 产生:在键盘上单击一个非系统键时产生。 参数:wParam:按下键的ASCII码。 lParam:长参数,其中记录了按键的重复次数、扫描码、转移代码、先前键的状态信息。 4、WM_CREATE 产生:由CreateWindow函数发出 参数:wParam未用,lParam包含了一个指向CREATESTRUCT数据
8、结构的指针。,5、WM_CLOSE 产生:关闭当前窗口时产生。 参数:未用。 6、WM_DESTROY 产生:消除窗口时由DestroyWindow函数发出。 参数:未用。 7、WM_QUIT 产生:退出应用程序时由PostQuitMessage函数发出。 参数:wParam含有退出代码,用以标识应用程序退出运行时的有关信息。,4.3 事件驱动模式,一、Windows应用程序的执行过程,二、说明1、程序的执行顺序取决于事件发生的顺序。2、事件驱动应用程序中的多个处理模块通过消息发送和接收交换数据,并不需要确定模块之间的执行顺序和响应先后问题,只和事件的产生与相应消息的发送先后有关。3、基于事件
9、驱动的应用程序能够为用户提供方便灵活的操作方式。4、Windows操作系统所具有的多线程、用户图形化界面特点客观上要求Windows应用程序采用事件驱动的方式进行。,4.4 Windows编程内部分析例1: int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) MSG msg;char szAppName=“Welcome to windows!”;HWND hWnd;WNDCLASS wndClass;if( !hPreInst)wndClass.style
10、 = CS_HREDRAW ;wndClass.lpfnWndProc = (WNDPROC)WndProc;wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;,wndClass.hInstance = hInstance;wndClass.hIcon=LoadIcon(hInstance, IDI_APPLICATION);wndClass.hCursor= LoadCursor(NULL, IDC_ARROW);wndClass.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);wndClass.lpszMenuN
11、ame = NULL;wndClass.lpszClassName = szAppName;if(ResisterClass(,hWnd = CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,100,100,300,300NULL,NULL,hInstance,NULL);if (!hWnd)return FALSE;ShowWindow(hWnd, nCmdShow);while (GetMessage( ,LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
12、LPARAM lParam) char *str=“welcome “;switch (message) case WM_PAINT:HDC hdc; PAINTSTRUCT Pt;hdc = BeginPaint(hWnd, ,说明: 一、程序的入口 int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) 二、窗口的注册 Typedef struct _WNDCLASSUNIT style;WNDPROC lpfnWndProc;int cbClsExtra
13、;int cbWndExtra ;HANDLE hInstance ;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName; WNDCLASS;,三、创建一个窗口HWND CreateWindow(HWND lpszClassname, /窗口类名LPCTSTR lpszWindowName, / 窗口标题LPCTSTR dwStyle, / 窗口风格int nx,ny,nWidth,nHeight, /位置及大小HWND hwndParent, /父窗口句柄HMENU hmenu, /窗口菜单句柄HANDLE hinst, / 当前窗口句柄LPVOID lpvParam); / 所用参数 四、显示一个窗口ShowWindow() 五、建立消息循环 while (GetMessage(,