Visual C++NET程序设计实用教程.ppt_第1页
Visual C++NET程序设计实用教程.ppt_第2页
Visual C++NET程序设计实用教程.ppt_第3页
Visual C++NET程序设计实用教程.ppt_第4页
Visual C++NET程序设计实用教程.ppt_第5页
免费预览已结束,剩余197页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Visual C+.NET程序设计实用教程,第1章 走进Visual C+.NET世界 第2章 Windows程序设计基础 第3章 菜单、工具栏和状态栏 第4章 对话框设计和编程 第5章 数据库编程 第6章 图像编程与文字处理 第7章 文档视图结构 第8章 网络编程,第1章 走进Visual C+.NET世界 欲善工事,必先利其器,教学内容 1.1 Visual C+.NET编程基础 1.2 Visual C+.NET集成开发环境(IDE) 1.3 Visual C+.NET应用程序开发过程 1.4 应用程序的调试 1.5 小结 思考与练习,1.1 Visual C+.NET编程基础,1.1.

2、1 Visual Studio.NET简介 Visual Studio.NET是.NET平台下最为强大的开发工具,无论是软件服务商,还是企业应用程序的部署与发布,Visual Studio.NET都可以提供近乎完美的解决方案。 Visual Studio.NET提供了包括设计、编码、编译调试、数据库联接操作等基本功能和基于开放架构的服务器组件开发平台、企业开发工具和应用程序重新发布工具以及性能评测报告等高级功能。 Visual Studio .NET 是一套完整的开发工具,用于生成 ASP Web 应用程序、XML Web services、桌面应用程序和移动应用程序。Visual Basic

3、 .NET、Visual C+ .NET、Visual C# .NET 和 Visual J# .NET 全都使用相同的集成开发环境 (IDE),该环境允许它们共享工具并有助于创建混合语言解决方案。,1.1 Visual C+.NET编程基础,1.1.2 .NET框架 .NET Framework为所有的.NET开发语言提供了一个公共的运行环境,而不是为每一种语言提供各自不同的运行环境。这个公共的运行环境称为Common Language Runtime(CLR),即公共语言运行时。CLR除了在运行时管理代码的执行之外,CLR也为所有适应CLR的语言提供了一套公共的服务。下面列出了CLR提供的

4、一些重要服务。 公共类型系统(Common Type System,CTS): 它定义了所有.NET语言的标准数据类型及其格式。 公共语言规范(Common Lauage Specification,CLS): 它定义了各语言间互操作性的规则。由于CLS定义了规则,任何一种.NET开发语言创建的类就可以由其他.NET语言使用。 JIT编译器(Just-In-Time编译器): 当.NET应用程序第一次编译时,编译成一种可以由所有.NET语言共享的中间语言。在应用程序执行时,再由JIT编译器把中间语言转换为可以在目标计算机上执行的可执行文件。 代码管理: 在创建和销毁对象时,由CLR负责分配和释

5、放内存。 垃圾收集器(Garbage Collector,GC): 释放无用对象所占用的内存。,1.1 Visual C+.NET编程基础,1.1.3 .NET 框架与Visual Studio.NET之间的关系,1.1 Visual C+.NET编程基础,1.1.4 Visual C+.NET的特点,1、托管(managed)应用 托管应用是使用.NET框架的软件开发工具来编写托管C+语言的.NET应用程序。托管C+语言是对传统C+语言的扩展,它对C+的基本语法没有任何改变,只是对 C+ 语言进行了适当扩展,以帮助 Visual C+ 开发人员编写 .NET Framework 应用程序。用

6、托管C+所编写的.NET程序具有所有.NET框架支持的特点。 2、非托管(unmanaged)应用 非托管应用是通过WIN32的软件开发工具包,在微软基础类库(MFC)的基础上,利用传统的C+语言来编写标准的Windows程序,体现了Visual C+.NET对传统开发模式的兼容性。微软在Visual C+.NET中保留传统的开发模式主要因为 Visual C+具有发展历史长、开发范围广泛、构造出采的应用程序运行效率高、以及具备成熟的开发技术模式等特点,使得Visual C+在许多应用领域依然是宝刀不老的工具。,1.2 Visual C+.NET集成开发环境(IDE),1.2.1 开发界面,1

7、.2 Visual C+.NET集成开发环境(IDE),1.2.1 开发界面,1.2 Visual C+.NET集成开发环境(IDE),1.2.2 解决方案资源管理器,1.2 Visual C+.NET集成开发环境(IDE),1.2.3 对象浏览器,图1-6 Visual Studio.NET的对象浏览器,1.2 Visual C+.NET集成开发环境(IDE),1.2.4 类视图,1.2 Visual C+.NET集成开发环境(IDE),1.2.5 编辑器窗口,1.2 Visual C+.NET集成开发环境(IDE),1.2.6 工具箱,1.2 Visual C+.NET集成开发环境(IDE

8、),1.2.7 服务器资源管理器,图1-10 服务器资源管理器,1.2 Visual C+.NET集成开发环境(IDE),1.2.8 属性窗口,1.2 Visual C+.NET集成开发环境(IDE),1.2.9 菜单栏和工具栏,1.2 Visual C+.NET集成开发环境(IDE),1.2.9 菜单栏和工具栏,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,1、单击【文件】菜单中的【新建】命令的子项【项目】命令,打开【新建项目】对话框。在该对话框左边的【项目类型】列表柜中,单击【Visual C+.NET】选项,然后在右边的【模版】列表框中选中【MFC应用

