《C的Windows编程基础实用.pptx》由会员分享,可在线阅读,更多相关《C的Windows编程基础实用.pptx(105页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、窗口和程序窗口是Windows本身以及Windows 环境下的应用程序的基本界面单位。很多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫窗口。其实窗口的概念很广,例如按钮和对话框等也是窗口,只不过是一种特殊的窗口。第1页/共105页窗口窗口(Window)由句柄唯一标识。Windows程序的基本操作单元。系统管理应用程序的基本单位。应用程序与用户交互的接口环境。应用程序的运行就是窗口内部、窗口之间、窗口与系统之间数据处理与交换的过程。一个Windows程序至少有一个窗口。第2页/共105页窗口的组成应用程序应用程序的主窗口的主窗口窗口窗口窗口窗口窗口窗口窗口窗口窗口窗口
2、第3页/共105页窗口的组成窗口是屏幕上的一个矩形区域应用程序在该区域中显示数据并等待鼠标点击Windows应用系统的用户界面可以包含许多窗口每个窗口都有不同的特点,但都是互相联系的第4页/共105页三种类型的窗口在这么多窗口中,基本类型只有三种:重叠(Overlapped)窗口弹出(Popup)窗口子(Child)窗口在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的第5页/共105页三种类型的窗口重叠窗口通常用于建立应用程序主窗口。事实上,有时也叫做“主”窗口或者“框架”窗口弹出窗口通常以对话框和消息框的形式与用户对话子窗口通常用在视图(View)中,如在文本编辑器
3、中的文本显示,也用在控件中,如在对话框中的OK按钮而对那些看起来像按钮或控件的子窗口,也称为“控件”窗口第6页/共105页三种窗口组成的应用程序属于桌面的重叠窗属于桌面的重叠窗口,也称主窗口口,也称主窗口主窗口的子窗口主窗口的子窗口主窗口的主窗口的子窗口子窗口主窗口的主窗口的弹出窗口弹出窗口弹出窗口弹出窗口的子窗口的子窗口第7页/共105页三种类型的窗口主要区别重叠窗口和弹出窗口弹出窗口出现时可以没有标题(也称为标题栏)子窗口与重叠窗口、弹出窗口子窗口只能出现在另一个窗口中,并且子窗口的任何多余部分都被该窗口移去或剪切掉另外,子窗口是唯一不能有菜单条的窗口第8页/共105页程序通常说的程序都是
4、指一个能让计算机识别的文件。接触得最多的是以exe或者com作为扩展名的文件。第9页/共105页进程与线程进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。一个以exe作为扩展名的文件,在没有被执行的时候称之为应用程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行了。当关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。第10页/共105页Windows任务管理器进程第11页/共105页线程线程是进程的一个执行单元。同一个进程中的各个线程对应于一组CP
5、U指令、一组CPU寄存器以及一个堆栈。进程本来就具有动态的含义,是通过线程来体现的。第12页/共105页Windows应用程序,操作系统,计算机硬件之间的相互关系 应用程序 操作系统 输入输出设备 消息队列 向下的箭头1表示操作系统能够操纵输出设备,以执行特定的功能,如让声卡发出声音,让显卡画出图形。向上的箭头2表示操作系统能够感知输入设备状态的变化,如鼠标移动,键盘按下,并且能够知道鼠标移动的具体位置,键盘按下的哪个字符。这就是操作系统和计算机硬件之间的交互关系,应用程序开发者通常不需知道其具体实现细节。第13页/共105页API与SDKAPI是英文Application Programmi
6、ng Interface 的缩写,意思是“应用程序接口”,泛指系统为应用程序提供的一系列函数接口在编程时可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了SDK是英文Software Development Kit的缩写,意思是“软件开发工具包”微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等第14页/共105页关于API 向下的箭头表示应用程序可以通知操作系统执行某个具体的动作。如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。第15页/共105页关于API 应用程序是如何通知操作系
7、统执行某个功能的呢?在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是Windows操作系统提供给应用程序编程的接口Windows API。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。第16页/共105页事件及消息事件(Event)是对计算机操作的动作。每个
8、事件对应一个消息,即每个事件发生的效果是产生消息。消息(Message)是描述事件发生的信息。比如:按键事件按下键的消息、字符消息和键弹起的消息程序执行的顺序取决于事件发生的顺序,但是消息的产生并不要求有次序之分。第17页/共105页消息(Message)向上的箭头表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件
9、,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。对事件作出反应的过程就是消息响应。第18页/共105页消息(Message)消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息。鼠标被移动会产生WM_MOUSEMOVE消息;鼠标左键被按下会产生WM_LBUTTONDOWN的消息;鼠标右键按下便产生WM_RBUTTONDOWN消息等。第19页/共105页消息的功能功能帮助Windows实现多任务。通知应用程序某一事件已经发生,各应用程序给予响应。第20页/共105页消息的组成 操作系统是怎样将感知到的事件传
10、递给应用程序呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。消息的组成:消息号字参数长字参数n消息号事先定义好。n字参数(wParam)长字参数(lParam)提供附加信息,含义和具体消息号相关。第21页/共105页典型的消息结构typedef struct tagMSG HWND hwnd;/接收窗口 UINT message;/消息标识 WPARAM wParam;/附加信息 LPARAM lParam;/附加信息 DWORD time;/发送时间 POINT pt;/鼠标位置 MSG,*PMSG;/vci
11、ncludewtypes.h第22页/共105页句柄(HANDLE)句柄(HANDLE):资源的标识。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。第23页/共105页句柄句柄是一个指针通过句柄就可以控制该句柄指向的对象编写程序总是要和各种句柄打交道的句柄(handle)是一个4字节长的整数值是系统用于表示应用程序中不同的对象和同类对象中不同的实例。如一个窗口、按钮、
12、图标、菜单等这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。第24页/共105页常用的句柄句柄类型句柄类型说明说明句柄类型句柄类型说明说明HWND标识窗口句柄标识窗口句柄HDC标识设备环境句柄标识设备环境句柄HINSTANCE标识当前实例句柄标识当前实例句柄HBITMAP标识位图句柄标识位图句柄HCURSOR标识光标句柄标识光标句柄HICON标识图标句柄标识图标句柄HFONT标识字体句柄标识字体句柄HMENU标识菜单句柄标识菜单句柄HPEN标识画笔句柄标识画笔句柄HFILE标识文件句柄标识文件句柄HBRUSH标识画刷句柄标识画刷句柄第25页/共105页从变量的类型区分变量的用
13、途int x,y;x=30;y=30;/x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。typedef int WIDTHtypedef int HEIGHTWIDTH x;HEIGHT y;/好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。第26页/共105页消息驱动机制DOS程序是通过调用系统的函数来获得用户输入。Windows程序则是通过操作系统发送的消息来处理用户输入在Windows操作系统环境内系统产生的动作用户运行应用程序产生的动作事件产生的消息第27页/共105页消息驱动机制Windows程序接收消息分发消息处理消息与用户进行交互与用
14、户进行交互第28页/共105页消息的分类窗口管理消息、初始化消息、输入消息、系统消息等。VC定义不同的前缀用于消息宏定义识别消息类型。BM 按钮消息CB组合框消息DM 下压按钮控制消息EM编辑框消息LB列表框消息WM 窗口消息第29页/共105页不同消息类型的取值范围消息类型消息类型取值范围取值范围系统定义消息(系统定义消息(1)0 x00000 x03ff用户定义内部消息用户定义内部消息0 x04000 x07ff系统定义消息(系统定义消息(2)0 x80000 xbfff用户定义外部消息用户定义外部消息0 xc0000 xffff第30页/共105页Windows应用程序常用消息WM_LB
15、UTTONDOWNWM_KEYDOWNWM_CREATWM_CLOSEWM_DISTORYWM_QUITWM_PAINTWM_CHAR WM_COMMAND第31页/共105页Windows应用程序常用消息窗口管理消息初始化消息输入消息系统消息剪贴板消息控制处理消息控制通知消息滚动条通知消息非用户区消息MDI消息DDE消息应用程序自定义的消息第32页/共105页消息的传递Windows系统有一个存放消息的队列。每个应用程序也有一个消息队列。Windows系统先将收到的消息存放在系统队列中。然后再分发到相应的应用程序队列中。应用程序则从自身的队列中获取消息并进行处理。第33页/共105页消息的传
16、递事件事件事件系统消息队列应用程序队列应用程序队列应用程序队列应用程序应用程序应用程序第34页/共105页一个应用程序队列WindowsInputMessageSystem QueueApplication QueueWinMain()Message LoopWindows Function第35页/共105页两个应用程序队列WindowsInputMessageSystem QueueApplication QueueApplication QueueWinMain()Mesaage LoopWindows FunctionWinMain()Mesaage LoopWindows Funct
17、ion第36页/共105页结束一个应用程序WM_DESTROYWindowsWM_QUITApplication QueueWindows FunctionApplicationWinMain()Message Loop第37页/共105页创建消息循环Windows程序至少包含两个函数:1.WinMain():必有且仅有一个2.窗口函数:每个窗口对应一个窗口函数,以响应该窗口的消息通常每个Windows 应用程序至少对应一个窗口,每个窗口都要有一个窗口函数负责处理该窗口内所发生的事件第38页/共105页创建消息循环While(GetMessage(&msg,(HWND)NULL,0,0)Tra
18、nslateMessage(&msg);/转换某些键盘消息DispatchMessage(&msg);/将消息发送给窗口过程,例程中指WndProc何时退出?/当从应用程序消息队列中检取的消息是/WM_QUIT时,则退出循环第39页/共105页投递和发送消息PostMessage和SendMessagePostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行这是个异步消息投放函数,会造成消息的滞后性SendMessage必须等待其他程序处理消息完了之后才返回,继续执行这是个同步消息投放函数,不会造成消息的滞后性但如果消息处理失败,则会造成程序停止PostMessage的
19、返回值表示PostMessage函数执行是否正确SendMessage的返回值表示其他程序处理消息后的返回值第40页/共105页投递和发送消息图示WindowsSystem QueueApplication QueueWinMain()Mesaage LoopWindows FunctionPostMessage()SendMessage()Application第41页/共105页投递和发送消息示例PostQuitMessage(nExitCode)功能:发送WM_QUIT消息给系统,以通知系统应用程序要结束。WM_QUIT消息只能用PostMessage,因为该消息将导致应用程序释放消息环
20、,也就无法返回结果。SendDlgItemMessage()功能:向对话框控件发送消息 相当于先用GetDlgItem()得到控件句柄,再 SendMessage(),是一种组合的方便方式。第42页/共105页VC6.0下三种编程方式控制台编程(DOS编程)Win32 Console ApplicationWindows API编程:Win32 ApplicationMFC编程:MFC AppWizard(exe)第43页/共105页Visual C+开发环境标题栏标题栏菜单栏菜单栏工具栏工具栏项目工作项目工作区窗口区窗口文档窗口文档窗口工具栏工具栏输出窗口输出窗口输出窗口标签输出窗口标签状态
21、栏状态栏第44页/共105页开发环境的菜单功能 File菜单中的命令主要用来对文件和项目进行操作 Edit菜单中的命令是用来使用户便捷地编辑文件内容 View菜单中的命令主要用来改变窗口和工具栏的显示方式,激活调试时所用的各个窗口等Insert菜单中的命令主要用于项目及资源的创建和添加 第45页/共105页开发环境的菜单功能 Project菜单中的命令主要用于项目的一些操作 Build菜单中的命令主要用来应用程序的编译、连接、调试、运行 Tools菜单中的命令主要用于选择或定制开发环境中的一些实用工具 Windows菜单中的命令主要用于文档窗口的操作 Visual C+提供了大量详细的帮助信息
22、 第46页/共105页File-New-ProjectsMFCAPI控制台(DOS)File菜单第47页/共105页VC6.0可以创建的项目类型项目类型项目类型说明说明项目类型项目类型说明说明ATL COM AppWizard创建创建ATL应用程序应用程序Database Project创建数据库项目创建数据库项目Win32 Dynamic-Link Library创建创建Win32动态链接库动态链接库DevStudio Add-in Wizard创建自动化宏创建自动化宏Custom AppWizard创建自定义的创建自定义的AppWizardISAPI Extension Wizard创建创
23、建Internet服务器或服务器或过滤器过滤器Makefile创建创建Make文件文件MFC ActiveX ControlWizard创建创建ActiveX控件程序控件程序MFC AppWizard(dll)创建创建MFC动态链接库动态链接库MFC AppWizard(exe)创建创建MFC可执行程序可执行程序Win32 Application创建创建Win32应用程序应用程序Win32 Console Application创建创建Win32控制台应用控制台应用程序程序Cluster Resource Type Wizard通过它可以创建两种项通过它可以创建两种项目类型(目类型(Resou
24、rce DLL和和Cluster Administrator Extension DLL)Utility Project通过它可以创建一个效通过它可以创建一个效用项目,该项目只作为用项目,该项目只作为其他子项目的一个包容其他子项目的一个包容器,减少子项目的编联器,减少子项目的编联时间,但它本身并不包时间,但它本身并不包含任何文件含任何文件Win32 Static Library创建创建Win32静态库静态库第48页/共105页File-New-Files第49页/共105页开发环境的工具栏 标准工具栏 类向导工具栏 小型编译连接工具栏工具栏的显示与隐藏、浮动与停泊 “Customize”对话框
25、方式(Tools-Customize)快捷菜单方式(任何工具栏处右击鼠标)第50页/共105页2.1 Windows程序结构第51页/共105页2.1.1 简单的Windows应用程序实例创建(演示)用AppWizard创建 理解程序框架 添加程序代码 编译运行 第52页/共105页2.1.1 简单的Windows应用程序 例Ex_HelloMsg:一个最简单的Windows应用程序。#include int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)Messa
26、geBox(NULL,你好,我的Visual C+世界!,问候,0);return 0;第53页/共105页2.1.1 简单的Windows应用程序nWindows程序的入口函数WinMain函数的原型如下:int WINAPI WinMain(HINSTANCE hInstance,/当前实例句柄HINSTANCE hPrevInstance,/以前的实例句柄LPSTR lpCmdLine,/指向命令行参数的指针int nCmdS )/窗口的显示状态 每一个Win32应用程序都需要Windows.h头文件,包含了一些Windows头文件。程序中,MessageBox是一个Win32 API函
27、数,用来弹出一个对话框窗口,显示短信息。第54页/共105页窗口的创建 创建一个完整的窗口需要经过下面四个操作步骤:设计一个窗口类;注册窗口类;创建窗口;显示及更新窗口。第55页/共105页设计窗口类typedef struct _WNDCLASS UINT style;/窗口类的类型 WNDPROClpfnWndProc;/过程函数 int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszCl
28、assName;WNDCLASS;第56页/共105页窗口类的类型 在我们的程序中经常要用到一类变量,这个变量里的每一位都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。第57页/共105页 我们使用goto definition就能发现 CS_VREDRAW=0 x0001,CS_HREDRAW=0 x0002
29、,CS_DBLCLKS =0 x0008,CS_NOCLOSE=0 x0200。他们的共同点就是只有一位为1,其余位都为0。如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性?我们只需使用二进制OR(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW|CS_HREDRAW|CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反()之后再进行与(&)运算,就能够实现,如在刚才的style的基础上去掉CS_NOCLOSE特征,可以用style&CS_NOCLOSE实现。窗口类的类型第58页/共105页窗口过程函数 第
30、二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。回调函数的原理:当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。第59页/共105页窗口过程函数举例:汽车厂
31、家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口收到消息),汽车用户(类似操作系统)自己直接找到修理站去修理,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。第60页/共105页2.1.1 简单的Windows应用程序 例Ex_HelloWin:一个较完整的Windows应用程序。与Ex_HelloMsg示例相比,Ex_HelloWin要复杂的多,可以将其分是两个基本函数的程序结构:u函数WndProc用来接收和处理各种不同的消息;uWinMain函数通常要完成以
32、下几步工作:定义并调用API函数RegisterClass注册应用程序的窗口类。调用相关API函数创建和显示窗口,并进行必要的初始化处理。其中,函数CreateWindow用来创建已注册窗口类的窗口。第61页/共105页CreateWindow函数的原型:HWND CreateWindow(LPCTSTR lpClassName,/已注册的窗口类名 LPCTSTR lpWindowName,/窗口标题 DWORD dwStyle,/窗口风格 int x,/窗口的水平位置 int y,/窗口的垂直位置 int nWidth,/窗口宽度 int nHeight,/窗口高度 HWND hWndPar
33、ent,/父窗口句柄 HMENU hMenu,/菜单句柄或控件标识 HINSTANCE hInstance,/应用程序实例句柄 LPVOID lpParam /其他窗口创建时的参数数据);第62页/共105页2.1.1 简单的Windows应用程序创建和启动应用程序的消息循环。Windows应用程序接受各种不同的消息,Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从应用程序的消息队列中消息,并将消息发送相应的客串过程函数中作进一步处理。API函数GetMessage 和DispatchMessage就是起到这样的作用。如果接收到WM_QUIT消息,则退出应用程序。第63页/
34、共105页 Windows应用程序的基本流程:第64页/共105页2.1.2 Windows编程特点 一个完整的Windows应用程序除了WinMain函数外,还包含用于处理用户动作和窗口消息的窗口函数。Windows应用程序具有的一些特性:l 消息驱动机制l 图形设备接口(GDI)l 基于资源的程序设计l 动态链接库第65页/共105页1.消息驱动机制Windows程序和控制台应用程序之间一个最根本区别,在于控制台应用程序是通过调用系统函数来获得用户输入,而Windows程序则是通过系统发送的消息来处理用户输入。2.图形设备接口(GDI)Windows提供了一个抽象的接口,称为图形设备接口(
35、Graphical Device Interface,GDI),使得用户直接利用系统的GDI函数就能方便实现图形和文本的输出,而不必关心与系统相连的外部设备的类型。2.1.2 Windows编程特点 第66页/共105页2.1.2 Windows编程特点3.基于资源的程序设计 Windows应用程序包含众多图形元素,如光标、菜单、工具栏、位图、对话框等,每一个这样的资源都用相应的标识符来区分,而且Windows内部也有预定义的资源。在Windows环境下,每一个资源元素都作为一种可以装入应用程序的资源来存放,这些资源可以被编辑、修改,也可以被其他应用程序所共享。4.动态链接库 动态链接库提供了
36、一些特定结构的函数,能被应用程序在运行过程中装入和连接。多个程序可以共享同一个动态链接库,动态链接库可以提高程序模块的灵活性。第67页/共105页 Windows提供了丰富的应用程序可调用的函数,大多数用于实现其用户界面和在屏幕显示的文本和图形,都是通过动态链接库来实现的。在Windows操作系统中,最主要的DLL有KERNEL32.DLL、GDI32.DLL和USER32.DLL。KERNEL32.DLL用来处理存储器低层功能、任务和资源管理等Windows核心服务;GDI32.DLL提供图形设备接口,管理用户界面和图形绘制,包括Windows元文件、位图、设备描述表和字体等;USER32.
37、DLL负责窗口的管理,包括消息、菜单、光标、计时器及其它与控制窗口显示相关的一些功能。2.1.2 Windows编程特点第68页/共105页2.1.3 Windows常用的基本数据类型 Windows所数据类型对应的基本数据类型说明BOOLbool布尔值布尔值BSTRunsigned short*32位字符指针位字符指针BYTEunsigned char8位无符号整数位无符号整数COLORREFunsigned long用作颜色值的用作颜色值的32位值位值DWORDunsigned long32位无符号整数,段地址和相关的偏移地址位无符号整数,段地址和相关的偏移地址LONGlong32位带符号
38、整数位带符号整数LPARAMlong作为参数传递给窗口过程或回调函数的作为参数传递给窗口过程或回调函数的32位值位值LPCSTRconst char*指向字符串常量的指向字符串常量的32位指针位指针LPSTRchar*指向字符串的指向字符串的32位指针位指针LPVOIDvoid*指向未定义类型的指向未定义类型的32位指针位指针LRESULTlong来自窗口过程或回调函数的来自窗口过程或回调函数的32位返回值位返回值UINTunsigned int32位无符号整数位无符号整数WORDunsigned short16位无符号整数位无符号整数WPARAMunsigned int当作参数传递给窗口过程
39、或回调函数的当作参数传递给窗口过程或回调函数的32位值位值第69页/共105页2.1.3 Windows基本数据类型说明:n 这些基本数据类型都是用大写字符来表示,以与一般C+基本数据类型相区别。n 数据类型的前缀是P或LP,表示是一个指针或长指针数据类型。前缀是U,表示无符号数据类型,等等。n Windows还提供一些宏来处理上述基本数据类型。第70页/共105页2.2 Windows简单编程第71页/共105页2.2.1 绘制文本 Windows窗口通常有标题栏和边框,其中默认背景色为白色区域称为窗口的客户区。当客户区内容发生变化时,此时客户区变成了“无效区域”或“更新区域”,Window
40、s就会将WM_PAINT消息放在应用程序的消息队列中,通过在窗口过程函数中对WM_PAINT消息的判断处理,就可对客户区进行图形和文本的绘制。例Ex_WinText 文本绘制第72页/共105页2.2.1 绘制文本TextOut函数是用来显示文本的最常用的GDI函数,有下列原型:case WM_PAINT:hdc=BeginPaint(hwnd,&ps);TextOut(hdc,10,10,str,strlen(str);EndPaint(hwnd,&ps);return 0;绘制文本时需要先调用BeginPaint函数,用来返回指定窗口句柄的设备描述表句柄,设备描述表用来将程序与计算机外部输
41、出设备连接起来。hdc定义的是句柄HDC变量,TextOut等GDI函数都要通过这样的HDC句柄来绘制图形和文本。EndPaint用来释放设备描述表句柄,并使先前无效区域变为有效,从而使Windows不再发送WM_PAINT消息。第73页/共105页2.2.1 绘制文本PAINTSTRUCT是“绘图信息结构”,BeginPaint和EndPaint函数都需要PAINTSTRUCT结构变量作为自己的参数。BeginPaint和EndPaint函数必须成对出现,所有GDI函数的调用也应在这两个函数之间进行。TextOut函数是用来显示文本的最常用的GDI函数,原型如下:BOOLTextOut(HD
42、Chdc,/设备描述表句柄intnXStart,/文本显示的水平起始位置intnYStart,/文本显示的垂直起始位置LPCTSTRlpString,/要显示的文本intcbString/要显示的文本长度第74页/共105页2.2.2 使用控件 控件是在系统内部定义的用于和用户交互的基本单元,它常用于对话框中。在Win32应用程序中,可在窗口基础上通过CreateWindow函数来创建一个控件窗口。例Ex_WinControl 控件的使用(P38)第75页/共105页2.3 MFC编程基础第76页/共105页2.3.1 MFC概述 为了帮助用户处理那些经常使用且复杂繁琐的各种Windows操作
43、,Visual C+设计了一套基础类库MFC(Microsoft Foundation Library)。MFC把传统的Windows编程规范中的大多数内容封装成为各种类,提高了编程和代码效率。第77页/共105页MFC类的基本层次结构CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd第78页/共105页2.3.2 设计一个MFC程序 例Ex_HelloMFC 一个MFC应用程序。(1)创建一个“An empty project”类
44、型的Win32 Application(Win32 应用程序)项目Ex_HelloMFC。(2)选择“文件”“新建”。(3)建立C+Source File文件,并输入代码。(4)选择“工程”“设置”菜单命令,在出现的对话框中选择“General”标签。然后在“Microsoft Foundation Classes”组合框中,选择“Use MFC in a Shared DLL”。单击OK按钮。(5)程序运行后,单击鼠标左键,就会弹出一个对话框,结果同Ex_HelloWin。第79页/共105页2.3.3 理解程序代码 1.程序运行机制 MFC是使用afxwin.h来代替头文件windows.
45、h,在Ex_HelloMFC程序中看不到Windows应用程序所必须的程序入口函数WinMain,因为MFC将它隐藏在应用程序框架内部了。当用户运行应用程序时,Windows会自动调用应用程序框架内部的WinMain函数,并自动查找该应用程序类CHelloApp的全局变量theApp,然后自动调用CHelloApp的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。第80页/共105页 首先执行的是:m_pMainWnd=new CMainFrame();该语句用来创建从CFrameWnd类派生而来的用户框架窗口CMainFrame类对象,继而调用该类的
46、构造函数,使得Create函数被调用,完成窗口的创建工作。然后执行后面两句,用作窗口的显示和更新。m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();最后返回TRUE,表示窗口创建成功。InitInstance的执行过程:第81页/共105页2.3.3 理解程序代码应用程序类CWinApp是用来调用WinMain以及进行实例的初始化,在每个MFC应用程序中有且只能有一个这样的应用程序类,且需要一个全局的对象实例,如theApp。InitInstance完成初始化工作后,接下来调用基类CWinApp的成员函数Run,执行应用程序
47、的消息循环,即重复执行接收消息并转发消息的工作。当Run检查到消息队列为空时,将调用基类CWinApp的成员函数OnIdle进行空闲时的后台处理工作。若消息队列为空且又没有后台工作要处理时,则应用程序一直处理等待状态,一直等到有消息为止。当程序结束时,调用基类CWinApp的成员函数ExitInstance,完成终止应用程序的收尾工作。第82页/共105页2.3.3 理解程序代码2.消息映射(Message Map)在MFC中,一个消息的处理往往是通过独特的MFC映射机制来进行的。消息映射机制指MFC类中将消息与消息处理函数联系起来,一一对应的机制。这种机制使得应用程序处理消息变得更方便、更直
48、接、更紧凑。在MFC中,任何一个从CCmdTarget类派生的类理论上均可处理消息,且都有相应的消息映射函数。第83页/共105页2.3.3 理解程序代码 映射一个消息的过程是由三个部分组成的:(1)在处理消息的类中,使用消息宏DECLARE_MESSAGE_MAP()声明对消息映射的支持,并在该宏之前声明消息处理函数。如:protected:Afx_msg void OnLButtonDown(UINT nFlags,CPoint point);DECLARE_MESSAGE_MAP()第84页/共105页 (2)使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在类声
49、明之后的地方定义该类支持的消息映射入口点,所有消息映射宏都添加在这里,当然不同的消息MFC都会有不同的消息映射宏。如:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)END_MESSAGE_MAP 2.3.3 理解程序代码第85页/共105页(3)定义消息处理函数。例如:void CMainFrame:OnLButtonDown(UINT nFlags,CPoint point)MessageBox(你好,我的Visual C+世界!,问候,0);CFrameWnd:OnLButtonDown(nFlags,point);注:为了使消息能被其他对象接收并处理,在函
50、数中常常需要调用基类中的相关消息处理函数。2.3.3 理解程序代码第86页/共105页2.3.4 使用MFC AppWizard 表表2.2 MFC AppWizard创建的应用程序类型创建的应用程序类型 名名 称称项项 目目ATL COM MFC AppWizard创建创建ATL(Active Template Library)应用模块工程应用模块工程Cluster Resource Type Wizard创建创建Cluster Resource(用于用于Windows NT服务器服务器)Custom MFC AppWizard创建自己的应用程序向导创建自己的应用程序向导Database P