当前位置:高等教育资讯网  >  中国高校课件下载中心  >  大学文库  >  浏览文档

《Visual C++编程技术》课程电子教案(讲义)第2章 Windows编程与MFC基础

资源类别:文库,文档格式:PDF,文档页数:16,文件大小:381.46KB,团购合买
要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制。本 章首先将剖析Windows程序的内部运行机制,为读者扫清VC++学习路途中的第一个障碍,而后简单 介绍一下MFC的基础知识,为进一步学习MFC程序开发打下基础。
点击下载完整版文档(PDF)

Visual c 第2章 Windows编程与MFc基础 要想熟练掌握 Windows应用程序的开发,首先需要理解 Windows平台下程序运行的内部机制。本 章首先将剖析 Windows程序的内部运行机制,为读者扫清VC++学习路途中的第一个障碍,而后简单 介绍一下MFC的基础知识,为进一步学习MFC程序开发打下基础 2.1 Windows编程基础 Windows操作系统采用了图形用户界面,借助于它提供的API( Application P Interface)函数,用户可以编出具有漂亮图形界面的程序。本节将主要介绍一下涉及 Windows编程中 用到的一些概念 2.1.1 Windows ap|函数 为方便用户开发 Windows应用程序, Windows操作系统提供了各种各样的函数。这些函数是 Windows操作系统提供给应用程序编程的接口( Application Programming Interface),简称为API函数 用户在编写 Windows程序时所说的API函数,就是指系统提供的函数,所有主要的 Windows函数都在 “ Windows.h”头文件中进行了声明 Windows apl也是 Windows操作系统自带的在 Windows环境下运行的软件开发包(SDK)。程序员 总是直接或间接引用AP进行应用程序的开发,所以 Windows应用程序就有大致相同的用户界面 SDK的全称是 Software Development Kit,中文译为软件开发包。假如现在需要开发视频会议系 说明统,在购买视频数据采集卡时,厂商就会提供频数据采集卡的SDK开发包,以方便对频数据采 集卡的编程操作。这个开发包通常都会包含频数据采集卡的API函数库、帮助文档、使用手册 和辅助工具等资源。也就是说,SDK实际上就是开发所需资源的一个集合。 2.1.2窗口与句柄 窗口是 Windows应用程序中一个非常重要的元素,它是 Windows应用程序与用户进行交互的接口。 Windows应用程序至少要有一个窗口,称为主窗口。通过窗口,可以接收用户的输入,并显示输出。 个应用程序窗口通常都包含标题栏、菜单栏、系统菜单、最小(大)化按钮、边框和滚动条等 窗口可以分为客户区和非客户区。客户区是窗口的一部分,应用程序通常在客户区中显示文字或者绘 制图形。标题栏、菜单栏、系统菜单、最小(大)化按钮和边框统称为窗口的非客户区,它们由 Windows系统来管理,而应用程序则主要管理客户区的外观及操作 在 Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。要对某个窗口进行操作,首 先就要得到这个窗口的句柄。句柄( HANDLE)是 Windows程序中一个重要的概念。在 Windows程序 中,有各种各样的资源(窗口、图标和光标等),系统在创建这些资源时会为它们分配内存,并返回 励志照亮人生编程改变命运

30 励志照亮人生 编程改变命运 零基础学 Visual C++ 第2 章 Windows编程与MFC基础 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制。本 章首先将剖析Windows程序的内部运行机制,为读者扫清VC++学习路途中的第一个障碍,而后简单 介绍一下MFC的基础知识,为进一步学习MFC程序开发打下基础。 2.1 Windows编程基础 Windows操作系统采用了图形用户界面,借助于它提供的API(Application Programming Interface)函数,用户可以编出具有漂亮图形界面的程序。本节将主要介绍一下涉及Windows编程中 用到的一些概念。 2.1.1 Windows API函数 为方便用户开发Windows应用程序,Windows操作系统提供了各种各样的函数。这些函数是 Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数。 用户在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在 “Windows.h”头文件中进行了声明。 Windows API也是Windows操作系统自带的在Windows环境下运行的软件开发包(SDK)。程序员 总是直接或间接引用API进行应用程序的开发,所以Windows应用程序就有大致相同的用户界面。 说明 SDK的全称是Software Development Kit,中文译为软件开发包。假如现在需要开发视频会议系 统,在购买视频数据采集卡时,厂商就会提供频数据采集卡的SDK开发包,以方便对频数据采 集卡的编程操作。这个开发包通常都会包含频数据采集卡的API函数库、帮助文档、使用手册 和辅助工具等资源。也就是说,SDK实际上就是开发所需资源的一个集合。 2.1.2 窗口与句柄 窗口是Windows应用程序中一个非常重要的元素,它是Windows应用程序与用户进行交互的接口。 一个Windows应用程序至少要有一个窗口,称为主窗口。通过窗口,可以接收用户的输入,并显示输出。 一个应用程序窗口通常都包含标题栏、菜单栏、系统菜单、最小(大)化按钮、边框和滚动条等。 窗口可以分为客户区和非客户区。客户区是窗口的一部分,应用程序通常在客户区中显示文字或者绘 制图形。标题栏、菜单栏、系统菜单、最小(大)化按钮和边框统称为窗口的非客户区,它们由 Windows系统来管理,而应用程序则主要管理客户区的外观及操作。 在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。要对某个窗口进行操作,首 先就要得到这个窗口的句柄。句柄(HANDLE)是Windows程序中一个重要的概念。在Windows程序 中,有各种各样的资源(窗口、图标和光标等),系统在创建这些资源时会为它们分配内存,并返回