9、程序】选项,在窗口下方的【名称】文本框中输入新项目的名称,在【位置】文本框中输入项目存放的位置,也可单击旁边的【浏览】按钮来确定项目存放的位置,如图1-13所示。,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,2、完成第1步的设置后,单击【确定】按钮,将弹出【MFC应用程序向导MyFirstApp】对话框,如图1-14所示。该对话框提供了当前项目的设置信息。,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,3、 该对话框左边是选项面板链接选项,单击其中的选项可以对编写的程序框架进行设置。首先单击【应用程序类型】选项,弹出如图

10、1-15所示的选项面板。,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,4、单击【复合文档支持】选项,打开的选项面板询问是否需要复合文档(ActiveX和OLE)的支持。本例中,在【复合文档支持】选项组中选中【无】单选按钮,如图1-16所示。,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,5、单出左边【文档模板字符串】选项,弹出如图1-17所示的对话框。在该对话框中,用户可以设置文档模版的相关信息,如文件的扩展名、文件类型ID、主框架标题、文档类型明、筛选器名、文件的新简称、文件类型全称。用户可以根据自己的需要去改变 ,也

11、可以去默认值。在本例中,我们在文件扩展名文本框中输入的“hwd”,其余选项保持默认设置,如图1-17所示。,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,6、单击左边的【数据库支持】选项,弹出如图1-18所示的选项面板,可以设置是否需要数据库支持。由于本例是一个非常简单的显示字符的MFC程序,所以不用选择数据序支持,故在【数据库支持】选项组中选中【无】单选按钮即可。,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,7、单击【用户界面功能】选项,从弹出的选项面板(如图1-19所示)中可以定义用户界面风格。,1.3 Visual

12、 C+.NET应用程序开发过程,1.3.1 生成应用程序框架,8、单击左边的【高级功能】选项,弹出如图1-20所示的选项面板。在该选项面板中可设置项目的一些高级特点,如“帮助”、“打印”等。,1.3 Visual C+.NET应用程序开发过程,1.3.1 生成应用程序框架,9、单击左边的最后个选项【生成的类】,弹出如图1-21所示的选项面板。在该选项面板中,用户可以设置将要创建的类的属性。,1.3 Visual C+.NET应用程序开发过程,1.3.2 在文件中添加代码,在项目源文件编辑区里的MyFirstAppView.cpp中找到OnDraw() 函数,手动添加代码,如下所示(斜体字为自己

13、加入的代码)。 void CMyFirstAppView:OnDraw(CDC *pDC) pDC-TextOut (150,200, Visual C+.NET欢迎您开始神奇的编程之旅!); ,1.3 Visual C+.NET应用程序开发过程,1.3.2 在文件中添加代码,1.4 应用程序的调试,1.4.1 语法错误的修正 调试程序的第一阶段的主要任务是修正一些语法错误,这其中包括: 未定义的标识符(如函数名、变量名、类名等) 数据类型或参数类型及个数不匹配 其他语法错误 上述语法错误在程序编译后,在输出窗口区的“任务列表”和“输出”窗口中列出所有错误项。每个错误都给出其所在的文件名、行号

14、及其错误编号。如果用户将光标移到输出窗口中的错误编号上,按F1键可启动MSDN并显示出错误的内容,从而帮助用户理解错误产生的原因。,1.4 应用程序的调试,1.4.2 断点的设置和执行 断点是进行程序调试的基本工具,它是指程序中的一个位置,当程序运行到该位置时便停下来,等待调试者发出指令来确定下一步的动作。 在程序中设置断点的方法很多,可以把光标停在程序代码的某一行,然后按F9键,此时在该行的左页边出现一个红点,表明已经在该行设置料一个断点,如图1-24所示。如果再按F9键,则红点消失,断点被取消。,1.4 应用程序的调试,1.4.3 查看和更改变量的值 1、快速监视对话框的使用 快速监视对话

15、框是用来查看或修改某个变量或表达式的值。当然,如果仅仅需要快速查看变量或表达式的值,则只需要将鼠标指针直接放在该变量或表达式上,稍等片刻后,系统会弹出一个小窗口显示出该变量或表达式的值。,图1-26 快速监视对话框,1.4 应用程序的调试,1.4.3 查看和更改变量的值 2、监视窗口的使用 选择【调试】菜单下的【窗口】子菜单中的【监视】菜单的【监视1】命令,则弹出如图1-27所示的监视窗口。用类似的方法可以打开“监视2”、“监视3”和“监视4”窗口,这些窗口都是一样的,每一个监视窗口均有一系列或一组要查看的变量或表达式,用户可以将一组变量或表达式的值显示在同一页面内。,图1-27 监视窗口,1

