1第10章C++Windows程序设计基础Windows系统是一个基于视窗的消息驱动系统,即使功能大异的Windows程序都有比较规范统一的程序界面,如窗口、菜单、工具条、对话框等。Windows程序的设计其实比较规范,但若不了解Windows程序的基本结构,程序调度的基本方法(即消息驱动的基本原理),以及每个程序都会用到的基本数据结构,也很难编写出有用的Windows程序来。之所以在本章介绍API程序,就是基于上述考虑而设计的,尽管API程序设计在实际编程过程中已越来越少用了,但它却是理解Windows程序设计基本原理的最佳捷径,因为所有Windows程序的结构和执行过程最终大同于API程序。在此基础上学习MFC及其它在Windows程序设计语言如JAVA,都是大有帮助的!“磨刀不误砍柴功!”,不是吗?210.1Windows程序设计基础1.Windows系统的特点标准的用户界面多任务设备独立性动态链接强大的内存管理310.1Windows程序设计基础2.基本术语窗口(Window)由句柄唯一标识对话框(Dialog)人机交互图标(Icon)代表某一项操作或程序的图符位图(Bitmap)用位模式形成的图像菜单(Menu)命令工具栏(ToolBar)常用的菜单项状态栏(StateBar)操作状态或操作提示410.1.1窗口窗口是Windows程序的基本单元,Windows程序的运行过程就是窗口内部、窗口之间及窗口与用户之间的信息交换过程。窗口通常包括菜单、工具条、滚动条、状态栏、命令按钮、对话框等元素。510.1.2事件驱动和消息响应1.事件事件是指人们应用计算机的过程中发生的操作,如按下键盘上的某个按键、移动鼠标、单击鼠标左键、移动窗口及选择程序菜单等操作都是事件。2、事件驱动每发生一个事件,就会产生一个与之对应的特定消息,该消息会被Windows系统捕获,然后将通过此消息调用执行与之对应的程序代码,实现相应的程序功能。因为从事件发生到相应程序代码被调用执行都是通过消息来实现的,因此事件驱动也常被称为消息驱动610.1.2事件驱动和消息响应3、消息队列用于存放消息的队列,消息系统由Windows系统自动建立和维护。Windows消息队列的类型系统消息队列:由Windows系统维护管理的消息队列,每当有消息发生时,该消息将首先被存入系统消息队列。应用程序消息队列:Windows系统会为每个应用程序建立一个独立的消息队列,用于存放该应用程序的消息。710.1.2事件驱动和消息响应4、消息循环每个应用程序都有一个循环机构,该循环机构则不断地重复查看程序自身的消息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,这个处理消息的循环机构称为消息循环。810.1.2事件驱动和消息响应5、Windows程序调度的基本原理每个Windows程序启动后,就等待用户在其窗口中进行操作。每个操作会引发一个事件,就会产生一个与之对应的特定消息。该消息会被Windows系统捕获。Windows系统对捕获的消息进行分析后,会将消息传递给产生它的应用程序的消息队列,每个应用程序的消息循环机构不断地重复查看它自已的消息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,如果队列中没有消息就等待,当队列中有消息时就又处理它,如此循环往复,直至程序结束。910.1.2事件驱动和消息响应6、事件驱动及消息循环的基本原理1010.1.2事件驱动和消息响应7、DOS和Windows程序执行方式对比1110.1.3Windows程序的构成1、Windows程序的组成程序代码程序代码是程序的主体,用于实现程序的功能资源Windows程序具有标准规范的应用程序界面,每个Windows程序常常包含了许多相同的组成元素,如菜单、对话框、工具栏、应用程序图标、鼠标光标、程序版本信息等,这些组成元素被Windows从程序代码中独立出来,并以各种不同扩展名的文件形式存在,如.ico(图标)、.bmp(位图)、.cur(光标)等,Windows系统称之为资源资源则可以在需要时才通过相关命令加载到程序中。12.libCruntimeDllimport.RC资源编译器.DLGDialogEditor*.obj*.exe.res.DEF资源连接器ImageEditorFontEditor.BMP.ICO.CUR.FON.h.c/cppc编译器2、Window程序的编译链接过程1310.1.4VC++的Windows程序设计方法1.API程序设计API即ApplicationProgrammingInterface(应用程序编程接口),它是Windows操作系统和Windows应用程序之间的标准接口,在应用程序中可以通过API访问Windows提供的各种函数、宏及数据结构。API函数保存在一些动态链接库中,每个Windows程序都要用到的动态链接库有USER32.Dll、GDI32.Dll、KERNEL32.Dll。API程序设计就是直接利用Windows系统提供的API函数,编写能够在Windows系统中运行的程序。1410.1.4VC++的Windows程序设计方法2.MFC程序设计MFC是MicrosoftFoundationClasses的缩写,即微软基础类库。MFC是建立在API基础上的C++类库,它对Windows提供的API函数、数据结构、各种控件按功能进行了分类,利用面向对象技术将它们封装在不同的类中,并通过继承将这些类组织在一起。MFC不仅把API函数封装成了易于使用的类,而且还提供了建立Windows应用程序的框架结构,以及建立应用程序的各种组件,简化了Windows程序设计的难度。151.句柄句柄是整个Windows编程的基础。一个句柄是指Windows使用的一个唯一的整数值,是一个4字长(32位无符号整数)的数值,用于标识应用程序中不同的对象和同类对象中不同的实例。如标识一个窗口、按钮、图标、滚动条、输入/输出设备、控件或文件等。应用程序通过句柄能够访问相应的对象信息。10.2Windows程序设计的常用数据结构16常用的句柄类型HWND标识窗口句柄HINSTANCE标识当前实例句柄HCURSOR标识光标句柄HFONT标识字体句柄HPEN标识画笔句柄HBRUSH标识画刷句柄HDC标识设备环境句柄HBITMAP标识位图句柄HICON标识图标句柄HMENU标识菜单句柄HFILE标识文件句柄10.2Windows程序设计的常用数据结构17关键字类型等价于BOOL逻辑类型intBOOLEAN逻辑BYTEBYTE字节unsingedcharCHAR字符charDOUBLE双精度doubleDWORD双字unsignedlongFLOAT浮点数floatHANDLE句柄10.2.2常用数据类型18INT整数intLONG长整数longSHORT短整数shortUCHAR无符号字符unsingedcharUINT无符号整数unsingedintULONG无符号长整数unsignedlongUSHORT无符号短整数unsigendshortVOIDvoidWCHAR双字节码unsignedshortWCHAR_T双字节码unsignedshortWORD字unsignedshort19WPARAM消息参数UINTLPARAM消息参数LONGLRESULT消息返回值LONGHINSTANCE实例句柄unsignedlongHWAND窗口句柄unsignedlongHDC设备环境句柄unsignedlongTCHAR字符charLPSTR字符指针char*LPCSTR常量字符指针constchar*LPTSTR字符指针TCHAR*LPVOID无类型指针void*LPCVOID无类型长指针constvoid*20(1)坐标结构typedefstructtagPOINT{LONGx;LONGy;}POINT;注:在MFC中还有一个类CPoint,与POINT结构近似,但它有许多成员函数。(2)长、宽尺寸结构:CSIZE,Csize;typedefstructtagSIZE{intcx;intcy;}SIZE;10.2.3点和矩形区域21(3)记录矩形区域结构RECT和CrecttypedefstructtagRECT{LONGleft;LONGtop;LONGright;LONGbottom;}RECT;在MFC中Crect与此类似,但有成员函数。LPRECT为指针RECT类型的常数指针。(4)颜色COLORREF32-bitvalueusedtospecifyanRGBcolor.例:COLORREFRGB(BYTEbRed,BYTEbGreen,BYTEBblue);2210.2.4窗口结构typedefstruct{UINTstyle;//窗口类型WNDPROClpfnWndProc;//窗口函数指针intcbClsExtra;//为类结构的预留额外空间intcbWndExtra;//为窗口结构预留额外空间HANDLEhInstance;//窗口类的应用实例句柄HICONhIcon;//图标句柄HCURSORhCursor;//窗口类的光标HBRUSHhbrBackground;//窗口类的背景刷LPCTSTRlpszMenuName;//菜单资源名LPCTSTRlpszClassName;//窗口类名}WNDCLASS;2310.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带垂直滚动条的窗口241、消息结构:MSGtypedefstructtagMSG{HWNDhwnd;//消息发向的窗口句柄UINTmessage;//消息标识符WPARAMwParam;//16位的消息参数,值因消息异LPARAMlParam;//32位的消息参数,值因消息异DWORDtime;//消息放入消息队列的时间POINTpt;//消息放入消息队列的鼠标位置}MSG;说明:WPARAM含义和数值因消息不同而不同比如:键盘消息和鼠标消息所对应的WPARAM消息所代表的消息是不同的。10.2.5消息2510.2.5消息2、MSG中的域说明hwnd是一个窗口句柄,用于标识消息发向的窗口。time用于保存消息放进消息队列的时间。pt用于保存将消息放入消息队列时的鼠标位置。message是消息标识符,它是一个32位的无符号整数。Windows中的每条消息都有一个对应的消息标识符,这些标识符是在windows.h中定义的。263、消息的种类标准Windows消息除WM_COMMAND外,所有以WM_为前缀的消息,由窗口和视图处理。控制消息由控件和子窗口发给父窗口的消息。命令消息来自用户接口对象。如:菜单、工具条和加速键等。10.2.5消息2710.2.5消息4、常见消息前缀的含义BM表示按钮控制消息CB组合框控制消息EM编辑框控制消息LB列表控制消息SBM滚动条控制消息WM窗口消息2810.2.5消息5、Windows常用鼠标消息WM_LBUTTONDBLCLKWM_LBUTTONDOWNWM_LBUTTONUPWM_MBUTTONDBLCLK