第3章 Windows编程与MFC 标识这些资源的标识号,即句柄 Windows中,常用句柄类型及其说明如表2.1所示。 表21常用句柄类型及其说明 HWND 窗口句柄 HDC 设备环境句柄 HBITMAP 位图句柄 HCURSOR 光标句柄 HICON 图标句柄 HFONT 字体句柄 HMENU 菜单句柄 HEN 画笔句柄 文件句柄 HBRUSH 画刷句柄 HINSTANCE 当前实例句柄 HLOCAL 局部内存对象句柄 HGLOBAL 全局内存对象句柄 2.1.3事件与消息 Windows程序采用的是事件驱动方式的程序设计模式,其操作主要是基于消息的。在应用程序启 动后,系统等待用户在图形用户界面内的输入选择, 如鼠标按键、键盘按键、窗口被创建、关闭、改变事 大小和移动等,对系统而言,这些都是事件。 键盘消息 Windows[鼠标消息息 提取消息 只要有事件发生,系统即产生特定的消息。消息 系统其他消息队 描述了事件的类别,包含了相关信息, Windows应用 处理消息 程序利用消息与系统及其他应用程序进行信息交换。 由于 Windows事件的发生是随机的,程序的执 图2.1事件与消息处理 行先后顺序也无法预测,系统采用消息队列来存放 事件发生的消息,然后从消息队列中依次取出消息进行相应的处理,可表示为如图2.1所示 2.14常用的 Windows数据类型 Windows应用程序中常用的数据类型如表22所示 表22 Windows应用程序常用的数据类型 数据类型 BYTE 8位无符号字符 PSTR 32位字符指针 COLORREF 32位整数,表示一个颜色 WORD 16位无符号整数 LONG 32位有符号整数 DWORD 32位无符号整数,是WORD的两倍长度 UINT 32位无符号整数 BOOL 布尔值,值为TRUE或 FALSE HANDLE 励志照亮人生编程改变命

31 励志照亮人生 编程改变命运 第 3 章 Windows编程与MFC基础 标识这些资源的标识号,即句柄。 Windows中,常用句柄类型及其说明如表2.1所示。 表2.1 常用句柄类型及其说明 句柄 说明 句柄 说明 HWND 窗口句柄 HDC 设备环境句柄 HBITMAP 位图句柄 HCURSOR 光标句柄 HICON 图标句柄 HFONT 字体句柄 HMENU 菜单句柄 HPEN 画笔句柄 HFILE 文件句柄 HBRUSH 画刷句柄 HINSTANCE 当前实例句柄 HLOCAL 局部内存对象句柄 HGLOBAL 全局内存对象句柄 2.1.3 事件与消息 Windows程序采用的是事件驱动方式的程序设计模式,其操作主要是基于消息的。在应用程序启 动后,系统等待用户在图形用户界面内的输入选择, 如鼠标按键、键盘按键、窗口被创建、关闭、改变 大小和移动等,对系统而言,这些都是事件。 只要有事件发生,系统即产生特定的消息。消息 描述了事件的类别,包含了相关信息,Windows应用 程序利用消息与系统及其他应用程序进行信息交换。 由于Windows事件的发生是随机的,程序的执 行先后顺序也无法预测,系统采用消息队列来存放 事件发生的消息,然后从消息队列中依次取出消息进行相应的处理,可表示为如图2.1所示。 2.1.4 常用的Windows数据类型 Windows应用程序中常用的数据类型如表2.2所示。 表2.2 Windows应用程序常用的数据类型 数据类型 说 明 BYTE 8位无符号字符 PSTR 32位字符指针 COLORREF 32位整数,表示一个颜色 WORD 16位无符号整数 LONG 32位有符号整数 DWORD 32位无符号整数,是WORD的两倍长度 UINT 32位无符号整数 BOOL 布尔值,值为TRUE或FALSE HANDLE 句柄 图2.1 事件与消息处理 事件 键盘消息 应用程序 提取消息 处理消息 鼠标消息 其他消息 消 息 队 列 Windows 系统

Visual c++ (续) 数据类型 LPSTR 32位指针,指向 LPCSTR 32位指针,指向字符串常量 LPTSTR 32位指针,指向字符串,此字符串可移植到 Unicode和DBCS双字符集 LPCTSTR 32位指针,指向字符串常量,此串可移植到 Unicode和DBCS双字符集 LPVOID 32位指针,可指向任何类型数据 LPRESULT 32位数值,作为窗口函数或 CALLBACK函数的返回类型 WNDPROC 32位指针,指向一个窗口函数 LPARAM 32位数值,作为窗口函数和 CALLBACK函数的参数 WPARAM 作为窗口函数和 CALLBACK函数的参数,在win16中是16位,在win32中是32位 2.2 Windows应用程序分析 Winmain和 WinProc函数构成了 Windows应用程序的主体。 Winmain函数负责建立窗口和建立消 息循环, WndProc函数负责消息的处理。典型的 Windows窗口的创建与处理过程可表示为图2.2所示。 程序开始执行 WndProc 程序打开窗口 函数负责 函数负责 应用程序 处理消息 处理消息」 程序结束 关闭窗口 默认处理 图22 Windows窗口创建及处理过程 2.2.1 Winmain函数 传统的DOS程序以main函数作为进入程序的初始入口点,在 Windows应用程序中,main函数被 Winmain函数取代。当 Windows操作系统启动一个程序时,它调用的就是该程序的 Winmain函数。 WinMain函数是 Windows程序的入口点函数,当 WinMain函数结束或返回时, Windows应用程序结束 WinMain函数的原型如下 int WINAPI WinMain C HINSTANCE hThisInst //应用程序当前实例句柄 INSTANCe hPrevInst //应用程序其他实例句柄 LPSTR lpszCmdLine //指向程序命令行参数的指针 Int nCmdshow, //应用程序开始执行时窗口显示方式的整数值标识 励志照亮人生编程改变命运

32 励志照亮人生 编程改变命运 零基础学 Visual C++ (续) 数据类型 说 明 LPSTR 32位指针,指向字符 LPCSTR 32位指针,指向字符串常量 LPTSTR 32位指针,指向字符串,此字符串可移植到Unicode和DBCS双字符集 LPCTSTR 32位指针,指向字符串常量,此串可移植到Unicode和DBCS双字符集 LPVOID 32位指针,可指向任何类型数据 LPRESULT 32位数值,作为窗口函数或CALLBACK函数的返回类型 WNDPROC 32位指针,指向一个窗口函数 LPARAM 32位数值,作为窗口函数和CALLBACK函数的参数 WPARAM 作为窗口函数和CALLBACK函数的参数,在win 16中是16位,在win 32中是32位 2.2 Windows应用程序分析 WinMain和WinProc函数构成了Windows应用程序的主体。WinMain函数负责建立窗口和建立消 息循环,WndProc函数负责消息的处理。典型的Windows窗口的创建与处理过程可表示为图2.2所示。 图2.2 Windows窗口创建及处理过程 2.2.1 WinMain函数 传统的DOS程序以main函数作为进入程序的初始入口点,在Windows应用程序中,main函数被 WinMain函数取代。当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数。 WinMain函数是Windows程序的入口点函数,当WinMain函数结束或返回时,Windows应用程序结束。 WinMain函数的原型如下: int WINAPI WinMain ( HINSTANCE hThisInst, //应用程序当前实例句柄 HINSTANCe hPrevInst, //应用程序其他实例句柄 LPSTR lpszCmdLine, //指向程序命令行参数的指针 Int nCmdShow, //应用程序开始执行时窗口显示方式的整数值标识 ) 程序开始执行 程序打开窗口 否 是 否 应用程序 处理消息 是 处理消息 程序结束, 关闭窗口 检测发向窗口 的消息 WM_QUIT WinMain() 函数负责 windows 默认处理 WndProc() 函数负责

第3章 Windows编程与MFC 口参数 hInstance表示该程序当前运行的实例的句柄,这是一个数值。当程序在 Windows下运行时, 它唯一标识运行中的实例。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该 实例分配一个句柄值,并通过 hInstance参数传递给 Winmain函数 口参数 hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,这个参数不再起作用, 为NULL 口参数 IpCmdLine是一个字符串指针,指定传递给应用程序的命令行参数。 口参数 n DshOw指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值 由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。 WinMain函数接收4个参数,这些参数都是在系统调用 WinMain函数时,传递给应用程序的 222创建窗口 创建一个完整的窗口,需要经过下面4个操作步骤:定义窗口类、注册窗口类、创建窗口实例 显示及更新窗口。 定义窗口类 在创建一个窗口前,必须对该类型的窗口进行设计,指定窗口的特征。窗口的特征是由 WNDCLASS结构体来定义的。 WNDCLASS结构体的定义如下: typedef struct tagWNDCLASS UINT style; //窗口风格 WNDPRoC lpfnwndProc //指向窗口处理函数的函数指针 nt cbclsextra //窗口结构中的预留字节数 int cbwndextra: //为其他创建窗口预留字节数 ANCe hInstance //注册该窗口类的实例句柄 HICON Icon //代表该窗口类 标 HCURSOR hours //该窗口客户区鼠标光标句柄 HBRUSH hbrBackGround //该窗口背景颜色句柄 LPCSTR Ips zMenuName //指向窗口菜单名的字符指针 //指向窗口名的字符指针 1 WNDCLASS, *PWNDCLASS, NEAR *NPWNDCLASS, FAR *LPWNDCLASS 2.注册窗口类 窗口类( WNDCLASS)设计完成后,需要调用 RegisterClasso函数对其进行注册,注册成功后, 才可以创建该类型的窗口。注册函数的原型声明如下: BOOL Registerclass(CoNST WNDCLAss *lpwndclass) 该函数只有一个参数,即上一步骤中所设计的窗口类对象的指针。 3.创建窗口实例 设计好窗口类并且将其成功注册之后,就可以用 Create Window(函数产生这种类型的窗 数 Create Window(原型如下 HWND Createwindow (LPCTSTR IpszClassName //窗口类名 励志照亮人生编程改变命

❑ 参数hInstance表示该程序当前运行的实例的句柄,这是一个数值。当程序在Windows下运行时, 它唯一标识运行中的实例。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该 实例分配一个句柄值,并通过hInstance参数传递给WinMain函数。 ❑ 参数hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,这个参数不再起作用, 为NULL。 ❑ 参数lpCmdLine是一个字符串指针,指定传递给应用程序的命令行参数。 ❑ 参数nCmdShow指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值 由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。 WinMain函数接收4个参数,这些参数都是在系统调用WinMain函数时,传递给应用程序的。 2.2.2 创建窗口 创建一个完整的窗口,需要经过下面4个操作步骤:定义窗口类、注册窗口类、创建窗口实例、 显示及更新窗口。 1. 定义窗口类 在创建一个窗口前,必须对该类型的窗口进行设计,指定窗口的特征。窗口的特征是由 WNDCLASS结构体来定义的。WNDCLASS结构体的定义如下: typedef struct tagWNDCLASS { UINT style; //窗口风格 WNDPROC lpfnWndProc; //指向窗口处理函数的函数指针 int cbClsExtra; //窗口结构中的预留字节数 int cbWndExtra; //为其他创建窗口预留字节数 HINSTANCE hInstance; //注册该窗口类的实例句柄 HICON hIcon; //代表该窗口类的图标句柄 HCURSOR hCursor; //该窗口客户区鼠标光标句柄 HBRUSH hbrBackGround; //该窗口背景颜色句柄 LPCSTR lpszMenuName; //指向窗口菜单名的字符指针 LPCSTR lpszClassName; //指向窗口名的字符指针 } WNDCLASS, *PWNDCLASS,NEAR *NPWNDCLASS, FAR *LPWNDCLASS; 2. 注册窗口类 窗口类(WNDCLASS)设计完成后,需要调用RegisterClass()函数对其进行注册,注册成功后, 才可以创建该类型的窗口。注册函数的原型声明如下: BOOL RegisterClass(CONST WNDCLASS *lpWndClass); 该函数只有一个参数,即上一步骤中所设计的窗口类对象的指针。 3. 创建窗口实例 设计好窗口类并且将其成功注册之后,就可以用CreateWindow()函数产生这种类型的窗口了。函 数Create Window()原型如下: HWND CreateWindow (LPCTSTR lpszClassName, //窗口类名 33 励志照亮人生 编程改变命运 第 3 章 Windows编程与MFC基础

Visual c++ //窗口标题名 DWORD dwstyle //创建窗口的样式 int x,y, //窗口左上角坐标 int nwidth, nHeight, //窗口宽度和度高 HWND hwndparent //该窗口的父窗口句柄 HWENU hMenu, //窗口主菜单句柄 STANCe hInstance //创建窗口的应用程序当前句柄 LPVOID IpParam //指向一个传递给窗口的参数值的指针 注意区分 WNDCLASS中的 Istyle成员与 Create Window函数的 dwStyle参数,前者是指定窗口类的 样式,基于该窗口类创建的窗口都具有这些样式,后者是指定某个具体的窗口的样式。 4.显示及更新窗口 窗口创建之后,就可以调用函数 Show Window(来显示窗口,该函数的原型如下 BOOL Showwindow( HWND hwnd, int ncmdshow Show Window函数有两个参数,第一个参数hWnd就是在上一步骤中成功创建窗口后返回的那个 窗口句柄:第二个参数 nCmdShow指定了窗口显示的状态。 在调用 Show Window函数之后,紧接着调用 Update Window函数来刷新窗口。 Update Window( 函数的原型如下: 其参数hwnd指的是创建成功后的窗口的句柄。 Update Window(函数通过发送一个 WM PAINT消 息来刷新窗口, Update Window函数将 WM PAINT消息直接发送给窗口过程函数进行处理,而没有 放到消息队列里。到此,一个窗口就算创建完成了 2.2.3消息循环 在创建窗口、显示窗口和更新窗口后,就需要编写一个消息循环,不断地从消息队列中取出消息, 并进行响应。要从消息队列中取出消息,需要调用 GetMessage(函数,其原型如下: GetMessage //指向MsG结构的指针 //窗口句柄 nMsgFilteMin, //用于消息过滤的最小消息号值 nMsgEilterMax /用于消息过滤的最大消息号值 只要从消息队列中取出消息不为WM_QUIT, GetMessageo函数就返回一个非零值,否则程序就 结束循环并退出。 通常编写的消息循环代码如下: while (GetMessage (&Msg, NULL, 0,0)) TranslateMessage(&Msg) //将消息的虚拟键转换为字符信息 DispatchMessage(&Msg) //将消息传送到指定窗口函数 励志照亮人生编程改变命运

LPCTSTR lpszTitle, //窗口标题名 DWORD dwStyle, //创建窗口的样式 int x,y, //窗口左上角坐标 int nWidth,nHeight, //窗口宽度和度高 HWND hwndParent, //该窗口的父窗口句柄 HWENU hMenu, //窗口主菜单句柄 HINSTANCE hInstance, //创建窗口的应用程序当前句柄 LPVOID lpParam, //指向一个传递给窗口的参数值的指针 ) 注意区分WNDCLASS中的style成员与CreateWindow()函数的dwStyle参数,前者是指定窗口类的 样式,基于该窗口类创建的窗口都具有这些样式,后者是指定某个具体的窗口的样式。 4. 显示及更新窗口 窗口创建之后,就可以调用函数ShowWindow()来显示窗口,该函数的原型如下: BOOL ShowWindow( HWND hWnd, int nCmdShow ); ShowWindow()函数有两个参数,第一个参数hWnd就是在上一步骤中成功创建窗口后返回的那个 窗口句柄;第二个参数nCmdShow指定了窗口显示的状态。 在调用ShowWindow()函数之后,紧接着调用UpdateWindow()函数来刷新窗口。UpdateWindow() 函数的原型如下: BOOL UpdateWindow( HWND hWnd); 其参数hWnd指的是创建成功后的窗口的句柄。UpdateWindow()函数通过发送一个WM_PAINT消 息来刷新窗口,UpdateWindow()函数将WM_PAINT消息直接发送给窗口过程函数进行处理,而没有 放到消息队列里。到此,一个窗口就算创建完成了。 2.2.3 消息循环 在创建窗口、显示窗口和更新窗口后,就需要编写一个消息循环,不断地从消息队列中取出消息, 并进行响应。要从消息队列中取出消息,需要调用GetMessage()函数,其原型如下: GetMessage (lpMSG, //指向MSG结构的指针 hwnd, //窗口句柄 nMsgFilteMin, //用于消息过滤的最小消息号值 nMsgFilterMax //用于消息过滤的最大消息号值 ) 只要从消息队列中取出消息不为WM_QUIT,GetMessage()函数就返回一个非零值,否则程序就 结束循环并退出。 通常编写的消息循环代码如下: MSG Msg; … while (GetMessage (&Msg,NULL,0,0)) { TranslateMessage(&Msg); //将消息的虚拟键转换为字符信息 DispatchMessage(&Msg); //将消息传送到指定窗口函数 } 34 励志照亮人生 编程改变命运 零基础学 Visual C++

第3章 Windows编程与MFC GetMessageo函数只有在接收到wM_QUIT消息时,才返回0。此时whil语句判断的条件为假, 循环退出,程序才有可能结束运行。在没有接收到 WM QUIT消息时, Windows应用程序就通过这个 while循环来保证程序始终处于运行状态。 ②应用程序调用 Translate Message函数用于将虚拟键消息转 GetMessage函数从消 消息到指定窗口,由窗囗函数WdP对消息进将酒回传给厘用程序P并消息 换为字符消息。 DispatchMessage函数分派一个③应用程序调用 行处理。 作系统 消息队列 说明 ispachMessage s实际上是将消息回传给操作系|r 统,由操作系统调用窗口函数对消息进行处理 Window应用程序的消息处理机制可表示为图的 ④利用 WNDCLASS ①操作系统将接收到 的 IpfnWndProc成员 应用程序的窗口消息 2.3所示 保存的窗口函数的指 投递到其消息队列 针调用窗口函数,处 224 WinProc窗口函数 理消息 图23 Windows应用程序的消息处理机制 在完成上述步骤后,剩下的工作就是编写一个 窗口函数,用于处理发送给窗口的消息。 Win Proc函数由一个或多个 switch语句组成。每一条case语句 对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活。窗口函数的一般形式如下 LRESULT CALLBACK WndProc(HWNDhwnd, UINT messgae, WPARAM wParam, LPARAM lParam switch(message // message为标识的消息 I case break case WM DEStroy //退出 PostQuitMessage(0) de fault r teturn DefwindowProc (hwnd, message, wParam, lParam) 2.2.5 Windows编程实例 本节将通过一个实例讲解 Windows窗口的创建。该 Windows应用程序将创建并显示一个窗口,在 客户区中输出文本。 在 Visual c++60中,可以使用 App Wizard创建一个空的“win32 Application”工程,在其中创建 源文件,利用 Windows api函数实现基本的 Windows窗口程序编程。实例的具体实现过程如下 (1)启动Ⅴ isual c++6.0,利用 App wizard来建立一个“win32 Application”类型的工程 “ Windows demo”,向导默认选项就是创建一个空工程。 (2)通过执行“Fle”→“New”菜单命令,向工程添加源文件“ Apidemo.cpp”,具体方法参见 励志照亮人生编程改变命

35 励志照亮人生 编程改变命运 第 3 章 Windows编程与MFC基础 GetMessage()函数只有在接收到WM_QUIT消息时,才返回0。此时while语句判断的条件为假, 循环退出,程序才有可能结束运行。在没有接收到WM_QUIT消息时,Windows应用程序就通过这个 while循环来保证程序始终处于运行状态。 TranslateMessage()函数用于将虚拟键消息转 换为字符消息。DispatchMessage()函数分派一个 消息到指定窗口,由窗口函数WndProc()对消息进 行处理。 说明 DispachMessage实际上是将消息回传给操作系 统,由操作系统调用窗口函数对消息进行处理。 Windows应用程序的消息处理机制可表示为图 2.3所示。 2.2.4 WinProc窗口函数 在完成上述步骤后,剩下的工作就是编写一个 窗口函数,用于处理发送给窗口的消息。WinProc函数由一个或多个switch语句组成。每一条case语句 对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活。窗口函数的一般形式如下: LRESULT CALLBACK WndProc(HWND hwnd, UINT messgae,WPARAM wParam,LPARAM lParam ) { ... switch(message) //message为标识的消息 { case ... ... break; ... case WM_DESTROY: //退出 PostQuitMessage(0); default: return DefWindowProc(hwnd,message,wParam,lParam); } return(0); } 2.2.5 Windows编程实例 本节将通过一个实例讲解Windows窗口的创建。该Windows应用程序将创建并显示一个窗口,在 客户区中输出文本。 在Visual C++6.0中,可以使用AppWizard创建一个空的“Win32Application”工程,在其中创建 源文件,利用Windows API函数实现基本的Windows窗口程序编程。实例的具体实现过程如下: (1)启动Visual C++ 6.0,利用AppWizard来建立一个“Win32Application”类型的工程 “WindowsDemo”,向导默认选项就是创建一个空工程。 (2)通过执行“File”→“New”菜单命令,向工程添加源文件“Apidemo.cpp”,具体方法参见 2.2.2节。 图2.3 Windows应用程序的消息处理机制 ② 应用程序调用 GetMessage函数从消 息队列中取出消息, 并进行预处理 ④ 利用WNDCLASS 的lpfnWndProc成员 保存的窗口函数的指 针调用窗口函数,处 理消息 ① 操作系统将接收到 应用程序的窗口消息 投递到其消息队列 ③ 应用程序调用 DispatchMessage, 将消息回传给操 作系统 操作系统 窗口函数 应用程序 消息队列

Visual c++ (3)在“ Epidem.cpp”文件中,编辑代码如下 lude //包含 windows.h头文件 LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, L PARAM);//窗口函数声明 /*入口函数 WinMain()*/ int APIENTRY winMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdline int ncmdshow)I WNDCLASs wndclass /定义窗口类结构变量 HWNDhwnd //定义窗口句柄 定义消息结构变量 /*定义窗口类的各属性*/ wndclass style CS HREDRAW I CS VREDRAW //改变窗口大小则重画 wndclass. lpfnwndproc Wndproc //窗口函数为 WndProc wndclass. cbClsExtra =0 //窗口类无扩展 wndclass. cbWndExtra =0 /窗口实例无扩展 wndclass hInstance hInstance //注册窗口类实例句柄 wndclass. hicon= loadicon(NULL, IDI APPLICATION);//用箭头光标 wndclass cursor Loadcursor (NULL, IDC ARROW wndclass. hbrBackground=( HBRUSH) Getstockobject( WHITE BRUSH);//背景为白色 ndclass. lpszMenuN /窗口默认无菜单 wndclass.1pszC⊥ assName=" window窗口创建 //窗口类名为 window窗口创建 /*注册窗口类*/ if(! Registerclass(&wndclass)) return FALSE 创建窗口*/ hwnd= createwindow(" window窗口创建 //窗口类名 window窗口创建 window窗口创建 //窗口名 window窗口创建 WS OVERLAPPEDWIN DOW //重叠式窗口 CW USEDEFAULT, CW USEDEFAULT, //左上角屏幕坐标默认值 CW USEDEFAULT, CW USEDEFAULT /窗口宽度和高度默认值 NULL, //此窗口无父窗口 NULL //此窗口无主菜单 hInstance //创建此窗口的实例句柄 NULL) //此窗口无创建参数 /*显示并更新窗口* Showwindow(hwnd, ncmdshow) //显示窗口 Updatewindow (hwnd) //更新窗口的客户区 /*消息循环*/ while(GetMessage (&msg, NULL, 0,0)) TranslateMessage /键盘消息转换 DispatchMessage (&msg) //派送消息给窗口函数 return msg. wParam; //返回退出值 /*窗口函数+ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM IParam)( //根据消息值转相应的消息处理 itch (message)( case M PAInt //重画窗口客户区消息处理 DC hdc 定义设备描述表句柄 励志照亮人生编程改变命运

(3)在“Apidemo.cpp”文件中,编辑代码如下: #include //包含windows.h头文件 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM ); //窗口函数声明 /*入口函数 WinMain()*/ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ WNDCLASS wndclass; //定义窗口类结构变量 HWND hwnd; //定义窗口句柄 MSG msg; //定义消息结构变量 /*定义窗口类的各属性*/ wndclass.style = CS_HREDRAW|CS_VREDRAW; //改变窗口大小则重画 wndclass.lpfnWndProc = WndProc; //窗口函数为WndProc wndclass.cbClsExtra = 0; //窗口类无扩展 wndclass.cbWndExtra = 0; //窗口实例无扩展 wndclass.hInstance = hInstance; //注册窗口类实例句柄 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //用箭头光标 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景为白色 wndclass.lpszMenuName = NULL; //窗口默认无菜单 wndclass.lpszClassName = "window窗口创建"; //窗口类名为window窗口创建 /*注册窗口类*/ if(! RegisterClass(&wndclass)) return FALSE; /*创建窗口*/ hwnd = CreateWindow("window窗口创建", //窗口类名 window窗口创建 "window窗口创建", //窗口名window窗口创建 WS_OVERLAPPEDWINDOW, //重叠式窗口 CW_USEDEFAULT, CW_USEDEFAULT, //左上角屏幕坐标默认值 CW_USEDEFAULT, CW_USEDEFAULT, //窗口宽度和高度默认值 NULL, //此窗口无父窗口 NULL, //此窗口无主菜单 hInstance, //创建此窗口的实例句柄 NULL); //此窗口无创建参数 /*显示并更新窗口*/ ShowWindow(hwnd,nCmdShow); //显示窗口 UpdateWindow (hwnd); //更新窗口的客户区 /*消息循环*/ while(GetMessage (&msg,NULL,0,0)) { TranslateMessage (&msg); //键盘消息转换 DispatchMessage (&msg); //派送消息给窗口函数 } return msg.wParam; //返回退出值 } /*窗口函数*/ LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam){ //根据消息值转相应的消息处理 switch (message){ case WM_PAINT: //重画窗口客户区消息处理 HDC hdc; //定义设备描述表句柄 36 励志照亮人生 编程改变命运 零基础学 Visual C++

第3章 Windows编程与MFC PAINTSTRUCT ps: //定义绘图信息结构变量 hdc BeginPaint (hwnd,&ps)i //获取要重画的窗口的设备描述表句柄 Textout(hdc,10,20,"哈哈, windows编程创建的窗口!",28);//输出文本 EndPaint (hwnd, &ps)i //结束要重画的窗口 return 0 DESTROY //撤销窗口消息处理 P。 stQuitMessage(0) //产生退出程序消息 WM QUIT return 0 return DefwindowProc (hwnd, message, wParam, IParam) //其他转默认窗口函数 程序将创建并显示一个 Windows窗口,并在客户窗h日 口中(10,20)的位置处输出一行文字。要在窗口中输购的,wmwn编程创建的窗 出文字或者显示图形,需要用到设备描述表( Device Context),简称DC。DC是一个包含设备(物理输出设 备,如显示器,以及设备驱动程序)信息的结构体 在 Windows平台下,所有的图形操作都是利用DC来完 编译、运行程序后,得到窗口结果如图24所示 图24程序运行结果 2.3MFC基础 前面已经多次提到,使用 Viusal c++6.0进行应用程序的开发,其最大的便利就是可以使用其提供 的MFC类库,通过 MFC App Wizard自动生成的MFC应用程序框架,可以方便地开发自己想要实现的 功能。本节将介绍有关MFC的基础知识 2.3.1MFC概述 Ⅴ isual c++的微软基础类库( Microsoft Foundation Class Library,MFC)封装了大部分AP函数 并提供了一个应用程序框架,简化和标准了 Windows程序设计,所以用MFC编写 Windows应用程序也 称为标准 Windows程序设计。 说明MFC实际上可以理解为是用来编写 Windows应用程序的C++类集 MFC约有200个类,提供了 Windows应用程序框架和创建应用程序的组件。它提供了大量的基类 供程序员根据不同的应用环境进行扩充,同时允许在编程过程中自定义和扩展应用程序中的类,它还 具有较好的移植性,可移植于众多的平台。 MFC库可以分为三个主要部分:MFC类、宏以及变量(或函数)。如果某个函数或者变量不是类 的成员,那么它就是一个全局函数或者全局变量。 2.32MFC基础类及其层次结构 MFC类库采用单一继承结构,从根类 CObject层层派生出绝大多数MFC中的类,如图25所示 励志照亮人生编程改变命

PAINTSTRUCT ps; //定义绘图信息结构变量 hdc = BeginPaint (hwnd,&ps); //获取要重画的窗口的设备描述表句柄 TextOut(hdc,10,20,"哈哈,Windows编程创建的窗口!", 28); //输出文本 EndPaint (hwnd,&ps); //结束要重画的窗口 return 0; case WM_DESTROY: //撤销窗口消息处理 PostQuitMessage (0); //产生退出程序消息WM_QUIT return 0; } return DefWindowProc (hwnd, message, wParam, lParam); //其他转默认窗口函数 } 程序将创建并显示一个Windows窗口,并在客户窗 口中(10,20)的位置处输出一行文字。要在窗口中输 出文字或者显示图形,需要用到设备描述表(Device Context),简称DC。DC是一个包含设备(物理输出设 备,如显示器,以及设备驱动程序)信息的结构体, 在Windows平台下,所有的图形操作都是利用DC来完 成的。 编译、运行程序后,得到窗口结果如图2.4所示。 2.3 MFC基础 前面已经多次提到,使用Viusal C++6.0进行应用程序的开发,其最大的便利就是可以使用其提供 的MFC类库,通过MFC AppWizard自动生成的MFC应用程序框架,可以方便地开发自己想要实现的 功能。本节将介绍有关MFC的基础知识。 2.3.1 MFC概述 Visual C++的微软基础类库(Microsoft Foundation Class Library,MFC)封装了大部分API函数, 并提供了一个应用程序框架,简化和标准了Windows程序设计,所以用MFC编写Windows应用程序也 称为标准Windows程序设计。 说明 MFC实际上可以理解为是用来编写Windows应用程序的C++类集。 MFC约有200个类,提供了Windows应用程序框架和创建应用程序的组件。它提供了大量的基类 供程序员根据不同的应用环境进行扩充,同时允许在编程过程中自定义和扩展应用程序中的类,它还 具有较好的移植性,可移植于众多的平台。 MFC库可以分为三个主要部分:MFC类、宏以及变量(或函数)。如果某个函数或者变量不是类 的成员,那么它就是一个全局函数或者全局变量。 2.3.2 MFC基础类及其层次结构 MFC类库采用单一继承结构,从根类CObject层层派生出绝大多数MFC中的类,如图2.5所示。 37 励志照亮人生 编程改变命运 第 3 章 Windows编程与MFC基础 图2.4 程序运行结果

Visual c++ CObject根类 arget命令相关类 CAliendO、 CWindowDO CDC设备环境类 CPaintDO、 CGdiObject绘画工具类 CPen、 CBrush、 CFont 群(集合)类 CDatabase、 CRecordset、…ODBC数据库支持类 CDatabase、 CData Recordset、 DAO数据库支持类 CFle文件类 一 CMemFile、 COleStreamFile、 CSyncObject同步对象类 CInternetsession因特网会话类 CIntemetconnection因特网连接类 CHelpConnection 图25 CObject派生类层次示意图 基类 CObject的最基本功能包括支持序列化( serialization)、运行时(Run-time)类的信息获取 提供特定操作符,完成对象的建立与删除。 读者可能会发现,在图2.5的类库结构中,并没有发现MFC应用程序框架所需要的类:应用类 CWinapp、框架类 CFramewnd、文档类 表23MFC主要的全局函数及其作用 CDocument和视图类 C View。实际上,它们都是 函数名 功能 由 CCmdTarget派生出来的,如图26所示 AfxBegin Thread CCmdTarget类是 CObject的子类,它是MFC AfxEnd Thread 结束一个旧的线程 库中所有具有消息映射属性的基类。消息映射规 类似 printf,将字符串格式化 定了当一对象接收到消息命令时,应调用哪一个 类似 Windows aPl函数 Message Box 函数对该消息进行处理。 AfxOuputDebugString将字符串输往除错装置 2.3.3MFC中的全局函数 获得 application object( CwinApp AfxGetApp 辰生对象)的指针 MFC库中还包含有一些全局函数,这些函数 AfxGetMain Wnd 获得程序主窗口的指针 输入任何一个类,即可以直接使用。这些全局 AfxGetlnstance 获得程序的 instance handle 函数一般都以“Afx”为前缀,MFC中主要的全 局函数及其作用如表23所示。 另外,在MFC库中还含有一些宏,在具体用到时,再详细介绍 励志照亮人生编程改变命运

38 励志照亮人生 编程改变命运 零基础学 Visual C++ 图2.5 CObject派生类层次示意图 基类CObject的最基本功能包括支持序列化(serialization)、运行时(Run-time)类的信息获取、 提供特定操作符,完成对象的建立与删除。 读者可能会发现,在图2.5的类库结构中,并没有发现MFC应用程序框架所需要的类:应用类 CWinApp 、框架类 CFrameWnd 、文档类 CDocument和视图类CView。实际上,它们都是 由CCmdTarget派生出来的,如图2.6所示。 CCmdTarget类是CObject的子类,它是MFC 库中所有具有消息映射属性的基类。消息映射规 定了当一对象接收到消息命令时,应调用哪一个 函数对该消息进行处理。 2.3.3 MFC中的全局函数 MFC库中还包含有一些全局函数,这些函数 不输入任何一个类,即可以直接使用。这些全局 函数一般都以“Afx”为前缀,MFC中主要的全 局函数及其作用如表2.3所示。 另外,在MFC库中还含有一些宏,在具体用到时,再详细介绍。 表2.3 MFC主要的全局函数及其作用 函数名 功 能 AfxBeginThread 开始一个新的线程 AfxEndThread 结束一个旧的线程 AfxFormatString 类似printf,将字符串格式化 AfxMessageBox 类似Windows API函数MessageBox AfxOuputDebugString 将字符串输往除错装置 AfxGetApp 获得application object (CwinApp 派生对象)的指针 AfxGetMainWnd 获得程序主窗口的指针 AfxGetInstance 获得程序的instance handle CObject根类 CCmdTarget命令相关类 CDC设备环境类 CGdiObject绘画工具类 CMenu菜单 CArray、CList、CMap、……群(集合)类 CDatabase、CRecordset、……ODBC数据库支持类 CDatabase、CDataRecordset、……DAO数据库支持类 CFile文件类 CException异常类 CSyncObject同步对象类 CInternetSession因特网会话类 CInternetConnection因特网连接类 CFtpConnection CGopherConnection CHelpConnection CClientDC、CWindowDC CPaintDC、…… CPen、CBrush、CFont CBitmap、CPalette…… CMemFile、COleStreamFile、 CSocketFile、……

第3章 Windows编程与MFC CObject根类 CCmdTarget命令处理类 CWinThread线程类 CWinApp windows应用程序类 CDocument文档类 CDoc Template文档模板类 SIngle Doc Template单文档模板类 CMulti Doc Template多文档模板类 → CFrameWnd框架窗口类 CMDIFrameWnd CMDIChildwnd、 AMini CControlBar控制条类 CDialogBar、 TOolbAr、 STatus Bar CSplitterWnd窗口分割类 CPropertSheetA属性表类 CDialog对话框类 COmmon dialog公用对话框类 lordialog、 PRoperty.属性表 CView视图类 CCtrlView CTree View, CRichEdit Vi CButton、 CEdit、 CListBox、 CScrollBar 图26应用程序框架相关类的层次关系 24MFC应用程序框架分析 通过22节的介绍,相信读者对 Windows应用程序的创建及其运行机制已经有了一定的了解,本节 将对MFC应用程序框架作一简单剖析,使读者了解MFC应用程序框架是如何组织与工作的 24.1入口函数 前面已经介绍过, Winmain函数是 Windows程序的入口点函数。然而打开22.2节利用 AppWizard 创建的MFC应用程序“ SDIDemo”,却找不到 Winmail函数。 励志照亮人生编程改变命

图2.6 应用程序框架相关类的层次关系 2.4 MFC应用程序框架分析 通过2.2节的介绍,相信读者对Windows应用程序的创建及其运行机制已经有了一定的了解,本节 将对MFC应用程序框架作一简单剖析,使读者了解MFC应用程序框架是如何组织与工作的。 2.4.1 入口函数 前面已经介绍过,WinMain函数是Windows程序的入口点函数。然而打开2.2.2节利用AppWizard 创建的MFC应用程序“SDIDemo”,却找不到WinMain函数。 39 励志照亮人生 编程改变命运 第 3 章 Windows编程与MFC基础 2O CObject根类 CCmdTarget命令处理类 CWinThread线程类 CDocument文档类 CWnd窗口类 CFrameWnd框架窗口类 CControlBar控制条类 CSplitterWnd窗口分割类 CPropertSheet属性表类 CDialog对话框类 CProperty属性表 CView视图类 CCtrlView CFormView CRecordView CButton、CEdit、CListBox、CScrollBar CStatic、CComboBox控制类 CEditView、CListView CTreeView、CRichEditView CCommonDialog公用对话框类 CFileDialog、CColorDialog、… CMDIFrameWnd CMDIChildWnd、CMiniFrameWnd CDialogBar、CToolBar、CStatusBar CDocTemplate文档模板类 CSingleDocTemplate单文档模板类 CMultiDocTemplate多文档模板类 CWinApp Windows应用程序类 ……

点击下载完整版文档(PDF)VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
共16页,试读已结束,阅读完整版请下载
相关文档

关于我们|帮助中心|下载说明|相关软件|意见反馈|联系我们

Copyright © 2008-现在 cucdc.com 高等教育资讯网 版权所有