16、.5 小结 本章介绍了Visual C+.NET的基础知识,包括.NET框架的知识、托管C+和非托管C+的区别和联系以及Visual Studio.NET的集成开发环境、Visual C+.NET应用程序的开发和调试过程等内容。 通过本章的学习,读者应初步掌握Visual C+.NET程序的开发流程,熟悉Visual Studio.NET集成开发环境的使用,为后续课程的学习打下坚实的基础。,思考与练习 简述应用程序、项目和解决方案的概念和区别。 在项目模版创建的应用程序中,文件stdafx.cpp和stdafx.h的作用是什么? 概述Visual Studio.NET起始页面各主要窗口的功能。

17、 概述.NET框架的主要结构。 Visual C+.NET的开发方为包括哪两个方面? 什么是断点?如何向应用程序中添加断点?怎样一次性清除掉应用程序中所有的断点? 在应用程序的调试过程中,如何更改变量的值? 新建一个SDI应用程序,该程序的标题为“我的第一个Visual C+.NET程序”,并在屏幕中央显示“您好,欢迎您来到程序员家园!”,第2章 Windows程序设计基础 勿在浮沙筑高楼,打好基础是关键,教学内容 2.1 Windows编程基础 2.2 MFC程序设计基础 2.3 应用程序框架 2.4 综合实例创建宾馆管理系统的框架 2.5 小结 思考与练习,2.1 Windows编程基础,

18、2.1.1 Windows编程基本概念 1、窗口 窗口是Windows应用程序中一个非常重要的元素。一个Windows应用程序至少要有一个窗口,称为主窗口。 从用户的角度讲,窗口是屏幕上与一个应用程序相对应的矩形区域,是用户与应用程序之间的图形化的接口。每当用户打开一个应用程序时,应用程序就会创建并显示一个窗口;当用户操作窗口中的对象时,窗口就会做出反映;关闭主窗口时就会终止应用程序的运行;通过选择应用程序窗口,就会选择与窗口对应的应用程序。 从程序员的角度讲,窗口是Windows应用程序的基本操作单元,是系统管理应用程序的基本单位,是应用程序与用户之间交互的接口。应用程序的运行过程就是窗口内

19、部、窗口与窗口之间、窗口与系统之间进行数据处理和数据交换的过程。因此,编写应用程序就是要创建一个或多个窗口,管理多个窗口之间的数据处理与交换。,2.1 Windows编程基础,2.1.1 Windows编程基本概念 窗口的特性是由一个WNDCLASS结构体进行定义的。WNDCLASS定义如下: typedef struct tagWNDCLASS UINT style; /窗口风格 WNDPROC lpfnWndProc; /指向窗口处理函数的函数指针 int cbClsExtra; /窗口结构中的预留字节数 int cbWndExtra; /为其它创建窗口预留字节数 HINSTANCE hI

20、nstance; /注册该窗口类的实例句柄 HICON hIcon; /代表该窗口类的图标句柄 HCURSOR hCursor; / 该窗口客户区鼠标光标句柄 HBRUSH hbrBackGround; /该窗口背景颜色句柄 LPCSTR lpszMenuName; /指向窗口菜单名的字符指针 LPCSTR lpszClassName; /指向窗口名的字符指针 WNDCLASS;,2.1 Windows编程基础,2.1.1 Windows编程基本概念 2、句柄 在Windows程序中,每产生一个资源(如图标、光标、窗口、应用程序的实例等),操作系统都要将它们放入相应的内存,并为这些内存指定一个

21、唯一的标识号,这个标识号即该资源的句柄。 操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源的,句柄是系统用来唯一标识某个Windows对象的符号。句柄的数据类型在winnt.h中说明如下: typedef void * HANDLE; 从物理上看句柄是一个泛型(无类型)指针,但它不是指向一个Windows对象的存储首地址,而是指向包含了使用该对象有关信息的一块内存单元。从逻辑上说它是一个代号,一个对象的代号。句柄所指向的内容是不能由句柄操作来改变的,只能由系统来改变。,2.1 Windows编程基础,2.1.1 Windows编程基本概念 3、消息和消息队列 Windows程序设计是

22、面向事件的。在Windows环境下,应用程序启动后,系统等待用户在图形用户界面内的输入选择,如鼠标按键、键盘按键、窗口被创建、关闭、改变大小、移动等,在Windows看来,这些都是事件。只要有事件发生,系统即产生特定的消息,驱动相应的处理函数进行处理,因此Windows 应用程序也称为事件驱动程序。 消息描述了事件的类别,包含了相关信息,Windows应用程序利用消息与系统及其它应用程序进行信息交换。 由于windows事件的发生是随机的,程序的执行先后顺序也无法预测,系统采用消息队列来存放事件发生的消息。每个Windows程序都有一个消息队列,该队列是一个先进先出的缓冲区,通常是一个某种变量

23、类型的数组。,2.1 Windows编程基础,2.1.1 Windows编程基本概念 3、消息和消息队列 在winuser.h中,消息结构的定义如下: typedef struct tagMSG HWND hWnd; /指定消息发向的窗口句柄 UINTmessage;/标识消息的消息值 WPARAMwParam;/消息参数 LPARAMlParam;/消息参数 DWORDtime;/消息进入队列的时间 POINTpt;/消息进入队列时鼠标指针的屏幕坐标 MSG;,2.1 Windows编程基础,4、数据类型,2.1 Windows编程基础,2.1.2 Windows应用程序的结构 1、Wind

