Windows编程基础知识内容提要1Windows编程概述2基本概念3Windows程序基本结构4程序示例§1.1.Windows编程概述1Windows编程Windws编程在微软的Windows操作系统下编程使用的工具微软公司和其他公司(Boland等)在该操作系统下提供了了很多可视化的开发系统平台,如VC++、VB、BC、Delphi等。我们使用VC++1Windows编程(续)可视化开发系统(资源和工具的集成)源程序编辑器编译器调试工具•语法检查•程序修改•运行监视应用程序Help和Setup开发工具函数库和系统函数开发工具资源管理器各种窗口和控件的编辑器例程库及Help其他功能2Windows程序特点Windows程序特点1.图形用户界面(窗口)统一、友好2.独立于设备的图形操作(GUI)3.支持多任务机制(多线程)4.事件驱动的程序设计(消息队列机制)5.程序和资源分开、资源共享6.支持应用程序间的数据交换(剪贴板等)2Windows程序特点(续)一个简单的Windows程序#includewindows.hintCALLBACKWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){//产生一个问候小窗口MessageBox(NULL,“HelloWorld!”,“SayHello”,MB_OK);return1;}3Windows程序设计方法传统式写法使用C语言语法规范的API函数(ApplicationProgrammingInterface)交互式写法使用C++语法规范的MFC类库(MicrosoftFoundationClass)其他写法使用模板技术等的ATL模板库(ActiveXTemplateLibrary)和组件技术等§1.2.基本概念1Windows程序及对象Windows应用程序使用的界面是由各种图形元素组成的图形界面各个图形元素具有不同的功能应用程序的用户主要是通过键盘和鼠标对应用程序界面上的图形元素进行操作来与Windows应用程序进行交互的1Windows程序及对象(续)在Windows程序(系统)中,存在着许多与DOS应用程序不同的复杂对象对象和句柄Windows的程序中,对象是具有规范形态和操作模式的部件,例如窗口、按钮、滚动条等;Windows把为这种复杂对象所定义的标识叫做句柄,应用程序过句柄访问相应的对象信息。句柄实际上在C/C++中实现为指针(或认为其一个长度为4字节长整数值)1Windows程序及对象(续)常用句柄类型HWND窗口句柄HINSTANCE当前实例句柄HCURSOR光标句柄HFONT字体句柄HPEN画笔句柄HBRUSH画刷句柄HDC设备环境句柄HICON图标句柄HMENU菜单句柄HFILE文件句柄句柄所标识对象实例窗口按钮图标滚动条输出设备控件文件程序进程如此等等…...2数据类型别名Windows应用程序中的数据量非常大,为了提高应用程序的可读性,Windows给许多基本数据类型定义了别名,例如:typedefvoid*HANDLE;typedefunsignedlongDWORD;typedefintBOOL;typedefunsignedcharBYTE;typedefunsignedshortWORD;2数据类型别名(续)Windows应用程序还使用了一些结构类型的数据,例如:typedefstructtagPOINT{LONGx,y;}POINT;//描述了一个点的位置。3窗口及其功能窗口——Windows程序界面的主要组成典型窗口及其构成控制菜单框窗口边界工作区下拉菜单水平滚动条垂直滚动条最大化按钮最小化按钮标题栏3窗口及其功能(续)窗口功能1系统对应用程序管理的基本单位2应用程序与用户之间交互的接口环境3Window应用程序基本的操作单元Windows应用程序编程创建一个或多个窗口Windows应用程序运行窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与交换的过程4消息的概念消息——应用程序与系统及其它应用程序进行信息交换的数据结构消息的三个组成部分:消息号:由事先定义好的消息名标识字参数(wParam):提供消息的附加信息长字参数(lParam):提供消息的附加信息附加信息与具体消息号的值有关4消息的概念(续)消息的结构typedefstructtagMSG{HWNDhwnd;//窗口句柄,为null,则检索队的所有消息UINTmessage;//消息号,由Windows.h中的宏定义来标识WPARAMwParam;//消息的附加信息LPARAMlParam;//消息的附加信息DWORDtime;//指定消息送至队列的时间POINTpt;//指定消息发送时屏幕光标的位置}MSG;4消息的概念(续)系统能产生很多消息各种消息分类,分别以不同的前缀表示:WM——窗口消息BM——按钮控制消息CB——组合框控制消息DM——默认下压式按钮控制消息EM——编辑控制消息LB——列表框控制消息SBM——滚动条控制消息4消息的概念(续)常见的Windows消息有5事件及事件驱动事件——系统运行时发生的事情事件通常以以下三种方式产生:l通过输入设备,如键盘和鼠标;l通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件;l来自Windows内部,如当一个后面的窗口显示到前面来时。事件的结果系统以消息的形式记录事件的结果即消息5事件及事件驱动(续)Windows程序和系统是事件驱动的,事件驱动也称消息驱动,事件驱动模型如下:程序开始捕获消息派发消息处理消息程序结束消息源1消息源2消息源n退出消息?NY5事件及事件驱动(续)操作系统会用特定的机构管理消息消息队列作为结果的消息,系统以队列形式进行管理操作系统(软件程序)有监控机构、管理机构、通讯机构等应用程序在这些机构的管理下运行5事件及事件驱动(续)支持队列特征的消息驱动模型用户交互内核USER窗口1窗口函数WndProc消息队列窗口2窗口函数WndProc消息队列6API函数Windows提供了大量预定义的用C语言编写的函数和数据结构集合,该集合叫API(ApplicationProgrammingInterface)早期的Windows应用程序设计人员要使用相应的API函数来编写程序。类型别名和MSG等结构都包含在API中6API函数(续)根据WindowsAPI函数的功能,可以将其分为三类:1)管理函数:实现窗口和其它对象的创建、移动和修改等功能。2)图形设备函数:实现与设备无关的图形操作功能,可以实现图形绘制。3)系统服务函数:实现与操作系统有关的多种功能,如进程线程管理、任务调度等。§1.3.Win32程序基本结构1应用程序的组成Windows程序分为“程序代码”和“UI(UserInterface)资源”两大部份所谓UI资源是指功能菜单、对话框外貌、程序图标、光标形状等一个完整的Windows应用程序通常包含如下几种类型的文件:C/C++语言源程序文件(.c或.cpp)头文件(.h)资源描述文件(.rc)模块定义文件(.def)…...1应用程序的组成(续)源程序组成源程序主要由主函数(入口函数)和窗口函数及其相关函数组成WinMain和WinProc是Win32源程序主体前者是应用程序的入口,类似main函数入口函数WinMain窗口函数WndProcWindows应用程序构成基本框架包含各种数据类型数据结构与函数等2WinMain函数三个基本的组成部分:函数说明初始化消息循环功能注册窗口类,建立窗口及初始化进入消息循环,据消息调用相应的处理过程当消息循环检索到WM_QUIT时终止程序运行2WinMain函数(续)函数(原型)说明注意!Windows操作系统是多任务管理的,同一应用程序可能同时存在多个窗口,Windows系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识它。intWINAPIWinMain(HINSTANCEhThisInst,∥应用当前实例句柄HINSTANCehPrevInst,∥应用其他实例句柄LPSTRlpszCmdLine,∥指向命令行参数的指针IntnCmdShow∥初始窗口显示方式的整数值标识)2WinMain函数(续)初始化初始化包括窗口类的定义、注册窗口类、创建窗口和显示窗口四部分。需要注意的是,在显示窗口ShowWindow函数后,需调用UpdateWindow函数更新并绘制用户区,并发出WM_PAINT消息。2WinMain函数(续)消息循环应用程序通常有一段代码称为消息循环,又称为消息泵,它是程序的动力结构,形式如下MSGmsg;//从消息队列中提取消息while(GetMessage(&msg,NULL,NULL,NULL)){TranslateMessage(&msg);//消息解释,如字符键的处理DispatchMessage(&msg);//将消息传送到指定窗口函数}//以上出现的函数都是WindowsAPI函数2WinMain函数(续)消息循环中:函数GetMessage形式为:GetMessage(lpMSG,//指向MSG结构的指针hwnd,nMsgFilteMin,//用于消息过滤的最小消息号值nMsgFilterMax//用于消息过滤的最大消息号值)GetMessage从消息队列中读取消息,并将消息放在MSG结构中,返回零值,即检索到WM_QUIT消息,程序结束循环并退出2WinMain函数(续)DispatchMessage函数该函数负责将消息分发给窗口函数(可以理解为其用指针间接调用了窗口过程函数)在窗口产生过程中,要使用函数指针为窗口联系一个函数(通常为WndProc)WndProc窗口函数是程序和用户交互的主要处理部分!3窗口函数WinProcWndProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。WndProc包含了对各种可能接收到的消息的处理过程定义了应用程序对接收到的不同消息的响应窗口函数的一般形式如下:LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessgae,WPARAMwParam,LPARAMlParam){…switch(message)∥message为标识的消息{case……break;…caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wParam,lParam);}return(0);}在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数:voidPostQuitMessage(intnExitCode)//nExitCode为应用程序的退出代码为未定义处理过程的消息提供缺省处理4程序与系统之间的关系操作系统监控机构感知事件并产生消息系统将消息发给活动窗口消息队列应用程序拥有一个消息队列程序处理过程:消息泵获得消息GetMessage,然后分发消息DispatchMessage给窗口过程WndProc(函数调用过程)作相应处理返回,接下来再获取消息,如此循环重复,直到GetMessage检到WM_QUIT消息返回0值。4程序与系统之间的关系(续)§1.4.完整程序示例应用程序举例#includewindows.h//包含应用程序中所需的数据类型和数据结构的定义LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明//--------