资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,10,章,C+,Windows,程序设计基础,Windows,系统是一个基于视窗的消息驱动系统,即使功能大异的,Windows,程序都有比较规范统一的程序界面,如窗口、菜单、工具条、对话框等。,Windows,程序的设计其实比较规范,但若不了解,Windows,程序的基本结构,程序调度的基本方法(即消息驱动的基本原理),以及每个程序都会用到的基本数据结构,也很难编写出有用的,Windows,程序来。,之所以在本章介绍,API,程序,就是基于上述考虑而设计的,尽管,API,程序设计在实际编程过程中已越来越少用了,但它却是理解,Windows,程序设计基本原理的最佳捷径,因为所有,Windows,程序的结构和执行过程最终大同于,API,程序。在此基础上学习,MFC,及其它在,Windows,程序设计语言如,JAVA,,都是大有帮助的!,“磨刀不误砍柴功!”,不是吗?,10.1 Windows,程序设计基础,Windows,系统的特点,标准的用户界面,多任务,设备独立性,动态链接,强大的内存管理,10.1 Windows,程序设计基础,2.,基本术语,窗口(,Window,),由句柄唯一标识,对话框(,Dialog,),人机交互,图标(,Icon,),代表某一项操作或程序的图符,位图(,Bitmap,)用,位模式形成的图像,菜单(,Menu,),命令,工具栏(,ToolBar,),常用的菜单项,状态栏(,StateBar,),操作状态或操作提示,10.1.1,窗口,窗口是,Windows,程序的基本单元,,Windows,程序的运行过程就是窗口内部、窗口之间及窗口与用户之间的信息交换过程。窗口通常包括菜单、工具条、滚动条、状态栏、命令按钮、对话框等元素。,10.1.2,事件驱动和消息响应,1.,事件,事件是指人们应用计算机的过程中发生的操作,如按下键盘上的某个按键、移动鼠标、单击鼠标左键、移动窗口及选择程序菜单等操作都是事件。,2,、事件驱动,每发生一个事件,就会产生一个与之对应的特定消息,该消息会被,Windows,系统捕获,然后将通过此消息调用执行与之对应的程序代码,实现相应的程序功能。,因为从事件发生到相应程序代码被调用执行都是通过消息来实现的,因此事件驱动也常被称为消息驱动,10.1.2,事件驱动和消息响应,3,、消息队列,用于存放消息的队列,消息系统由,Windows,系统自动建立和维护。,Windows,消息队列的类型,系统消息队列:由,Windows,系统维护管理的消息队列,每当有消息发生时,该消息将首先被存入系统消息队列。,应用程序消息队列:,Windows,系统会为每个应用程序建立一个独立的消息队列,用于存放该应用程序的消息。,10.1.2,事件驱动和消息响应,4,、消息循环,每个应用程序都有一个循环机构,该循环机构则不断地重复查看程序自身的消息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,这个处理消息的循环机构称为消息循环。,10.1.2,事件驱动和消息响应,4,、消息循环,每个应用程序都有一个循环机构,该循环机构则不断地重复查看程序自身的消息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,这个处理消息的循环机构称为消息循环。,10.1.2,事件驱动和消息响应,5,、,Windows,程序调度的基本原理,每个,Windows,程序启动后,就等待用户在其窗口中进行操作。每个操作会引发一个事件,就会产生一个与之对应的特定消息。该消息会被,Windows,系统捕获。,Windows,系统对捕获的消息进行分析后,会将消息传递给产生它的应用程序的消息队列,每个应用程序的消息循环机构不断地重复查看它自已的消息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,,如果队列中没有消息就等待,当队列中有消息时就又处理它,如此循环往复,直至程序结束。,10.1.2,事件驱动和消息响应,6,、事件驱动及消息循环的基本原理,10.1.2,事件驱动和消息响应,8,、,DOS,和,Windows,程序执行方式对比,10.1.3,Windows,程序的构成,1,、,Windows,程序的组成,程序代码,程序代码是程序的主体,用于实现程序的功能,资源,Windows,程序具有标准规范的应用程序界面,每个,Windows,程序常常包含了许多相同的组成元素,如菜单、对话框、工具栏、应用程序图标、鼠标光标、程序版本信息等,这些组成元素被,Windows,从程序代码中独立出来,并以各种不同扩展名的文件形式存在,如,.,ico,(图标)、,.bmp,(位图)、,.cur,(光标)等,,Windows,系统称之为资源,资源则可以在需要时才通过相关命令,加载,到程序中。,.lib,C runtime,Dll,import,.RC,资源编译器,.DLG,Dialog Editor,*,.,obj,*,.exe,.res,.DEF,资源连接器,Image Editor,Font Editor,.BMP,.ICO,.CUR,.FON,.h,.,c/cpp,c,编译器,2,、,Window,程序的编译链接过程,10.1.4 VC+,的,Windows,程序设计方法,1,API,程序设计,API,即,Application Programming Interface,(应用程序编程接口),它是,Windows,操作系统和,Windows,应用程序之间的标准接口,在应用程序中可以通过,API,访问,Windows,提供的各种函数、宏及数据结构。,API,函数保存在一些动态链接库中,每个,Windows,程序都要用到的动态链接库有,USER32.Dll,、,GDI32.Dll,、,KERNEL32.Dll,。,API,程序设计就是直接利用,Windows,系统提供的,API,函数,编写能够在,Windows,系统中运行的程序。,10.1.4 VC+,的,Windows,程序设计方法,2,MFC,程序设计,MFC,是,Microsoft Foundation Classes,的缩写,即微软基础类库。,MFC,是建立在,API,基础上的,C+,类库,它对,Windows,提供的,API,函数、数据结构、各种控件按功能进行了分类,利用面向对象技术将它们封装在不同的类中,并通过继承将这些类组织在一起。,MFC,不仅把,API,函数封装成了易于使用的类,而且还提供了建立,Windows,应用程序的框架结构,以及建立应用程序的各种组件,简化了,Windows,程序设计的难度,1.,句柄,句柄是整个,Windows,编程的基础。一个句柄是指,Windows,使用的一个唯一的整数值,是一个,4,字长(,32,位无符号整数),的数值,用于标识应用程序中不同的对象和同类对象中不同的实例。,如标识一个窗口、按钮、图标、滚动条、输入,/,输出设备、控件或文件等。,应用程序通过句柄能够访问相应的对象信息。,10.2 Windows,程序设计的常用数据结构,常用的句柄类型,HWND,标识窗口句柄,HINSTANCE,标识当前实例句柄,HCURSOR,标识光标句柄,HFONT,标识字体句柄,HPEN,标识画笔句柄,HBRUSH,标识画刷句柄,HDC,标识设备环境句柄,HBITMAP,标识位图句柄,HICON,标识图标句柄,HMENU,标识菜单句柄,HFILE,标识文件句柄,10.2 Windows,程序设计的常用数据结构,关键字类型等价于,BOOL,逻辑类型,int,BOOLEAN,逻辑,BYTE,BYTE,字节,unsinged,char,CHAR,字符,char,DOUBLE,双精度,double,DWORD,双字,unsigned long,FLOAT,浮点数,float,HANDLE,句柄,10.2.2,常用,数据类型,INT,整数,int,LONG,长整数,long,SHORT,短整数,short,UCHAR,无符号字符,unsinged,char,UINT,无符号整数,unsinged,int,ULONG,无符号长整数,unsigned long,USHORT,无符号短整数,unsigend,short,VOIDvoid,WCHAR,双字节码,unsigned short,WCHAR_T,双字节码,unsigned short,WORD,字,unsigned short,WPARAM,消息参数,UINT,LPARAM,消息参数,LONG,LRESULT,消息返回值,LONG,HINSTANCE,实例句柄,unsigned long,HWAND,窗口句柄,unsigned long,HDC,设备环境句柄,unsigned long,TCHAR,字符,char,LPSTR,字符指针,char*,LPCSTR,常量字符指针,const char*,LPTSTR,字符指针,TCHAR*,LPVOID,无类型指针,void*,LPCVOID,无类型长指针,const void*,(,1,)、坐标结构,typedef,struct,tagPOINT,LONG x;,LONG y;,POINT,;,在,MFC,中还有一个类,Cpoint,,与,POINT,结构近似,但它有许多成员函数。,(,2,)、长、宽尺寸结构:,CSIZE,,,Csize,;,typedef,struct,tagSIZE,int,cx,;,int,cy;SIZE;,10.2.3,点和矩形区域,(,3,)、记录矩形区域结构,RECT,和,Crect,typedef,struct,tagRECT,LONG left;,LONG top;,LONG right;,LONG bottom;,RECT;,在,MFC,中,Crect,与此类似,但有成员函数。,LPRECT,为指针,RECT,类型的常数指针。,(,4,)、颜色,COLORREF,32-bit value used to specify an RGB color.,例:,COLORREF RGB(BYTE,bRed,BYTE,bGreen,BYTE,Bblue,);,10.2.4,窗口结构,typedef,struct,_WNDCLASS,UINT style;,/,窗口类型,WNDPROC,lpfnWndProc,;,/,窗口函数指针,int,cbClsExtra,;/,为类结构的预留额外空间,int,cbWndExtra,;,/,为窗口结构预留额外空间,HANDLE,hInstance,;,/,窗口类的应用实例句柄,HICON,hIcon,;,/,图标句柄,HCURSOR,hCursor,;,/,窗口类的光标,HBRUSH,hbrBackground,;,/,窗口类的背景刷,LPCTSTR,lpszMenuName,;,/,菜单资源名,LPCTSTR,lpszClassName,;,/,窗口类名,WNDCLASS;,10.2.4,窗口结构,WNDCLASS,中的,style,代表窗口类型,可取下面的值:,WS_CHILD,子窗口(不能与,WS_POPUP,同时使用),WS_BORDER,带边框的窗口,WS_CAPTION,带标题栏的窗口,WS_HSCROLL,带有水平滚动条的窗口,WS_MAXIMIZE,最大尺寸的窗口,WS_MAXIMIZEBOX,带最大化框的窗口,WS_MINIMIZE,最小尺寸的窗口,WS_MINIMIZEBOX,带最小化框的窗口,WS_OVERLAPPED,带边框和标题栏的窗口,WS_OVERLAPPEDWINDOW,带边框、标题栏、系统菜单及最大、最小化框的窗口,WS_POPUP,弹出式窗口,WS_POPUPWINDOW,带边框和系统菜单的弹出式窗口,WS_SYSMENU,带系统菜单的窗口,WS_VSCROLL,带垂直滚动条的窗口,1,、消息结构:,MSG,typedef,struct,tagMSG,HWND,hwnd,;,/,/,消息发向的窗口句柄,UINT,message;,/,消息标识符,,,WPARAM,wParam,;/16,位的消息参数,值因消息异,LPARAM,lParam,;,/32,位的消息参数,值因消息异,DWORD,time;,/,消息放入消息队列的时间,POINT,pt;,/,消息放入消息队列的鼠标位置,。,MSG;,说明:,WPARAM,含义和数值因消息不同而不同,比如:键盘消息和鼠标消息所对应的,WPARAM,消息所代表的消息是不同的。,10.2.5,消息,10.2.5,消息,2,、,MSG,中的域说明,hwnd,是一个窗口句柄,用于标识消息发向的窗口。,time,用于保存消息放进消息队列的时间,,pt,用于保存将消息放入消息队列时的鼠标位置。,message,是消息标识符,它是一个,32,位的无符号整数。,Windows,中的每条消息都有一个对应的消息标识符,这些标识符是在,windows.h,中定义的,3,、消息的种类,标准,Windows,消息,除,WM_COMMAND,外,所有以,WM_,为前缀的消息,由窗口和视图处理。,控制消息,由控件和子窗口发给父窗口的消息。,命令消息,来自用户接口对象。如:菜单、工具条和加速键等。,10.2.5,消息,10.2.5,消息,4,、常见消息前缀的含义,BM,表示按钮控制消息,CB,组合框控制消息,EM,编辑框控制消息,LB,列表控制消息,SBM,滚动条控制消息,WM,窗口消息,10.2.5,消息,5,、,Windows,常用鼠标消息,WM_LBUTTONDBLCLK,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MBUTTONDBLCLK,WM_MBUTTONDOWN,WM_MBUTTONUP,WM_RBUTTONDBLCLK,WM_RBUTTONDOWN,WM_RBUTTONUP,10.2.5,消息,6,、,Windows,常用键盘消息,WM_KEYUP,WM_KEYDOWN,按下非系统键时产生此消息,系统键是指实现系统操作的组合键,如,Alt,和,F1,相结合的按钮键。附加参数,wParam,为按下键的虚拟键码,,lParam,记录按钮的重复次数、先前状态等。,WM_KEYUP,是释放按键时的键盘消息,其含义同,WM_KEYDOWN,。,WM_CHAR,按下非系统键时产生的消息,附加参数,wParam,为按键的,ASCII,码,,lparam,同前。,7,、其它常用,Windows,常用消息,WM_CREATE,CreateWindow,函数发生的消息。,WM_CLOSE,关闭窗口时产生的消息,如有子窗口,也一起删除。,WM_DESTROY,关闭窗口时产生的消息,WM_PAINT,hdc,=(HDC),wParam,;/,发生用户区域移动或显示事件、用户窗口改变大小的事件、程序通过流动条滚动窗口,覆盖在窗口上面的其它对象(如菜单)移开时,都会产生此消息!,10.2.5,消息,8,、消息的产生,用户产生消息,Windows,本身产生消息,应用程序本身产生消息,其他应用程序产生消息,9,、消息的传递,Windows,系统有一个存放消息的队列,每个应用程序也有一个消息队列。,Windows,系统先将收到的消息存放在系统队列中;然后再分发到相应的应用程序队列中。应用程序则从自身的队列中获取消息并进行处理。,10.2.5,消息,10,、消息的处理,通常每个,Windows,应用程序至少对应一个窗口,每个窗口都要有一个,窗口函数,负责处理该窗口内所发生的事件。每个窗口至少有一个窗口函数,负责处理该窗口的所有消息。,10.2.5,消息,1,、,Windows,标识符常用 命名规则,函数命名规则,函数名,=,动词,+,名词,动词和名词的第一个字母必须大写,例,GetMessage,变量命名规则,小写字母前缀表示变量的类型,其余 的部分描述变量的功能,例,nCount,匈牙利命名法,变量名以小写字母或代表数据类型的小写字母开头,.,Eg,:,szCmdLine,补充,:Windows,程序的名字,前缀,代表的数据类型,c,char or WCHAR or TCHAR,by,BYTE(unsigned char),n,short,i,int,x,y,int,used as x-coordinate or y-coordinate,cx,cy,int,used as x or y length;c stands for count,b,or,f,BOOL(,int,);f stands for flag,w,WORD(unsigned short),l,LONG(long),dw,DWORD(unsigned long),fn,function,s,string,sz,string terminated by 0 character,h,handle,p,pointer,2,、,Windows,程序常见名字前缀的含义,10.3 Windows,程序的基本结构,1,、简单的,Windows,程序至少包含两个函数,:,WinMain,():,必有且仅有一个。是程序执行的入口点,类似于,C,程序中的,main,函数,窗口函数,:,每个窗口对应一个窗口函数,以响应该程序窗口中发生的事件消息。,2,、,WinMain,(),函数需完成的功能,定义窗口类,注册窗口类,建立窗口类的窗口,显示窗口,运行消息循环,10.3 Windows,程序的基本结构,3,、,Windows,程序的执行逻辑,Windows,系统首先为该程序建立必备的程序环境,如定义并初始化一些全局变量,接下来就寻找并进入,WinMain,函数。,WinMain,是,Window,程序的入口点,由它控制程序的执行流程。,WinMain,函数依次完成以下工作:调用,API,函数定义并注册窗口类,创建程序窗口,显示窗口,建立消息循环,等待用户操作程序窗口。,用户在程序窗口中所作的每件事情都会产生一个消息,该消息会被,Windows,传递到该程序的消息队列中。,WinMain,中的消息循环会不断地从本程序的消息队列中获取消息,并将其传递给该窗口的窗口处理函数,由窗口处理函数对消息进行处理,实现相应的程序功能。,10.3.2 Win32,Application,程序设计,在,Miscrosoft,Visual C+,中的,API,程序设计方法,一般的编程方法是先用,VC+,的,Win32 Application,向导建立一个,Windows,应用程序的框架,然后将它修改成自己的程序,并根据需要添加一些头文件、源程序文件及资源文件。,【,例,10-1】,在,VC+6.0,环境下设计一个简单的,Windows API,程序,该程序在窗口中显示字符串,Hellow,API Programming,!,。,10.3.2 Win32,Application,程序设计,编程过程如下:,(,1,)启动,VC+6.0,,选择菜单“文件,|,新建”,在弹出的“新建”对话框中选择“工程”标签页,如图所示。,10.3.2 Win32,Application,程序设计,(,2,)选中“工程”对话框中的“,Win32 Application”,列表项,并在“位置”编辑框中指定本项目建立的磁盘目录,然后在“工程”编辑框中输入项目文件的名字。,(,3,)单击“确定”按钮,并在弹出的对话框中选中“,An empty project.”,单选项,然后单击“完成”按钮。最后将得到如图,10-7,(,a,)所示的空项目文件窗口。,(,4,)选择菜单“文件,|,新建”,然后在弹出的对话框中选择“文件”标签,并选择列表中的“,C+Source File”,项目,然后在“文件”编辑框中输入源程序文件名“,HellApi,”,,如 图,10-7,(,b,)所示。输入完成后,单击“结束”按钮。,10.3.2 Win32,Application,程序设计,10.3.2 Win32,Application,程序设计,(,5,)打开目录,C:,dkHellApi,,在该目录中可以看到以下文件名:,HellApi.cpp,、,HellApi.dsp,、,HellApi.dsw,、,HellApi.ncb,、,HellApi.opt,,这些文件就是在前面的操作过程产生的。,(,6,)在,HellApi.cpp,中输入下面的程序代码。,H,ellApi.cpp,#include,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;,注册窗口类,定义窗口的属性,如大小、宽度,前景色等,hwnd,=,CreateWindow(,szAppName,/,用于建立窗口的类名,TEXT(The Hello Program),/,窗口标题,WS_OVERLAPPEDWINDOW,/,窗口类型,CW_USEDEFAULT,/,窗口左上角,X,坐标为默认值,CW_USEDEFAULT,/,窗口左上角,Y,坐标为默认值,CW_USEDEFAULT,/,窗口宽度为默认值,CW_USEDEFAULT,/,窗口高度为默认值,NULL,/,该窗口没有父窗口,NULL,/,该窗口没有菜单,hInstance,/,创建本窗口的程序句柄,NULL);/,系统保留参数,ShowWindow,(,hwnd,iCmdShow,);,/,显示窗口,,hwnd,代表上面建立的窗口,UpdateWindow,(hwnd,);,/,更新窗口,绘制窗口客户区,本段程序建立并显示一个窗口,while(,GetMessage,(&,msg,NULL,0,0),TranslateMessage,(&,msg,);,DispatchMessage,(&,msg,);,return,msg.wParam,;,Windows,程序,的消息循环,LRESULT CALLBACK,WndProc,(,HWND,hwnd,UINT message,WPARAM,wParam,LPARAM,lParam,),HDC,hdc,;,PAINTSTRUCT,ps,;,RECT,rect,;,窗口处理函数,是一个回调函数,每个应用程序至少有一个窗口处理函数,,窗口函数的参数由,Windows,传递,这些参数是由事件消息产生的,。,switch(,message,),/,消息处理,case WM_CREATE:,return 0;,case WM_PAINT:,hdc,=,BeginPaint,(,hwnd,&,ps,);,GetClientRect(,hwnd,&rect,);,DrawText(hdc,Hello,Windows,API,-1,&,rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);,EndPaint,(,hwnd,&ps,);,return 0;,case WM_DESTROY:,PostQuitMessage(0);,return 0;,return,DefWindowProc(hwnd,message,wParam,lParam,);,10.3.3 Windows,程序的控制流程,所有,Windows,应用程序具有相同的程序结构和执行控制流程,步骤如下:,(,1,)创建全局变量,(,2,)程序入口函数,WinMain,()函数接收控制,(,3,),WinMain,(),登记窗口,(,4,),WinMain,(),建立窗口,(,5,),WinMain,(),进入消息循环,(,6,)当窗口中有事件发生时,事件消息进入消息循环队列,(,7,),windows,操作系统分析消息,调用该窗口的窗口函数进行处理。,(,8,),WinMain,函数退出,程序终止。,如下图所示,Windows API,程序的控制程,创建全局变量,程序入口函数,WinMain,(),函数接收控制,WinMain,(),登记窗口,WinMain,(),建立窗口,WinMain,(),进入消息循环,当窗口中有事件发生时,事件消息进入消息循环队列,windows,操作系统分析消息,调用该窗口的窗口函数进行处理。,WinMain,函数退出,程序终止。,初始化所有,全局对象,WinMain,(),登记窗口,建立窗口,消息,循环,Hello,Windows,API,显示窗口,程序出口:,WM_QUIT,Windows,程序的控制流程,int,WINAPI,WinMain,(,hIns,hPrevI,.),MSG,msg,;,RegisterClass,(&,wndclass,),CreateWindow,(.);,ShowWindow,(,hwnd,iCmdShow,);,UpdateWindow,(,hwnd,);,while(,GetMessage,(&,msg,NULL,0,0),TranslateMessage,(&,msg,);,DispatchMessage,(&,msg,);,return,msg.wParam,;,LRESULT CALLBACK,WndProc,(,hwnd,message,wParam,lParam,),switch(message),case WM_CREATE:,case WM_COMMAND:,case WM_LBUTTONDOWN:,case WM_PAINT:,case WM_CLOSE:,case WM_DESTROY:,return,DefWindowProc,(,hwnd,message,wParam,lParam,);,Mouse,Driver,Keyboard,Driver,system,message,queue,application,message,queue,Message from others windows,postMessage,(),Windows,User,modute,HELLWin.exe,10.3.3 Windows,程序的控制流程,接下来将对,API,程序的建立、执行流程进行进一步的剖析。借此理解,Windows,程序的结构,事件驱动和消息循环的本质。,DOS,平台的,C,程序的入口点是,main(),函数,在,WINDOW,的,C+,程序的入口点是,WinMain,(),函数。其定义形式为:,int,APIENTRY,WinMain,(,HINSTANCE,hInstance,/,HINSTANCE,hPrevInstance,LPSTR,lpCmdLine,int,nCmdShow,),实例句柄,当程序在,WINDOWS,下运行时,它唯一地标识该程序,当程序在,WINDOWS,下有多个副本运行时,它标识该程序的前一个副本,标识传给该程序的命令行参数,近似于,main(),函数的,char*,argv,指针窗口在,Window,中的显示方式,其值为,1-7,,如:值,1,表示,SW_SHOWNORMAL/,窗口以常规显示,见第,321,页表,10-4,1,、程序,入口点,窗口总是在窗口类的基础上创建的,窗口类标识了处理窗口消息的窗口过程,这是非常重要的。,记住:窗口总是在窗口类的基础上创建的,窗口类用于标处理窗口消息的窗口过程。,在创建窗口之前,必须先调用,RegisterClass,函数登录一个窗口类,以后可以基于这个已登录的窗口创建多个窗口。,只有程序的第一个实例需要登录窗口类!,例,10-1,的登录窗口如下:,2,、注册,窗口类,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,“This program !,szAppName,MB_ICONERROR);,return 0;,发生在本窗口中的事件由,WndProc,处理,这是,WinMain,与窗口函数的,关联!,3,、创建,窗口,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,if(!,hWnd,)return FALSE;,/,建立窗口失败,4,、显示,窗口,ShowWindow(hWnd,nCmdShow,);,UpdateWindow(hWnd,);,hWnd,是前面创建的窗口的句柄,nCmdShow,是窗口显示的方式,缺省值为,1,即:,SW_SHOWNORMAL,hWnd,是前面创建的窗口的句柄,该函数产生,WM_PAINT,消息,导致窗口被重绘,5,、消息循环,调用,UpdateWindow(hWnd,);,函数之后,窗口就显示在显示屏幕上,这时程序就进入了,消息循环,,等待用户用键盘或鼠标操作窗口,产生消息。产生的消息将被放入消息队列:,5,、,Windwos,消息循环,系统消息队列,应用程序队列,1,应用程序队列,2,应用程序队列,3,应用程序队列,n,应用程序,1,WinMain,(),函数,消息循环,窗口函数,1,窗口函数,m,应用程序,1,WinMain,(),函数,消息循环,窗口函数,1,窗口函数,m,硬件输入,MSG,本队列由,W,indows,系统建立和维护,MSG,MSG,MSG,MSG,MSG,MSG,MSG,MSG,while(,GetMessage(&msg,NULL,0,0),TranslateMessage(&msg,);,DispatchMessage(&msg,);,消息循环从此开始,它从消息队列中取出一条消息,,WM_QUIT,则退出,将,MSG,消息进行传给,WINDOWS,系统,并进行一些键盘转换,再将,MSG,消息传给,WINDOWS,系统,然后,WINDOWS,系统将该消息传给正确的窗口过程,让它进行处理。本程序是由,WndProc,函数处理,处理完毕后,,WndProc,返,windows,,,因为此时,Windows,调用还处于,DispatchMessage,函数,在该函数执行后,再次返回到 下一个,GetMessage,函数,Windows,应用程序的消息处理流程,WM_KEYDOWN,WM_KEYUP,WM_MOUSEMOVE,WM_LBUTTONUP,WM_QUIT,应用程序消息队列,WinMain,(),消息循环,WndProc,(),case,WM_KEYDOWN,case WM_KEYUP,case WM_LBUTTUP,default,WM_CREATE,WM_DESTROY,WM_SIZE,WM_PAINT,GetMessage,(),检索到的消息,DispatchMessage,(),DefWindowProc,Windows,系统,应用程序,回调,6,、窗口,函数,实际的动作发生在窗口函数中,窗口函数确定了在窗口的客户区域中显示些什么以及窗口函数怎样响应用户的输入。,LRESULT CALLBACK,WndProc(HWND,hWnd,UINT,message,WPARAM,wParam,LPARAM,lParam,),说明:,1,、,WndProc,是一个回调函数,CALLBACK,指定窗口函数是一个回调函数。回调就是由,Windows,系统调用的意思,即窗口函数是由,Windows,系统调用的,应用程序不必调用它。,2,、窗口函数的参数,每个,Windows,应用程序的窗口函数都有着相同的参数表:,第,1,个参数,hWnd,用于标识接收消息的窗口句柄;,第,2,个参数,message,用于标识消息,该消息将被用于处理消息的,switch,结构中;,第,3,、,4,个参数,wParam,和,lParam,是,message,的附加信息,它们的内容随,message,消息而异,如鼠标消息与键盘消息的,wParam,和,lParam,参数就不一样。窗口函数主要利用这些参数响应窗口事件,实现程序功能。,6,、窗口,函数,7,、消息,处理,窗口函数,所接收的消息都是用一个数值来标识的,它就是传递给窗口过程的,message,参数,消息在,WINDOWS.H,头文件中定义,它们是以“,WM_”,的标识符。,一般地,在,WINDOWS,程序中使用,switch,和,case,结构来确定,窗口函数,接收的是什么消息以及如何处理它。,窗口,窗口函数,不处理的消息被传给,:,DefWindowProc,函数进行缺省处理。,switch(,message,),case WM_CREATE:,break;,case WM_PAINT:,break;,case WM_DESTROY:,default:,return,DefWindowProc,();,消息处理过程,8,、数据输出,与,WM_PAINT,消息,WM_PAINT,
展开阅读全文