24、ows应用程序的构成 构成Windows程序的基本元素包括程序代码、用户界面资源和动态链接库(dynamic-link library)库。 程序代码主要由可执行代码构成,Windows程序要求有两个函数:一个是WinMain。WinMain函数是应用程序的基础,Windows应用程序的入口函数。当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数。另一个是窗口处理函数WndProc,对来自系统的消息进行处理。 资源是应用程序能够使用的一类预定义工具,用户界面资源是应用程序定义的图形用户接口GUI(graphical user interface),如菜单、对话框、按

25、钮等。,2.1 Windows编程基础,2.1.2 Windows应用程序的结构 2、Windows消息处理 (1) 当Windows应用程序开始执行时,操作系统在预定的入口WinMain与应用程序连接。 (2)应用程序创立一个或多个窗口,每个窗口(包括对话框)都有一个窗口过程函数,程序通过窗口接收用户的输入和决定窗口显示。 (3)各种输入产生的消息首先进入系统队列,由系统根据产生消息的窗口将消息发至窗口所在应用程序的消息队列。 (4)程序的消息循环代码段检索从消息队列中来的消息,并把它们返回Windows系统,由系统发送到对应的窗口过程函数进行处理,对于程序未响应的消息,发送至缺省窗口过程函

26、数进行处理。,2.1 Windows编程基础,2.1.3 Windows程序示例 为了帮助读者理解Windows编程的概念,下面编写一个简单的Windows应用程序。该程序创建一个窗口,并在该窗口响应鼠标和键盘消息。程序的实现步骤如下: WinMain函数的定义。 创建一个窗口。 进行消息循环。 编写窗口过程函数,2.2 MFC程序设计基础,2.2.1 MFC类库的层次结构,2.2 MFC程序设计基础,2.2.2 MFC定义的宏、全局函数及全局变量 1. MFC提供的主要宏: 消息映射宏: 声明消息映射表宏DECLARE_MESSAGE_MAP、定义消息映射表宏BEGIN_MESSAGE_MA

27、P和END_MESSAGE_MAP对、消息映射表入口宏ON_加消息名。 动态MFC对象宏: DECLARE_DYNCREATE和DECLARE_DYNAMIC,IMPLEMENT_DYNCREATE和IMPLEMENT_DYNAMIC 运行时类宏:RUNTIME_CLASS 序列化宏: DECLARE_SERIAL和IMPLEMENT_SERIAL 诊断服务宏:ASSERT、VERIFY 跟踪服务宏:TRACE 异常处理宏:THROW,2.2 MFC程序设计基础,2.2.2 MFC定义的宏、全局函数及全局变量 2. 全局函数 MFC提供一些不属于任何类的全局函数,函数名以Afx开头,可以被应用

28、程序中的所有类和函数所调用。如: AfxAbort:无条件终止一个应用程序的执行; AfxGetAppName:返回指向应用程序名的字符串指针; AfxWinInit由WinMain调用,对MFC应用程序进行图形用户界面(GUI)的初始化等等。 AfxGetApp:返回指向应用程序的CWinApp对象的指针。,2.3 应用程序框架,2.3.1 构架Windows应用程序框架 1、创建应用程序框架 使用Visual C+.NET的应用程序向导,生成一个名为AnalyzeMFC的VC+.NET项目。注意,我们这个例程中的应用程序的类型为“单文档”类型。 在项目AnalyzeMFC中,应用程序向导为

29、用户生成了4个类,这些类所对应的头文件和源文件如表2-5所示。,2.3 应用程序框架,2.3.1 构架Windows应用程序框架 2、应用程序的执行过程,2.3 应用程序框架,2.3.2 文档和视图 1、文档与视图的概念: 文档(document)指的是数据组合的抽象,它通常对应磁盘文件,也可以对应I/O端口(包括打印机、键盘)或一块内存空间(串流)。同样的数据,我们可以用不同的方式来表示。把纯的数据放在文件中或数据库中,而把显示方式分离出来,可以让一份数据有多种不同的显示方式,程序中的数据表现称为“视图” (view)。这样就可以分别考虑数据的保存文档,和数据的表现视图。 文档就是数据,CD

30、ocument就可以简单地理解为负责处理数据的类。在MFC编程时,我们应该把所有要处理的从外部获得的数据全部放在文档类及其派生类的对象中。CDocument类是一个预先编好的类,只是提供了一个外壳或者讲框架,程序员可以在Document中建立实际要用的数据格式及其管理方法。最常用的方法当然是派生出自己的文档类(CMyDocument类)。,视图类(CView)负责与使用者接触。文档和视图是数据的两个方面:数据的处理在文档中进行,它使用的是字节、整数、浮点数等数据,链表、顺序表和树、图等数据结构。而数据的表现视图使用的是绘图工具:如绘图域、画笔、调色板等等。CView是为数据的表现而设计的。 C

