1程序设计实践徐前方xuqianfang@bupt.edu.cnWindows编程基础知识2内容提要1、Windows编程概述2、基本概念3、Windows程序基本结构4、程序示例31Windows编程概述Windws编程在微软的Windows操作系统下编程使用的工具微软公司和其他公司(Boland等)在该操作系统下提供了了很多可视化的开发系统平台,如VC++、VB、BC、Delphi等。我们使用VC++41Windows编程概述可视化开发系统(资源和工具的集成)源程序编辑器编译器调试工具•语法检查•程序修改•运行监视应用程序Help和Setup开发工具函数库和系统函数开发工具资源管理器各种窗口和控件的编辑器例程库及Help其他功能51Windows编程概述一个简单的Windows程序#includewindows.hintCALLBACKWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){//产生一个问候小窗口MessageBox(NULL,HelloWorld!,SayHello,MB_OK);return1;}61Windows编程概述Windows程序特点图形用户界面(窗口)统一、友好独立于设备的图形操作(GUI)支持多任务机制(多线程)事件驱动的程序设计(消息队列机制)程序和资源分开、资源共享支持应用程序间的数据交换(剪贴板等)71Windows编程概述开发面向对象应用程序的方法传统方法:使用Windows提供的API交互式方法:使用Microsoft提供的MFC类库API(ApplicationProgrammingInterface)Windows系统和Windows应用程序间的标准程序接口主要分三类:窗口管理函数,图形设备函数,系统服务函数MFC类库集成了大量已经预先定义好的类81Windows编程概述基于DOS与基于Windows应用程序区别基于DOS:使用顺序的过程驱动方法例:计算平均成绩启动输入姓名输入第一次测试成绩输入第二次测试成绩输入第三次测试成绩计算平均成绩结束程序能直接控制程序事件或过程的顺序91Windows编程概述基于DOS与基于Windows应用程序区别基于Windows:使用事件驱动方法例:计算平均成绩程序由事件的发生来控制启动消息处理结束输入姓名输入第一次成绩输入第二次成绩输入第三次成绩计算平均成绩101Windows编程概述Windows应用程序重要概念:窗口的概念事件驱动的概念句柄消息11内容提要1、Windows编程概述2、基本概念窗口事件驱动句柄消息3、Windows程序基本结构4、程序示例122基本概念Windows应用程序重要概念:窗口事件驱动句柄消息132基本概念——窗口窗口——Windows程序界面的主要组成控制菜单框窗口边界工作区下拉菜单水平滚动条垂直滚动条最大化按钮最小化按钮标题栏142基本概念——窗口窗口功能系统对应用程序管理的基本单位应用程序与用户之间交互的接口环境Window应用程序基本的操作单元Windows应用程序编程设计窗口:WNDCLASS创建窗口:createWindowWindows应用程序运行窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与交换的过程背景颜色、窗口号、光标、图标、名字等152基本概念Windows应用程序重要概念:窗口事件驱动句柄消息162基本概念——事件驱动事件——系统运行时发生的事情事件的产生方式通过输入设备,如键盘和鼠标;通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件;来自Windows内部,如当一个后面的窗口显示到前面来时。事件的结果系统以消息的形式记录事件的结果即消息172基本概念——事件驱动Windows是基于消息的事件驱动Windows应用程序是按照“事件→消息→处理”非顺序的机制运行的。例:将消息传递给窗口函数的相应过程处理消息队列Windows将产生的消息某一事件按下鼠标182基本概念Windows应用程序重要概念:窗口事件驱动句柄消息192基本概念——句柄句柄是整个Windows编程的基础句柄的作用:Windows程序中,有各种各样的资源(窗口、图标、光标等),操作系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,可将句柄分为不同类型句柄是一个4字节长的数值用于标识应用程序中不同的对象和同类对象中不同的实例202基本概念——句柄常用句柄类型HWND窗口句柄HINSTANCE当前实例句柄HCURSOR光标句柄HFONT字体句柄HPEN画笔句柄HBRUSH画刷句柄HDC设备环境句柄HICON图标句柄HMENU菜单句柄HFILE文件句柄句柄所标识对象实例窗口按钮图标滚动条输出设备控件文件程序进程等等…...212基本概念——句柄数据类型别名intx,y;x=30;y=30;//x和y表示坐标,宽度和高度等改进typedefintWIDTHtypedefintHEIGHTWIDTHx;HEIGHTy;可读性不好222基本概念——句柄数据类型别名Windows应用程序中的数据量非常大,为了提高应用程序的可读性,Windows给许多基本数据类型定义了别名,例如:typedefvoid*HANDLE;typedefunsignedlongDWORD;typedefintBOOL;typedefunsignedcharBYTE;typedefunsignedshortWORD;232基本概念Windows应用程序重要概念:窗口事件驱动句柄消息242基本概念——消息消息——应用程序与系统及其它应用程序进行信息交换的数据结构消息的结构typedefstructtagMSG{HWNDhwnd;//窗口句柄UINTmessage;//消息号(WM_XXX),区别不同消息的常量WPARAMwParam;//消息的附加信息LPARAMlParam;//消息的附加信息DWORDtime;//消息创建的时间POINTpt;//消息创建时的屏幕光标位置}MSG;252基本概念——消息消息的分类WM——窗口消息BM——按钮控制消息CB——组合框控制消息DM——默认下压式按钮控制消息EM——编辑控制消息LB——列表框控制消息SBM——滚动条控制消息262基本概念——消息常见的消息272基本概念——消息消息队列Windows为所有的应用程序维护一个消息队列应用程序必须从消息队列中获取消息,然后分派给某个窗口。消息循环应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。282基本概念——消息窗口过程每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后响应。窗口过程是一个回调函数,处理了一个消息后,它通常要返回一个值给Windows。292基本概念——消息消息系统Windows系统消息队列是否需要处理?提取消息处理消息默认窗口函数事件消息是否应用程序应用程序消息队列302基本概念——消息消息处理过程(产生-响应)系统中发生了某个事件Windows把这个事件翻译为消息,然后把它放到消息队列中。应用程序从消息队列中接收到这个消息,把它存放在MSG中。应用程序把消息传递给一个适当的窗口过程。窗口过程响应这个消息并进行处理。31内容提要1、Windows编程概述2、基本概念3、Windows程序基本结构程序入口函数窗口过程函数4、程序示例323Windows程序基本结构程序入口函数WinMain函数原型窗口初始化(1、窗口类定义,2、注册窗口类,3、创建窗口,4、显示窗口)消息循环窗口过程函数函数原型消息响应1、函数原型2、窗口初始化3、消息循环4、窗口过程函数333Windows程序基本结构——WinMain函数原型WinMain函数原型intWINAPIWinMain(HINSTANCEhInstance,//当前实例句柄HINSTANCEhPrevInst,//先前实例句柄LPSTRlpszCmdLine,//指向应用程序命令行参数的指针intnCmdShow//初始窗口显示方式的整数值标识)同一应用程序可能同时存在多个窗口,系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识343Windows程序基本结构——WinMain函数初始化WinMain函数初始化窗口类的定义:设置光标、图标、背景等注册窗口类创建窗口显示和更新窗口353Windows程序基本结构——WinMain函数初始化窗口类的定义——设计窗口类typedefstruct_WNDCLASS{UINTstyle;//窗口变化时重画方式WNDPROClpfnWndProc;//窗口过程类型intcbClsExtra;//类的附加信息intcbWndExtra;//窗口附加信息HANDLEhInstance;//当前应用程序实例号HICONhIcon;//图标句柄HCURSORhCursor;//加载的光标类型HBRUSHhbrBackground;//窗口的背景画刷句柄LPCTSTRlpszMenuName;//设置菜单LPCTSTRlpszClassName;//窗口类名字}WNDCLASS;363Windows程序基本结构——WinMain函数初始化窗口类的定义WNDCLASSwintest;wintest.cbClsExtra=0;//类的附加信息,通常为0wintest.cbWndExtra=0;//窗口的附加信息,通常为0wintest.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);wintest.hCursor=LoadCursor(NULL,IDC_CROSS);//光标句柄wintest.hIcon=LoadIcon(NULL,IDI_ERROR);//图标句柄wintest.hInstance=hInstance;//当前应用程序实例号wintest.lpfnWndProc=WndProc;//窗口过程wintest.lpszClassName=“winTest”;//窗口类名字wintest.lpszMenuName=NULL;//菜单名字wintest.style=CS_HREDRAW|CS_VREDRAW;//水平/垂直重画373Windows程序基本结构——WinMain函数初始化wintest.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);常用窗口样式标识说明BLACK_BRUSH黑色画刷DKGRAY_BRUSH暗灰色画刷GRAY_BRUSH灰色画刷笔LTGRAY_BRUSH亮灰色画刷NULL_BRUSH空画刷WHITE_BRUSH白色画刷HOLLOW_BRUSH虚画刷383Windows程序基本结构——WinMain函数初始化wintest.hCursor=LoadCursor(NULL,IDC_CROSS);常用窗口样式标识说明IDC_APPSTARTING标准的箭头和小沙漏IDC_CROSS十字光标IDC_ARROW标准的箭头IDC_HELP标准的箭头和问号IDC_IBEAM工字光标IDC_NO禁止圈IDC_SIZEALL四向箭头指向东、西、南、北IDC_UPARROW垂直箭头IDC_WAIT沙漏393Windows程序基本结构——WinMain函数初始化wintest.hIcon=LoadIcon(NULL,IDI_ERRO