




已阅读5页,还剩101页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows编程基础 n基本概念 nWindows程序运行机制 nVC6.0下三种编程方式 n命名规则匈牙利命名法(自学) nWindows程序结构 n简单的Windows编程(API) nMFC编程基础 窗口和程序 n窗口是Windows本身以及Windows 环境下的应用程序的基本界面单位。 n很多人都误以为只有具有标题栏、状 态栏、最大化、最小化按钮这样标准的 方框才叫窗口。 n其实窗口的概念很广,例如按钮和对 话框等也是窗口,只不过是一种特殊的 窗口。 窗口 n窗口 (Window) 由句柄唯一标识。 nWindows程序的基本操作单元。 n系统管理应用程序的基本单位。 n应用程序与用户交互的接口环境。 n应用程序的运行就是窗口内部、窗口之 间、窗口与系统之间数据处理与交换的过 程。 n一个Windows程序至少有一个窗口。 窗口的组成 应用程序 的主窗口 窗口 窗口 窗口 窗口 窗口 窗口的组成 n窗口是屏幕上的一个矩形区域 n应用程序在该区域中显示数据并等 待鼠标点击 nWindows应用系统的用户界面可 以包含许多窗口 n每个窗口都有不同的特点,但都是 互相联系的 三种类型的窗口 n在这么多窗口中,基本类型只有三种: n重叠( Overlapped ) 窗口 n弹出( Popup ) 窗口 n子( Child ) 窗口 n在它们之间并没有太多内在的差异,但 是使用不同的窗口风格,它们的外观是不 同的 三种类型的窗口 n重叠窗口通常用于建立应用程序主窗口 。事实上,有时也叫做“主”窗口或者“框架 ”窗口 n弹出窗口通常以对话框和消息框的形式 与用户对话 n子窗口通常用在视图( View )中,如在 文本编辑器中的文本显示,也用在控件中 ,如在对话框中的OK按钮 n而对那些看起来像按钮或控件的子窗 口,也称为“控件”窗口 三种窗口组成的应用程序 属于桌面的重叠窗 口,也称主窗口主窗口的子窗口 主窗口的 子窗口 主窗口的 弹出窗口 弹出窗口 的子窗口 三种类型的窗口 n主要区别 n重叠窗口和弹出窗口 n弹出窗口出现时可以没有标题 (也称为标题栏) n子窗口与重叠窗口、弹出窗口 n子窗口只能出现在另一个窗口 中,并且子窗口的任何多余部分都被 该窗口移去或剪切掉 n另外,子窗口是唯一不能有菜单条 的窗口 程序 n通常说的程序 都是指一个能让计 算机识别的文件。 n接触得最多的 是以exe或者com 作为扩展名的文件 。 进程与线程 n进程就是应用程序的执行实例(或称一个 执行程序),进程是程序动态的描述。 n一个以exe作为扩展名的文件,在没有被 执行的时候称之为应用程序,当用鼠标双击执 行以后,就被操作系统作为一个进程执行了。 n当关机或者在任务栏的图标上单击鼠标右 键选“退出”时,进程便消亡,彻底结束了生命 。 n进程经历了由“创建”到“消亡”的生命期, 而程序自始至终存在于你的硬盘上,不管计算 机是否启动。 Windows任务管理器进程 线程 n线程是进程的一个执行单元。 n同一个进程中的各个线程对应于一组 CPU指令、一组CPU寄存器以及一个堆栈 。 n进程本来就具有动态的含义,是通过线 程来体现的。 Windows应用程序,操作系统,计 算机硬件之间的相互关系 应用程序 操作系统 输入输出设备 消息队列 向下的箭头1表示操作系统能够操纵 输出设备,以执行特定的功能,如让声 卡发出声音,让显卡画出图形。向上的 箭头2表示操作系统能够感知输入设备 状态的变化,如鼠标移动,键盘按下, 并且能够知道鼠标移动的具体位置,键 盘按下的哪个字符。这就是操作系统和 计算机硬件之间的交互关系,应用程序 开发者通常不需知道其具体实现细节。 API与SDK nAPI是英文Application Programming Interface 的缩写,意思是“应用程序接口”,泛 指系统为应用程序提供的一系列函数接口 n在编程时可以直接调用,而不必知道其内部 实现的过程,只知道它的原型和返回值就可以了 nSDK是英文Software Development Kit的 缩写,意思是“软件开发工具包” n微软提供了许多专门的SDK开发包,比如 DirectX开发包和语音识别开发包等 关于API 向下的箭头表示应用程序可以通知操作系 统执行某个具体的动作。 如操作系统能够控制声卡发出声音,但它并 不知道应该何时发出何种声音,需要应用程序告 诉操作系统该发出什么样的声音。 关于API 应用程序是如何通知操作系统执行某个功能的呢? 在应用程序中要完成某个功能,都是以函数调用的 形式实现的,同样,应用程序也是以函数调用的方式来 通知操作系统执行相应的功能的。操作系统所能够完成 的每一个特殊功能通常都有一个函数与其对应,也就是 说,操作系统把它所能够完成的功能以函数的形式提供 给应用程序使用,应用程序对这些函数的调用就叫做系 统调用,这些函数的集合就是Windows操作系统提供给 应用程序编程的接口Windows API。如CreateWindow就 是一个API函数,应用程序中调用这个函数,操作系统 就会按照该函数提供的参数信息产生一个相应的窗口。 事件及消息 n事件(Event)是对计算机操作的动作。 每个事件对应一个消息,即每个事件发生的 效果是产生消息。 n消息(Message)是描述事件发生的信息 。 n比如:按键事件按下键的消息 、字符消息和键弹起的消息 n程序执行的顺序取决于事件发生的顺序, 但是消息的产生并不要求有次序之分。 消息(Message) 向上的箭头表示操作系统能够将输入设备的变 化上传给应用程序。 如用户在某个程序活动时按了一下键盘,操作系统马 上能够感知到这一事件,并且能够知道用户按下的是哪 一个键,操作系统并不决定对这一事件如何作出反应, 而是将这一事件转交给应用程序,由应用程序决定如何 对这一事件作出反应。好比有个蚊子叮了我们一口,我 们的神经末梢(相当于操作系统)马上感知到这一事件 ,并传递给了我们的大脑(相当于应用程序),我们的 大脑最终决定如何对这一事件作出反应,如将蚊子赶走 ,或是将蚊子拍死。对事件作出反应的过程就是消息响 应。 消息(Message) n消息是应用程序和计算机交互的途径, 在计算机上几乎做每一个动作都会产生一个 消息。 n鼠标被移动会产生 WM_MOUSEMOVE消息; n鼠标左键被按下会产生 WM_LBUTTONDOWN的消息; n鼠标右键按下便产生 WM_RBUTTONDOWN消息等。 消息的功能 n功能 n帮助Windows实现多任务。 n通知应用程序某一事件已经发生 ,各应用程序给予响应。 消息的组成 操作系统是怎样将感知到的事件传递给应用程 序呢?这是通过消息机制(Message)来实现的。 操作系统将每个事件都包装成一个称为消息的 结构体MSG来传递给应用程序,参看MSDN。 消息的组成: 消息号字参数长字参数 n消息号事先定义好。 n字参数(wParam)长字参数(lParam)提供附 加信息,含义和具体消息号相关。 典型的消息结构 typedef struct tagMSG HWND hwnd; / 接收窗 口 UINT message; / 消息标 识 WPARAM wParam; / 附加信 息 LPARAM lParam; / 附加信 息 DWORD time; / 发送时 间 POINT pt; / 鼠标位置 MSG , *PMSG; /vcincludewtypes.h 句柄 (HANDLE) n句柄(HANDLE):资源的标识。 n操作系统要管理和操作这些资源,都是通过 句柄来找到对应的资源。 n按资源的类型,又可将句柄细分成图标句柄 (HICON),光标句柄(HCURSOR),窗口 句柄(HWND),应用程序实例句柄( HINSTANCE)等等各种类型的句柄。操作系统 给每一个窗口指定的一个唯一的标识号即窗口句 柄。 句柄 n句柄是一个指针 n通过句柄就可以控制该句柄指向的对象 n编写程序总是要和各种句柄打交道的 n句柄(handle)是一个4字节长的 整数值 n是系统用于表示应用程序中不同的 对象和同类对象中不同的实例。 n如一个窗口、按钮、图标、菜 单等 n这些东西在系统中被视为不同类型 的对象,用不同的句柄将他们区分开来 。 常用的句柄 句柄类型说明句柄类型说明 HWND标识窗口句柄HDC 标识设备环 境句 柄 HINSTANCE 标识当前实例句 柄 HBITMAP标识位图句柄 HCURSOR标识光标句柄HICON标识图标 句柄 HFONT标识字体句柄HMENU标识菜单句柄 HPEN标识画笔句柄HFILE标识文件句柄 HBRUSH标识画刷句柄 从变量的类型区分变量的用途 int x,y; x=30; y=30; /x和y既可以用来表示坐标点,也可以用来表 示宽度和高度,还可以用来表示身高和体重。 typedef int WIDTH typedef int HEIGHT WIDTH x; HEIGHT y; /好处:我们从变量的类型上就可以知道x和y 是用来表示宽度和高度。 消息驱动机制 nDOS程序是通过调用系统的函数来获得 用户输入。 nWindows程序则是通过操作系统发送 的消息来处理用户输入 n在Windows操作系统环境内 n系统产生的动作 n用户运行应用程序产生的动作 事件产生 的消息 消息驱动机制 nWindows程序 n接收消息 n分发消息 n处理消息 与用户进行交互 消息的分类 n窗口管理消息、初始化消息、输入消息、系统 消息等。 nVC定义不同的前缀用于消息宏定义识别消息类 型。 BM 按钮消息 CB组合框消息 DM下压按钮控制消息 EM编辑框消息 LB列表框消息 WM 窗口消息 不同消息类型的取值范围 消息类型取值范围 系统定义消息(1)0x00000x03ff 用户定义内部消息0x04000x07ff 系统定义消息(2)0x80000xbfff 用户定义外部消息0xc0000xffff Windows应用程序常用消息 nWM_LBUTTONDOWN nWM_KEYDOWN nWM_CREAT nWM_CLOSE nWM_DISTORY nWM_QUIT nWM_PAINT nWM_CHAR nWM_COMMAND Windows应用程序常用消息 n窗口管理消息 n初始化消息 n输入消息 n系统消息 n剪贴板消息 n控制处理消息 n控制通知消息 n滚动条通知消息 n非用户区消息 nMDI消息 nDDE消息 n应用程序自定义的消 息 消息的传递 nWindows系统有一个存放消息的队列 。 n每个应用程序也有一个消息队列。 nWindows系统先将收到的消息存放在 系统队列中。 n然后再分发到相应的应用程序队列中。 n应用程序则从自身的队列中获取消息并 进行处理。 消息的传递 事件事件事件 系统消息队列 应用程序队列应用程序队列应用程序队列 应用程序 应用程序应用程序 一个应用程序队列 Windows Input Message System Queue Application Queue WinMain () Message Loop Windows Function 两个应用程序队列 Windows Input Message System Queue Application Queue Application Queue WinMain () Mesaage Loop Windows Function WinMain () Mesaage Loop Windows Function 结束一个应用程序 WM_DESTROY Windows WM_QUIT Application Queue Windows Function Application WinMain() Message Loop 创建消息循环 nWindows程序至少包含两个函数: 4WinMain ( ) : 必有且仅有一个 4窗口函数 : 每个窗口对应一个窗口函 数,以响应该窗口的消息 n通常每个Windows 应用程序至 少对应一个窗口,每个窗口都要有一个 窗口函数负责处理该窗口内所发生的事 件 创建消息循环 While (GetMessage( / 转换某些键盘消息 DispatchMessage( / 将消息发送给窗口过程, 例程中 指WndProc 何时退出 ? / 当从应用程序消息队列中检取的消息 是 / WM_QUIT时,则退出循环 投递和发送消息 nPostMessage和SendMessage nPostMessage只把消息放入队列,不管其 他程序是否处理都返回,然后继续执行 n这是个异步消息投放函数,会造成消息的 滞后性 nSendMessage必须等待其他程序处理消 息完了之后才返回,继续执行 n这是个同步消息投放函数,不会造成消息 的滞后性 n但如果消息处理失败,则会造成程序停止 nPostMessage的返回值表示 PostMessage函数执行是否正确 nSendMessage的返回值表示其他程序处 理消息后的返回值 投递和发送消息图示 Windows System Queue Application Queue WinMain () Mesaage Loop Windows Function PostMessage( ) SendMessage( ) Application 投递和发送消息示例 nPostQuitMessage(nExitCode) n功能: 发送WM_QUIT消息给系统, 以通 知系统应用程序要结束。 nWM_QUIT消息只能用PostMessage, 因为该消息将导致应用程序释放消息环,也 就无法返回结果 。 nSendDlgItemMessage( ) n功能: 向对话框控件发送消息 n相当于先用GetDlgItem()得到控件句 柄,再 SendMessage(),是一种组合的方 便方式。 VC6.0下三种编程方式 n控制台编程(DOS编程) Win32 Console Application nWindows API编程: Win32 Application nMFC编程: MFC AppWizard(exe) Visual C+开发环境 标题栏菜单栏 工具栏 项目工作 区窗口 文档窗口 工具栏 输出窗口 输出窗口标签状态栏 开发环境的菜单功能 nFile菜单中的命令主要用来对文件和项目进 行操作 nEdit菜单中的命令是用来使用户便捷地编辑 文件内容 nView菜单中的命令主要用来改变窗口和工具 栏的显示方式,激活调试时所用的各个窗口等 nInsert菜单中的命令主要用于项目及资源的 创建和添加 开发环境的菜单功能 nProject菜单中的命令主要用于项目的一些操作 nBuild菜单中的命令主要用来应用程序的编译、 连接、调试、运行 nTools菜单中的命令主要用于选择或定制开发环 境中的一些实用工具 nWindows菜单中的命令主要用于文档窗口的操 作 nVisual C+ 提供了大量详细的帮助信息 File-New-Projects MFC API 控制台(DOS) File菜单 VC6.0可以创建的项目类型 项目类型说明项目类型说明 ATL COM AppWizard创建ATL应用程序Database Project创建数据库项 目 Win32 Dynamic-Link Library 创建Win32动态链 接 库 DevStudio Add-in Wizard 创建自动化宏 Custom AppWizard 创建自定义的 AppWizard ISAPI Extension Wizard 创建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 通过它可以创建两种 项目类型(Resource DLL和Cluster Administrator Extension DLL) Utility Project通过它可以创建一个 效用项目,该项 目只 作为其他子项目的一 个包容器,减少子项目 的编联时间 ,但它本 身并不包含任何文件 Win32 Static Library创建Win32静态库 File-New-Files 开发环境的工具栏 n标准工具栏 n类向导工具栏 n小型编译连接工具栏 n工具栏的显示与隐藏、浮动与停泊 n“Customize”对话框方式(Tools- Customize) n快捷菜单方式(任何工具栏处右击鼠标 ) 2.1 Windows程序结构 2.1.1 简单的Windows应用程序 n实例创建(演示) n用AppWizard创建 n理解程序框架 n添加程序代码 n编译运行 2.1.1 简单的Windows应用程序 例Ex_HelloMsg:一个最简单的Windows应用程序。 #include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) MessageBox (NULL, “你好,我的Visual C+世 界!“, “问候“, 0) ; return 0 ; 2.1.1 简单的Windows应用程序 nWindows程序的入口函数WinMain函数的原型如下: int WINAPI WinMain ( HINSTANCE hInstance, / 当前实实例句柄 HINSTANCE hPrevInstance, / 以前的实实例句柄 LPSTR lpCmdLine, / 指向命令行参数的指针针 int nCmdS ) / 窗口的显显示状态态 每一个Win32应用程序都需要Windows.h头文件, 包含了一些Windows头文件。 程序中,MessageBox是一个Win32 API函数,用 来弹出一个对话框窗口,显示短信息。 窗口的创建 创建一个完整的窗口需要经过下面四个 操作步骤: n设计一个窗口类; n注册窗口类; n创建窗口; n显示及更新窗口。 设计窗口类 typedef struct _WNDCLASS UINT style; /窗口类的类型 WNDPROClpfnWndProc; /过程函数 int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS; 窗口类的类型 在我们的程序中经常要用到一类变量,这个变 量里的每一位都对应某一种特性。当该变量的某位 为1时,表示有该位对应的那种特性,当该位为0时 ,即没有该位所对应的特性。当变量中的某几位同 时为1时,就表示同时具有几种特性的组合。 一个变量中的哪一位代表哪种意义,不容易记 忆,所以我们经常根据特征的英文拼写的大写去定 义一些宏,该宏所对应的数值中仅有与该特征相对 应的那一位(bit)为1,其余的bit都为0。 我们使用goto definition就能发现 CS_VREDRAW=0x0001,CS_HREDRAW=0x0002, CS_DBLCLKS =0x0008,CS_NOCLOSE =0x0200。 他们的共同点就是只有一位为1,其余位都为0。 如果我们希望某一变量的数值既有CS_VREDRAW特性,又 有CS_HREDRAW特性?我们只需使用二进制OR(|)操作符 将他们进行或运算相组合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我们希望在某一变量 原有的几个特征上去掉其中一个特征,用取反()之后再进 行与( uWinMain函数通常要完成以下几步工作: 定义并调用API函数RegisterClass注册应用程 序的窗口类。 调用相关API函数创建和显示窗口,并进行必要 的初始化处理。其中,函数CreateWindow用来 创建已注册窗口类的窗口。 CreateWindow函数的原型: HWND CreateWindow( LPCTSTR lpClassName, / 已注册的窗口类名 LPCTSTR lpWindowName, / 窗口标题 DWORD dwStyle, / 窗口风格 int x, / 窗口的水平位置 int y, / 窗口的垂直位置 int nWidth, / 窗口宽度 int nHeight, / 窗口高度 HWND hWndParent, / 父窗口句柄 HMENU hMenu, / 菜单句柄或控件标识 HINSTANCE hInstance, / 应用程序实例句柄 LPVOID lpParam / 其他窗口创建时的参数数据); 2.1.1 简单的Windows应用程序 创创建和启动应动应 用程序的消息循环环。Windows应应用 程序接受各种不同的消息,Windows系统统首先将消息 放入消息队队列中,应应用程序的消息循环环就是从应应用程 序的消息队队列中消息,并将消息发发送相应应的客串过过程 函数中作进进一步处处理。API函数GetMessage 和 DispatchMessage就是起到这样这样 的作用。 如果接收到WM_QUIT消息,则则退出应应用程序。 Windows应用程序的基本流程: 2.1.2 Windows编程特点 一个完整的Windows应用程序除了WinMain函 数外,还包含用于处理用户动作和窗口消息的窗口 函数。 Windows应用程序具有的一些特性: l 消息驱动机制 l 图形设备接口(GDI) l 基于资源的程序设计 l 动态链接库 1. 消息驱动机制 Windows程序和控制台应用程序之间一个 最根本区别,在于控制台应用程序是通过调用系 统函数来获得用户输入,而Windows程序则是 通过系统发送的消息来处理用户输入。 2. 图形设备接口(GDI) Windows提供了一个抽象的接口,称为图 形设备接口(Graphical Device Interface,GDI),使得用户直接利用系统的GDI 函数就能方便实现图形和文本的输出,而不必关 心与系统相连的外部设备的类型。 2.1.2 Windows编程特点 2.1.2 Windows编程特点 3. 基于资源的程序设计 Windows应用程序包含众多图形元素,如光标、 菜单、工具栏、位图、对话框等,每一个这样的资源 都用相应的标识符来区分,而且Windows内部也有预 定义的资源。在Windows环境下,每一个资源元素都 作为一种可以装入应用程序的资源来存放,这些资源 可以被编辑、修改,也可以被其他应用程序所共享。 4. 动态链接库 动态链接库提供了一些特定结构的函数,能被应用 程序在运行过程中装入和连接。多个程序可以共享同 一个动态链接库,动态链接库可以提高程序模块的灵 活性。 Windows提供了丰富的应用程序可调用的函数,大 多数用于实现其用户界面和在屏幕显示的文本和图形, 都是通过动态链接库来实现的。 在Windows操作系统中,最主要的DLL有 KERNEL32.DLL、GDI32.DLL和USER32.DLL。 KERNEL32.DLL用来处理存储器低层功能、任务和资源 管理等Windows核心服务;GDI32.DLL提供图形设备接 口,管理用户界面和图形绘制,包括Windows元文件、 位图、设备描述表和字体等; USER32.DLL负责窗口的 管理,包括消息、菜单、光标、计时器及其它与控制窗 口显示相关的一些功能。 2.1.2 Windows编程特点 2.1.3 Windows常用的基本数据类型 Windows所 数据类型 对应的基本数据类 型 说明 BOOLbool布尔值 BSTRunsigned short *32位字符指针 BYTEunsigned char8位无符号整数 COLORREFunsigned long用作颜色值的32位值 DWORDunsigned long32位无符号整数,段地址和相关的偏移地址 LONGlong32位带符号整数 LPARAMlong作为参数传递给 窗口过程或回调函数的32位值 LPCSTRconst char *指向字符串常量的32位指针 LPSTRchar *指向字符串的32位指针 LPVOIDvoid *指向未定义类型的32位指针 LRESULTlong来自窗口过程或回调函数的32位返回值 UINTunsigned int32位无符号整数 WORDunsigned short16位无符号整数 WPARAMunsigned int当作参数传递给 窗口过程或回调函数的32位值 2.1.3 Windows基本数据类型 说明: n 这些基本数据类型都是用大写字符来表示, 以与一般C+基本数据类型相区别。 n 数据类型的前缀是P或LP,表示是一个指针 或长指针数据类型。前缀是U,表示无符号数据 类型,等等。 n Windows还提供一些宏来处理上述基本数据 类型。 2.2 Windows简单编程 2.2.1 绘制文本 Windows窗口通常有标题栏和边框,其中默认背景 色为白色区域称为窗口的客户区。当客户区内容发生变 化时,此时客户区变成了“无效区域”或“更新区域”, Windows就会将WM_PAINT消息放在应用程序的消息 队列中,通过在窗口过程函数中对WM_PAINT消息的 判断处理,就可对客户区进行图形和文本的绘制。 例Ex_WinText 文本绘制 2.2.1 绘制文本 TextOut函数是用来显示文本的最常用的GDI函数,有下列 原型: case WM_PAINT: hdc = BeginPaint(hwnd, TextOut(hdc, 10, 10, str, strlen(str); EndPaint(hwnd, return 0 ; 绘制文本时需要先调用BeginPaint函数,用来返回指 定窗口句柄的设备描述表句柄,设备描述表用来将程序与 计算机外部输出设备连接起来。 hdc定义的是句柄HDC变量,TextOut等GDI函数都要 通过这样的HDC句柄来绘制图形和文本。 EndPaint用来释放设备描述表句柄,并使先前无效区域 变为有效,从而使Windows不再发送WM_PAINT消息。 2.2.1 绘制文本 PAINTSTRUCT是“绘图信息结构”,BeginPaint 和EndPaint函数都需要PAINTSTRUCT结构变量作为自 己的参数。 BeginPaint和EndPaint函数必须成对出现, 所有GDI函数的调用也应在这两个函数之间进行。 TextOut函数是用来显示文本的最常用的GDI函数 ,原型如下: BOOL TextOut( HDC hdc, / 设备描述表句柄 int nXStart, / 文本显示的水平起始 位置 int nYStart, / 文本显示的垂直起始 位置 LPCTSTR lpString, / 要显示的文本 int cbString / 要显示的文本长度 2.2.2 使用控件 控件是在系统内部定义的用于和用户交互 的基本单元,它常用于对话框中。在Win32 应用程序中,可在窗口基础上通过 CreateWindow函数来创建一个控件窗口。 例Ex_WinControl 控件的使用 (P38) 2.3 MFC编程基础 2.3.1 MFC概述 为了帮助用户处理那些经常使用且复杂 繁琐的各种Windows操作,Visual C+设 计了一套基础类库MFC(Microsoft Foundation Library)。MFC把传统的 Windows编程规范中的大多数内容封装成 为各种类,提高了编程和代码效率。 MFC类的基本层次结构 CCmdTarget CWnd CDocument CFrameWnd CObject CWinTread CWinApp CViewCDialog及控件 CMDIChildWndCMDIFrameWndCMiniFrameWnd 2.3.2 设计一个MFC程序 例Ex_HelloMFC 一个MFC应用程序。 (1) 创建一个“An empty project”类型的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。 2.3.3 理解程序代码 1. 程序运行机制 MFC是使用afxwin.h来代替头文件windows.h, 在Ex_HelloMFC程序中看不到Windows应用程序 所必须的程序入口函数WinMain,因为MFC将它隐 藏在应用程序框架内部了。当用户运行应用程序时 ,Windows会自动调用应用程序框架内部的 WinMain函数,并自动查找该应用程序类 CHelloApp的全局变量theApp,然后自动调用 CHelloApp的虚函数InitInstance,该函数会进一步 调用相应的函数来完成主窗口的构造和显示工作。 首先执行的是: m_pMainWnd = new CMainFrame(); 该语句用来创建从CFrameWnd类派生而来的用户 框架窗口CMainFrame类对象,继而调用该类的构造 函数,使得Create函数被调用,完成窗口的创建工作 。 然后执行后面两句,用作窗口的显示和更新。 m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); 最后返回TRUE,表示窗口创建成功。 InitInstance的执行过程: 2.3.3 理解程序代码 应用程序类CWinApp是用来调用WinMain以及进行 实例的初始化,在每个MFC应用程序中有且只能有一个 这样的应用程序类,且需要一个全局的对象实例,如 theApp。 InitInstance完成初始化工作后,接下来调用基类 CWinApp的成员函数Run,执行应用程序的消息循环, 即重复执行接收消息并转发消息的工作。当Run检查到 消息队列为空时,将调用基类CWinApp的成员函数 OnIdle进行空闲时的后台处理工作。若消息队列为空且 又没有后台工作要处理时,则应用程序一直处理等待状 态,一直等到有消息为止。当程序结束时,调用基类 CWinApp的成员函数ExitInstance,完成终止应用程 序的收尾工作。 2.3.3 理解程序代码 2. 消息映射(Message Map) 在MFC中,一个消息的处理往往是通过独特的 MFC映射机制来进行的。 消息映射机制指MFC类中将消息与消息处理函数 联系起来,一一对应的机制。这种机制使得应用程 序处理消息变得更方便、更直接、更紧凑。在MFC 中,任何一个从CCmdTarget类派生的类理论上均 可处理消息,且都有相应的消息映射函数。 2.3.3 理解程序代码 映射一个消息的过程是由三个部分组成的: (1) 在处理消息的类中,使用消息宏 DECLARE_MESSAGE_MAP() 声明对消息映射 的支持,并在该宏之前声明消息处理函数。 如: protected: Afx_msg void OnLButtonDown(UINT nFlags,CPoint point); DECLARE_MESSAGE_MAP() (2) 使用BEGIN_MESSAGE_MAP和 END_MESSAGE_MAP宏在类声明之后的地方定义该 类支持的消息映射入口点,所有消息映射宏都添加在 这里,当然不同的消息MFC都会有不同的消息映射宏 。如: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) END_MESSAGE_MAP 2.3.3 理解程序代码 (3) 定义消息处理函数。例如: void CMainFrame:OnLButtonDown(UINT nFlags, CPoint point) MessageBox (“你好,我的Visual C+世界 !“, “问候“, 0) ; CFrameWnd:OnLButtonDown(nFlags, point); 注:为了使消息能被其他对象接收并处理,在函数 中常常需要调用基类中的相关消息处理函数。 2.3.3 理解程序代码 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 Project创建数据库应用程序 DevStudio Add-in Wizard创建ActiveX组件或VBScript宏 Extended Stored Proc Wizard创建基于SQL服务器下的外部存储过程 ISAPI Extension Wizard创建Internet Server程序 MakeFile创建独立于Visual C+开发环境的应用程序 MFC ActiveX ControlWizard创建ActiveX Control应用程序 MFC AppWizard(dll)MFC的动态链 接库 MFC AppWizard(exe)一般MFC的Windows应用程序 Utility Project创建简单实 用的应用程序 Win32 Application其他Win32的Windows应用程序 Win32 Console ApplicationWin32的控制台应用程序 Win32 Dynamic-Link LibraryWin32的动态链 接库 Win32 Static LibraryWin32的静态链接库 MFC AppWinzard(exe)应用程序类型 n单文档应用程序:类似于Windows记事本的程 序,功能比较简单,复杂程序适中,每次只能打开 和处理一个文档。大多数应用程序的编制都是从单 文档程序框架开始的。 n对话框应用程序:最简单、最紧凑,没有菜单、 工具栏和状态栏,也不能处理文档,但速度快,代 码少。 n多文档应用程序:能允许同时打开和处理多个文 档,相对于单文档,增加了许多功能,因而也需要 大量额外的编程工作,如不仅需要跟踪所有打开文 档的路径,还需要管理各文档窗口的显示和更新等 。 其它 项目和项目工作区目录结构 n在VC中,项目中所有的源文件都是采用文件夹 的方式进行管理的 n将项目名作为文件夹名,在此文件夹下包含源 程序代码文件(.cpp,.h)、项目文件(.dsp)以及项 目工作区文件(.dsw)等 n下面列出了其他一些文件类型的的含义: n.opt 关于开发环境的参数文件如工具条位置 等信息 n.aps(AppStudio File) 资源辅助文件,二进 制格式 n.clw ClassWizard信息文件 n.dsp(DeveloperStudio Project) 项目文 件 n.plg 编译信息文件 n.hpj(Help Project) 帮助文件项目 项目和项目工作区目录结构 n.mdp(Microsoft DevStudio Project) 旧版本的项目文件 n.bsc 用于浏览项目信息 n.map 执行文件的映像信息纪录文件 n.pch(Pre-Compiled File)预编译文件 ,可以加快编译速度,但是文件非常大 n.pdb(Program Database)记录程序有 关的一些数据和调试信息 n.exp 记录DLL文件中的一些信息, 只有在编译DLL才会生成 n.ncb 无编译浏览文件(no compile browser) 项目和项目工作区目录结构 n还有相应的Debug或Release、Res等子文件夹 nVC应用程序向导创建项目时,系统会自动为项 目创建Win32 Debug的运行程序,并使用相应的 缺省配置 nWin32 Release版本的区别在于 nDebug版本的运行程序有相应的调试信 息码 nRelease版本的运行程序没有 nRelease版本的运行程序经过代码的优 化,其程序的运行速度被最大加速 项目和项目工作区 n在开发环境中,VC是通过左边的项 目工作区窗口来对项目进行各种管理 n项目工作区窗口包含三个页面 nClassView页 nResourceView页 nFileView页 项目和项目工作区 nClassView页 n用以显示项目中的所有的类信息 n假设打开的项目名为Ex_Sdi,单击项 目区窗口底部的ClassView,则显示出 “Ex_Sdi classes”的树状结点。 n在它的前面是一个图标和一个套在方 框中的符号“+”,单击符号“+”或双击图标 ,Ex_Sdi中的所有类名将被显示。 n如CMainFrame、CEx_SdiApp、 CEx_SdiDoc、CEx_SdiView等 项目和项目工作区 nResourceView页 n包含了项目中所有资源的层次列表。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新gre阅读解析题目译文及答案
- 销售合同审核流程表风险控制要点版
- 写景作文冬日滇池400字(13篇)
- 我家的端午节作文350字15篇范文
- 重游故地高三作文600字14篇
- 业务谈判策略模板与场景应对方案
- 红楼梦之黛玉之死:文学名著深度解读教案
- 状物作文美丽的桂花400字(7篇)
- 第3课 太平天国运动 课件 统编版历史八年级上册
- 商务活动策划与执行服务协议条款书
- 二年级下册音乐《每天》教案
- 音乐美学.课件
- 心肺复苏说课比赛课件模板(一等奖)
- 健康体检证明
- 激光跟踪仪使用手册
- 金属材料的主要性能ppt课件(完整版)
- 2021年江西外语外贸职业学院教师招聘试题及答案解析
- 电鱼机的相关知识与各级电路的电路图
- 公司闲置资产及废旧物资盘活处置管理办法
- 临汾热电公司机械伤害事故案例分析
- 普通高等学校毕业生登记表模板_B4_直接打印版
评论
0/150
提交评论