31、View负责程序与用户之间的交互。用户对数据的编辑、修改,对程序下达工作指令都要依赖窗口上的鼠标与键盘操作才能完成,这些信息由View接受后再传给Document。,2、文档/视图结构的使用: 文档视图结构提供一种连续处理数据的方式,使应用程序的数据与数据的显示分开处理。 数据储存在文档类中(即文档类中包含表示程序数据的成员),数据显示由视图负责。视图是程序窗口的客户区,用户通过视图与程序交互,框架窗口是客户区的框架; 一个文档可以对应多个不同视图,如在Excel应用中,数据既可以以数值方式显示,也可以图形方式显示;而一个视图一般只对应一个文档。当文档数据发生变化时,视图显示的状态也会随之变化

32、;对于多个视图的情况,基于同一文档的多个视图的显示同步变化。,2.3 应用程序框架,3、文档、视图和框架的关系,2.3 应用程序框架,2.3.3 消息映射机制 MFC应用程序与其它Windows应用程序一样,通过消息通知事件的发生,程序响应消息,程序的执行结果取决于对消息的响应方式。MFC引入消息映射(Message Map)机制,简化了但增强了消息处理功能。 消息映射机制定义消息映射表,将消息与处理消息的函数联系在一起;当事件发生产生消息时,在程序中各个类的消息映射表中查找,当找到消息处理函数时,便将消息送至对应的消息处理函数进行处理。每个从CCmdTarget所派生的类都可以接收消息,都可

33、以定义自己的消息映射表Message Map。,2.4 综合实例创建宾馆管理系统的框架,建立应用程序框架。 设置应用程序的标题为“领航宾馆管理系统v1.0”。 使应用程序的主窗口在桌面上居中显示。 改变窗口的背景颜色。,2.5 小结 本章介绍了Windows编程的基本概念,分析了Windows应用程序的结构,并在此基础上,介绍了微软基础类库MFC的基础知识和如何利用Visual C+.NET集成开发环境创建Windows应用程序框架,重点分析了应用程序框架中个个类的功能和结构以及MFC应用程序的执行过程,以便读者能够迅速了解应用程序框架,添加相应的代码来完成自己的程序。最后,通过一个综合实例说

34、明了如何建立应用程序框架,修改应用程序框架以达到自己的目的具体方法。 本章是后续课程学习的基础,读者应该通过程序仔细理解这些内容,为下面软件的开发奠定基础。,思考与练习 理解以下概念:窗口、句柄、消息和消息队列。 MFC的优点有哪些? 文档和视图的作用是什么? 单文档应用程序框架中各个类的作用和功能是什么? 创建一个你需要的SDI应用程序框架,设置断点来跟踪MFC应用程序的执行流程,加深对MFC应用程序执行过程的理解。 利用应用程序向导生成一个多文档的应用程序,在其文档窗口中显示“您好,欢迎您走进VC+.NET世界!”。,第3章 菜单、工具栏和状态栏 设计实用程序界面,增加程序的亲活力,教学内

35、容 3.1 菜单 3.2 工具栏的设计和使用 3.3 状态栏的设计与使用 3.4 综合实例 3.5 小结 思考与练习,3.1 菜单,3.1.1 Windows的菜单 菜单主要由上层水平菜单和与其关联的弹出菜单组成,当用户选择某个水平列表菜单项后,与其相关联的菜单会随之弹出,用户可以在选择执行其中的菜单命令。通常 ,弹出菜单由多个菜单项组成,这些菜单项可以分为三类:(见下图) (1)直接关联某个菜单命令,执行某个相应功能。 (2)弹出一个相关联的对话框,通常这种菜单项后跟随有省略号。 (3)弹出一个相关联的子菜单,这种菜单项后用一个向右的箭头来表示。,3.1 菜单,3.1.2 用编辑器设计菜单

36、1、编辑菜单 在利用应用程序向导创建单文档应用程序时,向导会自动生成标准的菜单资源IDR_MAINFRAME。该菜单资源定义了一组常用的菜单命令,用户可以根据需要来编辑该菜单资源,从而创建出自己的菜单系统。编辑菜单资源的步骤如下: (1)打开菜单资源编辑器,菜单的空位置,3.1 菜单,3.1.2 用编辑器设计菜单 1、编辑菜单 (2)建立顶层菜单 在图3-2中,单击菜单条的新条目框【请在此处输入】,输入新菜单的名称,如“我的菜单”,然后按回车,就可以在指定位置建立一个顶层菜单。 (3)设置菜单项属性: 在菜单条属性窗口中编辑菜单条属性,如图3-3所示。在属性窗口中,用户可以定义菜单的文本内容和

37、资源ID号。虽然,ID号的定义是随意的,但最好按易于记忆的原则来确定。菜单属性窗口中主要属性的含义如表3-1所示。,图3-3 菜单属性窗口,3.1 菜单,3.1.2 用编辑器设计菜单 1、编辑菜单,3.1 菜单,3.1.2 用编辑器设计菜单 2、建立菜单处理函数 (1)菜单消息 WM_COMMAND为菜单命令消息,当选择菜单项或工具栏按钮或激活了加速键会发出命令消息,MFC依据一定的消息传递途径将消息传递给相应的处理函数进行处理,如果在消息传递途径的消息映射表中找不到相应的处理函数,该菜单项或按钮会被禁止使用。 UPDATE_COMMAND_UI是菜单更新消息,处理菜单状态的动态变化。如希望根

