VisualC++程序设计张淼哈尔滨工业大学(威海)计算机学院计算机科学与技术学院张淼2课程安排授课30学时实验16学时考试平时成绩15%实验成绩15%考试70%计算机科学与技术学院张淼3VisualC++到底是什么?计算机科学与技术学院张淼4回顾C语言自产生以来,出现了许多C语言的集成开发环境,如TurboC、BorlandC等,在这些集成开发环境中,程序员可以将代码的编辑、编译、连接、执行和调试过程全部完成。回顾计算机科学与技术学院张淼5知新面向对象的程序设计语言C++产生之后,又出现了BorlandC++、C++Builder和VisualC++等针对C++语言的集成开发环境。虽然这些C++集成开发环境是针对C++语言的,而且增加了许多其它特性,然而单就C程序来讲,如果符合ANSIC的标准,在这些集成环境中都能够很好地编译和连接。计算机科学与技术学院张淼6知新VisualC++是C++语言的可视化集成开发环境。C++是程序设计语言,VisualC++是工具。计算机科学与技术学院张淼7VC++主要是用来开发Windows应用程序的。Windows程序设计不同于DOS下的程序设计,它是一种事件驱动的程序设计模式,主要是基于消息的。知新计算机科学与技术学院张淼8Windows应用程序MicrosoftWindows是一种基于图形用户界面的多任务操作系统。系统中可以同时运行多个应用程序。每个Windows应用程序通过各自的“窗口”与用户进行交互。应用程序的用户界面单文档用户界面多文档对话框消息驱动的程序结构计算机科学与技术学院张淼9计算机科学与技术学院张淼10VisualC++Windows环境下最主要的应用开发系统之一。C++语言的可视化集成开发环境。强大的调试功能为大型复杂软件的开发提供了有效的排错手段。计算机科学与技术学院张淼11创建Windows应用程序使用VC++进行Windows应用程序设计时,有两种方法:一是使用PlatformSDK,另一种方法是直接使用Microsoft提供的MFC类库。计算机科学与技术学院张淼12创建Windows应用程序PlatformSDK(softwaredevelopkit):使用C/C++语言和Win32API(ApplicationProgrammingInterface,应用程序编程接口)函数进行编程。MFC:使用C++语言和MFC(微软基础类库)进行编程.计算机科学与技术学院张淼13创建Windows应用程序SDKMFC简单、易于理解工作量大、效率低复杂,代码可读性差工作量小,效率高计算机科学与技术学院张淼14创建Windows应用程序SDK编程方式易于理解Windows工作原理。通过了解相对已“过时”的WindowsSDK编程,有助于理解以后的很多东西!计算机科学与技术学院张淼15VC++开发Windows应用程序必须跨越的四大技术障碍(MFC方式)面向对象观念与C++语言Windows程序基本观念MicrosoftFoundationClasses(MFC)本身VisualC++集成开发环境与各种开发工具(难度不高,但需熟练)创建Windows应用程序计算机科学与技术学院张淼16课程安排学时安排30学时课程内容Windows编程基础4学时C++语言和面向对象程序设计(设计模式)23学时MFC(MicrosoftFoundationClasses)3学时安全编程计算机科学与技术学院张淼17参考书籍C++编程思想(第2版)BruceEckel,机械工业出版社C++PrimerStanleyB.Lippman,JoseeLajoie,中国电力出版社Windows程序设计(第5版)CharlesPetzold,北京大学出版社MFCWindows程序设计(第2版)JeffProsise,清华大学出版社计算机科学与技术学院张淼18参考书籍深入浅出MFC(第二版)侯俊杰,华中科技大学出版社VisualC++技术内幕GeorgeShepherd,DavidKruglinski,清华大学出版社深入解析MFC(MFCInternals)GeorgeShepherd,中国电力出版社VC++深入详解孙鑫,余安平,电子工业出版社计算机科学与技术学院张淼19第一部分Windows编程基础计算机科学与技术学院张淼20Windows编程基础Windows程序内部运行原理SDK方式编写Windows应用程序Windows应用程序特性计算机科学与技术学院张淼21CH1.1Windows程序内部运行原理目标:理解Windows程序的运行机制掌握以下基本概念窗口WindowsAPI消息与消息机制消息响应句柄计算机科学与技术学院张淼22Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系应用程序操作系统输入输出设备③④①②消息队列计算机科学与技术学院张淼23WindowsAPI操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用(Systemcall),这些函数的集合就是Windows操作系统提供给应用程序编程的接口(ApplicationProgrammingInterface),简称WindowsAPI。计算机科学与技术学院张淼24WindowsAPIWindowsAPI的作用是Windows系统与Windows应用程序间的标准程序接口Windows应用程序可以利用标准大量API函数调用系统功能窗口管理函数:实现窗口的创建、移动和修改功能系统服务函数:实现与操作系统有关的多种功能图形设备(GDI)函数:实现与设备无关的图形操作功能计算机科学与技术学院张淼25Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系应用程序操作系统输入输出设备③④①②消息队列计算机科学与技术学院张淼26消息响应操作系统能够感知输入设备的变化(事件),并且能够知道具体的事件情况,但操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。对事件作出反应的过程就是消息响应。计算机科学与技术学院张淼27消息操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。计算机科学与技术学院张淼28消息结构体MSG结构定义如下:typedefstructtagMSG{HWNDhwnd;//窗口句柄UINTmessage;//主消息WPARAMwParam;//附加消息LPARAMlParam;DWORDtime;//送至队列的时间POINTpt;//消息发送时屏幕光标的位置}MSG,*PMSG;计算机科学与技术学院张淼29Windows对象Windows窗口是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。WindowsObject是Windows系统的内部结构,是Windows的规范部件,包括各种窗口、菜单、按钮、对话框以及程序模块等,通过一个句柄来引用。计算机科学与技术学院张淼30句柄(Handle)句柄(HANDLE),Windows用来标识被应用程序建立或使用的Windows对象的一个唯一的整数值。操作系统要管理和操作这些Windows对象(资源),都是通过句柄来找到对应的对象。按Windows对象的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号(整数值)即窗口句柄。计算机科学与技术学院张淼31消息结构体typedefstructtagMSG{HWNDhwnd;//窗口句柄UINTmessage;//主消息WPARAMwParam;//附加消息LPARAMlParam;DWORDtime;//送至队列的时间POINTpt;//消息发送时屏幕光标的位置}MSG,*PMSG;计算机科学与技术学院张淼32主消息由事先定义好的消息名标识采用不同的前缀符号来区别能够解释和处理消息的窗口类型WM_窗口消息BM_按钮控制消息CB_组合框控制消息DM_默认下压式按钮控制消息EM_编辑控制消息LB_列表框控制消息SMB_滚动条控制消息计算机科学与技术学院张淼33附加消息与主消息有关wParamlParam计算机科学与技术学院张淼34从变量的类型区分变量的用途intx,y;x=50;y=30;//x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重等等。typedefintWIDTHtypedefintHEIGHTWIDTHx;HEIGHTy;//好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。计算机科学与技术学院张淼35消息结构体typedefstructtagMSG{HWNDhwnd;//窗口句柄UINTmessage;//主消息WPARAMwParam;//附加消息LPARAMlParam;DWORDtime;//送至队列的时间POINTpt;//消息发送时屏幕光标的位置}MSG,*PMSG;计算机科学与技术学院张淼36消息结构体对于MSG这个结构体来说,它里面包含的信息是相当丰富的,它包含了对于一个消息来说,它和哪一个窗口相关,这个消息本身是什么,这个消息的附加参数是什么,消息发生投递的时间是什么。我们拿到这样一个消息就像当全面了。那么我们就知道应该做什么样的处理。计算机科学与技术学院张淼37Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系应用程序操作系统输入输出设备③④①②消息队列计算机科学与技术学院张淼38消息队列对于每一个应用程序,操作系统会给它建立一个消息队列。这个队列实际上是一个先进先出的缓冲区,通常是一个某种变量类型的数组。消息队列中的每个元素都是一条消息。操作系统将生成的每个消息按先后顺序放进消息队列中。应用程序总是依次取走队列里的第一条消息。应用程序取走消息后便能够知道用户的操作和程序状态的变化,从而对特定的消息进行处理(编写代码)——消息响应。计算机科学与技术学院张淼39计算机科学与技术学院张淼40应用程序获得的消息进队消息进队消息是由Windows放入程序的消息队列中的不进队消息不进队消息直接发送给窗口过程计算机科学与技术学院张淼41CH1.2SDK方式编写Windows应用程序目标:能够用SDK(WindowsAPI+C/C++)编写一个简单的Windows应用程序,通过编写程序掌握Windows程序的运行原理及编写方式。为MFC的学习打下基础。掌握以下基本知识:Windows应用程序基本结构计算机科学与技术学院张淼42程序执行的起点(入口函数)?main()WinMain()计算机科学与技术学院张淼43WinMain函数Windows程序的入口函数intWINAPIWinMain(HINSTANCEhInstance,//handletocurrentinstanceHINSTANCEhPrevInstance,//handletopreviousinstanceLPSTRlpCmdLine,//commandlineintnCmdShow//showstate);计算机科学与技术学院张淼44匈牙利表示法一种命名约定匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。为纪念Microsoft程序员CharlesSimonyi所使用的命名约定计算机科学与技术学