38、据程序的执行状态,激活或禁用某些菜单项,设置选中标记,或更改菜单项的文字等,就要定义这一消息处理函数。,3.1 菜单,3.1.2 用编辑器设计菜单 2、建立菜单处理函数 (2) 编写菜单消息处理函数 在编写消息处理函数时,右击该菜单项,在弹出的快捷菜单中选择“添加事件处理程序向导”,打开“添加事件处理程序向导”对话框,如图3-4所示。,3.1 菜单,3.1.3 定义菜单项的加速键,3.1 菜单,3.1.4 菜单创建示例程序 1、建立应用程序MenuExample 2、打开菜单资源编辑器,添加菜单资源 3、编写菜单处理函数 4、给菜单添加快捷键 5、给菜单添加界面更新消息响应函数,当某个菜单被选

39、中后,在该菜单项的前面加上选中标记。,3.1 菜单,3.1.5 动态菜单设计 1、菜单的基本操作 (1)创建菜单 CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架 (2)装入菜单资源 将菜单资源装入应用程序中,需要调用CMenu成员函数LoadMenu()。 (3)添加菜单项 当菜单创建后,用户可以调用AppendMenu或者InsertMenu函数来添加一些菜单项。,3.1 菜单,3.1.5 动态菜单设计 2、动态菜单设计示例 要添加动态菜单,首先要通过全局函数AfxGetMainWnd()得到主窗口指针,再通过该指针调用GetMenu()函

40、数获得指向该顶层菜单的指针,然后通过GetSubMenu(),由它的参数为序号确定哪个顶层菜单项将显示动态菜单。 注意:主菜单项的编号是0为初始值从左到右编排。另外,还需要编写函数,以便接受动态菜单产生变化的命令和动态控制菜单项的状态。,3.1 菜单,3.1.6 快捷菜单的实现 快捷菜单是一种浮动的弹出式菜单,它是一种新的用户界面设计风格。当用户在某处按下鼠标右键时,就会弹出一个相应的浮动菜单,其中提供了一些与当前内容相关的菜单项。 在Visul C+.NET中,利用资源编辑器和MFC的CMenu:TrackPopupMenu()函数可以很容易地创建这样的菜单。,3.2 工具栏的设计和使用,3

41、.2.1 工具栏位图 工具栏中的每一个似乎都应该有自己的位图,但实际上整个工具栏只有一个位图,每一个按钮都在其中占有一个15像素高和16像素宽的位图片。应用程序框架为每一个按钮都提供了一个边框,并且可以通过对按钮的边框及位图颜色的修改来反映当前按钮的状态。 工具栏的位图被保存在应用程序的res子目录下的Toolbar.bmp文件中,它在资源文件中是通过IDR_MAINFRAME来标识的。通常我们不要直接编辑工具栏位图,而是应使用工具栏编辑器来进行编辑。,3.2 工具栏的设计和使用,3.2.2 工具栏和命令消息 当用户用鼠标按下某个工具栏按钮时,就会产生相应的命令消息,该消息可以像菜单命令消息一

42、样进行传递。在大多数情况下,工具栏按钮都和相应的菜单选择相对应。例如,在标准应用程序框架工具栏中,磁盘按钮就和【文件】菜单中的【保存】菜单项相对应,因为它们都产生了ID_FILE_SAVE命令。接收到该命令消息的对象根本用不着关心该消息是通过按下工具栏中的按钮产生的,还是通过菜单选择产生的。 工具栏按钮并不一定非要和菜单项相对应,但如果某个工具栏按钮没有与之对应的菜单项,则建议最好为该按钮定义相应的键盘加速键,以便用户通过键盘来激发该命令。不管工具栏按钮是否有与之相对应的菜单项,我们都可以利用添加消息处理函数向导为它们定义相应的命令消息控制函数和更新命令UI消息控制函数。,3.2 工具栏的设计

43、和使用,3.2.3 工具栏更新命令UI消息控制函数 更新命令UI消息控制函数通常是用来对菜单项进行禁止和复选的,但这些消息控制函数同样也可以用来作用于工具栏按钮:如果更新命令UI消息控制函数用FALSE参数来调用CcmdUI:Enable成员函数,那么相应的按钮就会被置成禁止(变灰)状态,也就不会对作用于它上面的鼠标按键做出任何反应。 对菜单项来说,CcmdUI:SetCheck函数会在菜单项的旁边显示一个复选标记,但对于工具栏来说,SetCheck函数则把它包含的按钮都当作复选框按钮来处理了。如果更新命令UI消息控制函数以参数1来调用SetCheck函数,那么相应的按钮就会被置复选状态;如果

44、更新命令UI消息控制函数以参数0来调用SetCheck函数,那么相应的按钮就会被置未被复选状态;,3.2 工具栏的设计和使用,3.2.4 寻找主框架窗口 如果我们希望既可以在SDI应用程序中,又可以在MDI应用程序通过视图类来访问主框架窗口,那么我们必须通过应用程序对象来获得主框架窗口。全局函数AfxGetApp返回的是一个指向应用程序对象的指针,借助这个指针我们就可以得到CWinApp类的m_pMainWnd数据成员。在MDI应用程序中,应用程序向导自动生成了对m_pMainWnd进行赋值的代码,而在SDI应用程序中,应用程序框架是在视图类的创建过程中对m_pMainWnd进行设置的。m_p

45、MainWnd一旦被设置,我们就可以按如下方式在视图类中得到框架的工具栏: CMainFrame * pFrame = (CMainFrame *)AfxGetApp()-m_pMainWnd; CtoolBar * pToolBar = ,3.3 状态栏的设计与使用,3.3.1 状态栏的定义 状态栏是出现在应用程序窗口底部的显示程序运行状况的窗口,当用户选择了菜单项或某个工具栏按钮时,状态栏显示它们的提示字符串。 状态栏中的子窗口可以分为状态信息行和状态指示器(如图所示)。状态信息行显示应用程序动态提供的字符串,例如单击菜单的命令提示信息,状态指示器显示一些状态信息,如键盘某些键的状态如Ca

46、pslock键的状态。,Static UNIT indicators = ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ,3.3 状态栏的设计与使用,3.3.2 状态栏的常用操作 1、增加和减少窗格:状态栏中的窗格可以分为信息行窗格和指示器窗格两类。若在状态栏中增加一个信息行窗格,则只需在indicators数组中的适当位置中增加一个ID_SEPARATOR标识;若在状态栏中增加一个用户指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示

47、器窗格的大小。若状态栏减少一个窗格,其操作与增加相类似,只需减少indicators数组元素。 2、在状态栏上显示文本:有三种办法可以在状态栏窗格显示文本信息: (1) 调用CWnd:SetWindowText更新信息行窗格(或窗格0)中的文本。 (2) 手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数中调用CCmdUI:SetText函数。 (3) 调用CStatusBar:SetPaneText函数更新任何窗格(包括信息行窗格)中的文本。此函数原型描述如下: BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText,

48、BOOL bUpdate = TRUE );,3.4 综合实例宾馆管理系统菜单、工具栏和状态栏设计,3.4.1 系统功能分析 3.4.2 宾馆管理系统的菜单设计 3.4.3 宾馆管理系统的工具栏设计 3.4.3 宾馆管理系统的状态栏设计,3.5 小结 菜单是Windows应用程序中主要的用户界面组件。在资源视图的Menu节点双击IDR_MAINFRAME项,可以打开菜单编辑器,借助菜单编辑器,用户可以很方便地编辑菜单资源。Windows的菜单包括静态菜单、动态菜单和快捷菜单,MFC提供的CMenu类包含了创建、更新和删除菜单的成员函数,利用这些函数可以在程序执行时动态控制菜单内容、菜单状态和弹

49、出快捷菜单。 工具栏有两个要素:工具栏资源和工具栏类CToolBar。如果用户只需要一个工具栏,可利用向导自动生成,然后再修改之。在MFC中创建一个工具栏包括以下几个步骤: (1) 建立一个工具栏资源,构造CToolBar对象,并调用Create函数建立工具栏,并将其附加到工具栏对象。 (2)调用LoadToolBar函数装入工具栏资源。 状态栏用来给出当前用户操作的提示信息,为用户学习使用应用程序提供方便。状态栏由CStatusBar类进行管理。要在状态栏中插入新的窗格,需要在indicator数据中插入新的字符ID,状态栏将根据这个字符串的长度来确定新窗格的默认宽度。,思考与练习 1、菜单

50、有哪些常用的规则? 2、菜单项的消息有哪些? 3、若同一菜单在视图类和主框架窗口类中都有其消息COMMAND的处理函数,当用户选择该菜单后,会有什么结果?为什么? 4、什么是快捷菜单?用程序实现通常需要哪些步骤? 5、如何使一个工具按钮和某菜单项命令相结合? 6、状态栏的作用是什么?状态栏的窗格分为几类?如何添加和减少响应相应的窗格? 7、如何在状态栏的窗格显示文本?,第4章 对话框设计和编程 构建人机交互界面,提升系统交互能力,教学内容 4.1 对话框基础知识 4.2 对话框设计EX04A示例程序 4.3 滚动条、旋转按钮和滑动条控件 4.4 无模式对话框 4.5 公用对话框 4.6 综合实

51、例宾馆管理系统的界面设计 4.7 小结 思考与练习,4.1 对话框基础知识,4.1.1 对话框的分类 按照运行机制来划分,对话框可分为模式对话框和无模式对话框。 1、对于模式对话框,如打开文件对话框,在该对话框被关闭之前,用户将无法在同一程序的其他地方进行工作。 2、对于无模式对话框,在它仍然保留在屏幕上的同时,用户还可以在应用程序的其它窗口中进行工作。Microsoft Word中的“查找与替换”对话框就是无模式对话框的一个很好的例子,在该对话框打开的同时,我们仍然可以对文档进行编辑。,4.1 对话框基础知识,4.1.2 对话框的组成 1、对话框资源模板 对话框资源模板不但指定了对话框本身的

52、位置、大小、风格等特征,还确定了它所包含的各种控件的位置、大小分割、排列和其他特征,实际上模板中储存了Windows用于创建或显示对话框的所有信息。 2、对话框类 在Visual C+.NET中,每个对话框都必须有一个类与之对应。由于不同的对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类以完成特定功能。CDialog中提供了多个与对话框编程密切相关的函数供程序员调用,从而大大简化了编程代码,提高效率。,4.1 对话框基础知识,4.1.3 对话框的创建,4.2 对话框设计EX04A示例程序,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源 创建对话框资源的步骤

53、如下: 1、运行应用程序向导来产生名为EX04A的单文档的应用程序,并取消“打印和打印预览”选项,其它所有选项选择默认值。 2、插入对话框资源。在应用程序的设计环境中换至“资源视图”框,右击Dialog图标,在弹出的快捷菜单中单击“插入Dialog.”命令,将会在Dialog节点下增加一项ID号为IDD_DIALOG1的对话框模板资源,单击Dialog节点将其展开即可看到。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源 创建对话框资源的步骤如下: 1、运行应用程序向导来产生名为EX04A的单文档的应用程序,并取消“打印和打印预览”选项,其它所有选项选择默认值。 2、插入对话

54、框资源。在应用程序的设计环境中换至“资源视图”框,右击Dialog图标,在弹出的快捷菜单中单击“插入Dialog.”命令,将会在Dialog节点下增加一项ID号为IDD_DIALOG1的对话框模板资源,单击Dialog节点将其展开即可看到。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源3、设置对话框的属性。选中对话框,在“属性”框中设置对话框的标题:“对话框示例”、对话框ID:IDD_MYDIALOG和其他的一些属性,并扩大对话框的边界到合适的大小。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源4、向对话框模板中添加控件。利用控件工具箱加入每一个控件,具

55、体方法如下:用鼠标将控件从工具箱中拖到对话框中合适的位置,释放鼠标,并设置其大小。 说明:在对话框编辑界面下,可以选定一个或通过按住Ctrl键不妨用鼠标左键单击选定多个控件,在对话框中复制并粘贴,可以添加如与原来控件外观一样的新控件。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源5、设置对换框中控件的风格。具体方法如下:用鼠标选定控件,在“属性”对话框中按要求输入控件属性,如在ID框中输入标识控件的唯一ID值,在Caption中输入控件上显示的字符(Edit控件没有这一属性),Visible表示该控件在对话框创建时是否显示,Group用来控制控件分组,Disabled使控件

56、不可用,Tab stop表示是否用Tab键选择控件。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源6、检查对话框的Tab键顺序。从对话框编辑器的【格式】菜单中选择【Tab键顺序】命令,或者同时按下Ctrl+D键,此时每个控件的左上方都有一个数字,表明了当前Tab键次序。然后按图4-5所示用鼠标依次单击各个控件来设置新的Tab键顺序,最后单击对话框或者按下Enter键结束Tab键顺序设置。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源,4.2 对话框设计EX04A示例程序,4.2.2 定义对话框类,4.2 对话框设计EX04A示例程序,4.2.3 对话框的

57、实现 1、在视图类中添加菜单“【对话框】|【学生问卷调查】”,并利用“添加事件向导”为该菜单添加消息响应函数。 2、向菜单的消息响应函数中添加如下代码: CStuDlg dlg; dlg.DoModal(); /显示对话框 3、在视图类的实现文件(.cpp)中加入对话框类的包含文件: #include “StuDlg.h” 4、编译和测试该应用程序。当单击菜单【对话框】的【学生问卷调查】命令将弹出学生问卷调查对话框。,4.2 对话框设计EX04A示例程序,4.2.4 对话框程序的完善 1、为对话框类加入与控件相对应的成员变量 对话框的主要功能是通过所包含的控件进行数据的输入和输出,要使对话框能

58、与程序通讯,还需给对话框类增加数据成员,以保存各控件的初始值,并从控件读取数据。 与控件对应的成员变量既可以是一个数据变量,也可以是一个控件对象,这将由具体需要来确定。如果是需要交换的控件,则定义对应的数据变量。 如果需要在程序中对控件进行控制,则定义对应的对象。例如,编辑框指定一个CEdit对象,通过CEdit对象,程序员可以控制控件的行为。,4.2 对话框设计EX04A示例程序,4.2 对话框设计EX04A示例程序,4.2.4 对话框程序的完善 2、数据交换和检验 对话框程序运行时,用户更改控件属性,如在编辑框中输入文字或改变复选框的选中状态时,MFC会修改对应控件变量的值。这个过程是通过

59、MFC为对话框类自动添加的成员函数DoDataExchange()实现的,称为对话框数据交换和检验机制。 控件和控件变量之间的数据交换并非自动完成的,而是需要调用CDialog:UpdateData()函数才能实现从控件到控件变量或者从控件变量到控件的数据传送。 CDialog:UpdateData()函数的原型为: BOOL UpdateData(BOOL bSaveAndValidate=TRUE); bSaveAndValidate参数用于指定数据的传输方向,TRUE表示将数据从控件传送给变量,FALSE则表示将数据从变量传给控件。,4.2 对话框设计EX04A示例程序,4.2.4 对话框程序的完善 3、为对话框类添加控件通知消息的处理函数 (1)对CDialog的OnInitDialog函数进行重写,以实现对话框控件的初始化。具体方法如下:将工作区视图切换到“类视图”,并选中对话框类CStuDlg,在该类的属性对话框中用鼠标单击“重写”图标,添加OnInitDialog函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论