1、可视化程序设计Visual C+第1 章 Visual C+程序的建立 1.1 C 程序和C+程序 1.2 Visual C+程序 1.3 使用MFC AppWizard 应用程序向导 1.4 ClassWizard 类向导 1.5 章后实训下一页返回第2 章 菜单、工具栏和状态栏的设计 2.1 设计菜单 2.2 工具栏 2.3 状态栏 2.4 章后实训上一页 下一页返回第3 章 对话框与控件 3.1 对话框的使用 3.2 资源与资源标识 3.3 创建对话框及添加控件 3.4 控件的创建和使用方法 3.5 常用控件 3.6 标签控件、图像列表、属性表及属性页 3.7 向导对话框 3.8 菜单对
2、话框 3.9 章后实训上一页 下一页返回第4 章 窗口、文档和视图 4.1 主窗口和文档窗口 4.2 改变窗口的状态 4.3 文档串行化 4.4 不同视图的应用 4.5 串行化MDI(多文档)应用程序实例 4.6 章后实训上一页 下一页返回第5 章 图形绘制 5.1 设备环境与设备环境类 5.2 绘图程序 5.3 图形设备接口对象 5.4 颜色和颜色对话框 5.5 字体CFont 类 5.6 位图、图标 5.7 章后实训上一页 下一页返回第6 章 数据库应用 6.1 数据库、DBMS 和SQL 6.2 MFC 的ODBC 编程技术 6.3 MFC 的ODBC 应用编程 6.4 数据库相关的Ac
3、tiveX 控件 6.5 章后实训上一页 下一页返回第7 章 多媒体技术 7.1 使用MCI 播放WAVE 文件的程序实例 7.2 MCI 7.3 MCI 编程步骤 7.4 使用MCIWnd 窗口类 7.5 章后实训 上一页返回前 言Visual C+1.0 是Microsoft 公司1993 年推出的一个功能强大的可视化软件开发工具。随着其版本的不断更新,1998 年推出的Visual C+6.0 有了较大的改进,得到了广泛的应用,并已成为目前专业程序员进行软件开发的首选工具。Visual C+6.0 不仅是一个C+编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(Inte
4、grated Development Environment,IDE)。它提供了一个高效的Windows 编程环境,将程序和资源的编辑、编译、调试和运行融为一体,具有其独特的优越性能。由于它任何时候都可以调用所有的Win32 函数,因而能灵活处理像写磁盘和串口访问这样的Java等语言不能处理的任务。Visual C+的最大特点就是提供面向对象技术的支持,它利用类把大部分与用户界面设计有关的Windows API 函数封装起来,通过MFC(Microsoft Foundation Class)类库的方式提供给开发人员使用,大大提高了程序代码的重用性。下一页返回它还提供一个功能强大的应用程序生成向
5、导AppWizard,它能使用户编程省去烦琐的初始化代码,自动生成一个运行程序框架,用户只需按自己的意图添加相关的代码,就能得到一个满意的应用程序。本书实例中的每条语句代码几乎都标有注释和说明,便于读者阅读和理解程序的设计思想,更好地掌握程序设计方法。一般在提出问题前都会首先举出实际例题,让读者先有感性认识,再进行理论上的讲解,使读者感到清晰、易懂。经过两年的使用和推广,现对本书进行了全面的修订。修订后的教材在第一版的基础上进行了内容的重新组织与更新,增加了一些最新的、实用的知识和案例。上一页 下一页返回第1 章 Visual C+程序的建立 1.1 C 程序和C+程序 1.2 Visual
6、C+程序 1.3 使用MFC AppWizard 应用程序向导 1.4 ClassWizard 类向导 1.5 章后实训下一页返回1.1 C 程序和C+程序 一般有了C 和C+的编程基础,就能很好地运用Visual C+编程工具开发Windows 应用程序。下面先用C 语言、C+语言编写一个同样的显示学生信息的程序,来熟悉一下它们的编程方法。特别是通过C+程序设计,进一步掌握面向对象的编程技术,这将对学好可视化的Visual C+程序设计起到促进作用。例1.1用C 语言编写显示学生信息的程序。将Visual C+6.0 软件安装到本机器后,创建其桌面快捷方式。在常用的e 盘上建一个文件夹,名为
7、“vcpp”。双击桌面Visul C+6.0 快捷方式图标,在打开的窗口中选择“File”“New”命令,在弹出的对话框中展开“Files”选项卡,选择“C+Source File”选项,然后在右边“File”处写要建的文件名“学生信息1”,在其下面的“Location”即路径名处写“e:vcpp”,单击“OK”按钮,如图1.1 所示。在出现的界面(文档窗口)上可输入C 程序,输入的C 程序如下:下一页返回1.1 C 程序和C+程序#include#include struct student/定义student 结构体类型 long num;/学号 char name20;/姓名 char
8、sex10;/性别 float score;/成绩 stu,*p;/直接定义student 结构体类型变量stu 和student 结构体类型指针*p int main()上一页 下一页返回1.1 C 程序和C+程序 p=&stu;/student 结构体的起始地址赋给指针变量p stu.num=89101;/将学号赋给stu 结构体变量中的成员num strcpy(stu.name,李明);/将姓名赋给stu 结构体变量中的成员name strcpy(stu.sex,男);/将性别赋给stu 结构体变量中的成员sex stu.score=89.5;/将成绩赋给stu 结构体变量中的成员sco
9、re/以下两个printf()函数输出的结果是相同的 printf(学号 No.:%ldn 姓名 name:%sn 性别 sex:%sn 成绩 score:%2.1fn,stu.num,stu.name,stu.sex,stu.score);/stu.num表示stu 结构体变量中的成员num上一页 下一页返回1.1 C 程序和C+程序 printf(n 学号 No.:%ldn 姓名 name:%sn 性别 sex:%sn 成绩 score:%2.1fn,p-num,p-name,p-sex,p-score);/p-num 是代替(*p).num 的书写形式,也就是p-num/等价于(*p).
10、num,它表示p 指向结构体变量stu 中的成员num return 0;程序输完后,单击本界面最上面菜单的“Build”再单击其子菜单的“Build”在出现的对话框中单击:“是”“是”再单击工具栏上的 (编译运行)按钮,便出现图1.2 的结果。上一页 下一页返回1.1 C 程序和C+程序 例1.2用C+编写显示学生信息的程序。(1)双击桌面Visul C+6.0 快捷方式图标 ,在打开的窗口中选择“File”“New”命令,在弹出的对话框中展开“Projects”选项卡,选择“Win32 Console Applicator”选项,然后在“Location”处写“e:vcpp”,在“Proj
11、ect name”处写文件名“学生信息2”,再单击“OK”按钮,在弹出的对话框中依次单击“Finish”“OK”按钮。(2)再在主菜单处选择“File”“New”命令,在弹出的对话框中展开“Files”选项卡,选择“C+Source File”选项,右边的“Add to Project”要置于选中状态(),并显示出刚才输入的文件名,然后在“File”处写“学生信息2.cpp”,单击“OK”按钮,如图1.3 所示。在出现的窗口界面(文档窗口)中输入C+程序,输入的C+程序如下:上一页 下一页返回1.1 C 程序和C+程序#include#include /类的说明部分 class student
12、/定义类(class)student private:/私有部分 public:/公共部分 long num;/学号 char name20;/姓名 char sex10;/性别 float score;/成绩 void sc();/输出函数上一页 下一页返回1.1 C 程序和C+程序 protected:/保护部分;/类的实现部分 void student:sc()/在student 类里面定义的函数sc()的具体实现 student stu;student*p=&stu;stu.num=89101;strcpy(stu.name,李明);strcpy(stu.sex,男);stu.scor
13、e=89.5;/以下两种输出结果都是相同的上一页 下一页返回1.1 C 程序和C+程序 cout学号 No:stu.numn;/一般对象成员 cout姓名 name:stu.namen;cout性别 sex:stu.sexn;cout成绩 score:stu.scorenn;cout学号 No:numn;/指针对象指向的成员 cout姓名 name:namen;cout性别 sex:sexn;cout成绩 score:scoreTextOut(20,100,pDoc-str1);pDC-TextOut(20,120,pDoc-str2);上一页 下一页返回1.3 使用MFC AppWizard
14、 应用程序向导(11)编译并运行,单击编译工具栏 上的“运行”工具按钮或按【Ctrl】+【F5】组合键,系统开始编译并运行,运行结果如图1.17 所示。可以看到,“学生信息3”和“显示两行字”这两个程序,在定义变量时用的方法不同。“学生信息3”是在视图类的实现文件中直接定义变量并赋值,直接用TextOut 函数输出。而“显示两行字”程序是在文档类头文件即“显示两行字Doc.h”中定义变量,在文档类实现文件即“显示两行字Doc.cpp”中的构造函数里赋初值,在视图类的实现文件即“显示两行字View.cpp”中的OnDraw 函数里用文档类指针pDoc 指向变量,输出变量内容。注意,在文档类定义变
15、量,在视图类输出,一定要用指针完成,视图类OnDraw 函数中的“CMyDoc*pDoc=GetDocument();”语句是系统自动生成的,它就是将文档类的首地址赋给pDoc,直接用pDoc 指向文档类中的变量,就能完成在视图类中输出文档类中变量的值的目的。上一页 下一页返回1.3 使用MFC AppWizard 应用程序向导 1.3.3 项目工作区项目工作区窗口如图1.16 所示,包含用户项目的一些信息,如类、项目文件以及资源等。在项目工作区窗口中的任何标题或图标处右键单击,都会弹出相应的快捷菜单,包含当前状态下的一些常用操作。1.FileView 页面FileView 页面将项目中所有文
16、件分类显示,每一类文件在FileView 页面都有自己的目录项(节点)。(1)应用程序类对象:CMyApp.h(头文件)、CMyApp.cpp(实现文件)。应用程序类主要用于应用程序对象的初始化和运行,它实际上是Windows 最先运行的,当这个程序开始时,它将会把主窗口放在屏幕上。C 或C+是从main()主函数开始执行,而Visual C+是从WinMain()函数开始执行,且WinMain()函数就隐含在此应用程序中。应用程序类对象CMyApp 的基类是CWinApp,而CWinApp 的基类又是CWinThread。上一页 下一页返回1.3 使用MFC AppWizard 应用程序向导
17、 CWinThread类是用来完成对线程的控制,包括对线程的创建、运行、终止和挂起等。(2)主框架类对象:CMainFrm.h(头文件)、CMainFrm.cpp(实现文件)。主框架类对象CMainFrm 的基类是CFrameWnd,该类主要是显示主窗口,是找到菜单栏、窗口的标题栏以及工具栏的地方。主窗口对象负责窗口中出现的、围绕操作领域的一切,如图画、文本和其他图形,这个区域称为窗口中的客户区。它用于管理应用程序窗口显示,如标题栏、菜单栏、工具栏、状态栏、控制菜单、控制按钮等。它是所有MDI(多文档)和SDI(单文档)子窗口的包容器。上一页 下一页返回1.3 使用MFC AppWizard
18、应用程序向导(3)视图类对象:CMyView.h(头文件)、CMyView.cpp(执行文件)。视图类对象CMyView 的基类是CView,用于处理客户区,完成用户与文档的交互工作,是在程序中设置数据格式及显示数据的位置。(4)文档类对象:CMyDoc.h(头文件)、CMyDoc.cpp(实现文件)。文档类对象CMyDoc 的基类是CDocument,它主要是为程序存储数据,而在视图对象中处理并显示。它包含了应用程序在运行期间所用到的数据文档。(5)其他有关文件。1)Resource.h:是标准的头文件,包含所有资源符号的定义。上一页 下一页返回1.3 使用MFC AppWizard 应用程
19、序向导 2)StdAfx.h:用于建立预编译头文件(文件名.pch)和一个预定义的类型文件StdAfx.obj,由于MFC 体系结构非常大,如果每次都编译则很烦琐,因此,把常用的MFC 头文件都放在StdAfx.h 中,如afxwin.h、afxext.h、afxdisp.h 等,然后让StdAfx.cpp 包含StdAfx.h 文件。这样由于编译器可以识别哪些文件已经编译过,所以StdAfx.cpp 就只编译一次。因为它存放的是头文件编译后的信息,故称作预编译头文件。如果以后在编程时不想让有些MFC 头文件每次都被编译,也可以将它加入到StdAfx.h 中,采用预编译头文件,可以加速编译过程
20、。3)文件名.clw:是ClassWizard 数据库文件,存放由ClassWizard 使用的信息,Wizard还使用这个文件来存储信息,以便创建和编辑消息映射、对话框数据映射以及创建成员函数的原型。上一页 下一页返回1.3 使用MFC AppWizard 应用程序向导 4)CMy.rc:是包含资源描述信息的资源文件,资源文件列有应用程序用到的所有资源包括存储在“res”子文件夹中的位图、图标和光标,这个文件可以在Visual C+6.0 中直接编辑。5)CMy.rc2:包含不是由Visual C+6.0 编辑的资源,可以将所有不能由资源编辑器编辑的资源放置到这个文件中。6)CMyDoc.i
21、oc:是包含MDI 子窗口图标的图标文件,这个图标包含在资源文件的文件名.rc 中。7)CMy.ioc:是包含应用程序图标的图标文件,应用程序图标包含在资源文件CMy.rc 中。8)Toolbar.bmp:用于创建工具栏按钮的位图文件、初始工具栏和状态栏,是在主边框窗口类中构造。上一页 下一页返回1.3 使用MFC AppWizard 应用程序向导2.ResourceView 页面ResourceView 包含了项目中所有资源的层次列表,在Visual C+中,每一个图片、字符串值、工具栏、图标或其他非代码元素等都可以看作是一种资源。(1)Accelerator:快捷键列表,一系列组合键的集合
22、,被应用程序用来引发一个动作。该列表一般与菜单命令相关联,用来代替鼠标操作。(2)Bitmap:位图,图形映射的二进制形式。位图常被应用程序用于产生滚动条、最小化框和最大化框等。(3)Cursor:光标,这是一个32 像素32 像素的位图,它指示鼠标当前在屏幕上的位置。(4)Dialog:对话框,含有按钮、列表框、编辑框等各种控件的窗口。(5)Icon:图标,图标代表应用程序显示在Windows 桌面上的位图,它同时有32 像素32 像素和16 像素16 像素两种规格。(6)Menu:菜单,用户通过菜单可以完成应用程序的大部分操作。上一页 下一页返回1.3 使用MFC AppWizard 应用
23、程序向导(7)String Table:字符串列表,它是应用程序使用的全局字符串列表。(8)Toolbar:工具栏按钮,它由一系列具有相同尺寸的位图组成的,通常与一些菜单命令项相对应,用以提高用户的工作效率。(9)Version:版本信息,包含应用程序的版本、用户注册码等相关信息。3.ClassView 页面 ClassView 用以显示项目中的所有的类的信息。(1)CAboutDlg:是对话框类,该类是每一个应用程序框架都有的,用于显示本程序的有关信息。它是从MFC 的CDialog 类派生来的。(2)其他还包括:MainFrm(主框架类)、CMyApp(应用程序类)、CMyView(视图类
24、)、CMyDoc(文档类)。Globals 是应用程序的实现文件。上一页 下一页返回1.3 使用MFC AppWizard 应用程序向导 4.文件类型 在Visual C+6.0 中,项目中所有的源文件都是采用文件夹的方式进行管理的,它将项目名作为文件夹名,在此文件夹下包含以下一些文件类型。(1).cpp,.h:源程序代码文件(.cpp 是实现文件,.h 是头文件)。(2).dsp:项目文件(DeveloperStudio Project)。(3).dsw:项目工作区文件。(4).opt:关于开发环境的参数文件,如工具条位置等信息。(5).plg:编译信息文件。(6).aps:资源辅助文件(A
25、ppStudio File),二进制格式。(7).bsc:用于浏览项目信息。(8).clw:类向导ClassWizard 信息文件。上一页 下一页返回1.3 使用MFC AppWizard 应用程序向导(9).hpj:帮助文件项目(Help Project)。(10).map:执行文件的映像信息记录文件。(11).mdp:旧版本的项目文件(Microsoft DevStudio Project)。(12).pch:预编译文件(Pre-Compiled File),可以加快编译速度,但是文件非常大。(13).pdb:记录程序有关的一些数据和调试信息(Program Database)。(14).
26、exp:记录DLL 文件中的一些信息,只有在编译DLL 时才会生成。(15).ncb:无编译浏览文件(no compile browser)。(16)Debug:调试文件夹。(17)Release:发行文件夹。(18)Res:资源文件夹。上一页 下一页返回1.3 使用MFC AppWizard 应用程序向导 当用户用Visual C+6.0 应用程序向导创建项目时,系统会自动为项目创建Win32 Debug(或让其自动生成Win32 Release)的运行程序,并使用相应的默认配置。它和Win32 Release版本的区别在于:Debug 版本的运行程序有相应的调试信息码,而Release 版
27、本的运行程序没有相应的调试信息码。但Release 版本的运行程序经过代码的优化,其程序的运行速度被最大加速。Visual C+程序编译后的Debug 要在有Visual C+系统环境下运行,而Release 可在无Visual C+系统环境下运行。创建Release 的步骤是:在程序窗口中选择“Build”“Set Active Configuration”命令,在弹出的对话框中选择“文件名-Win32 Release”选项,然后单击“OK”按钮。这时在本程序文件夹中就有了Release,把该程序复制到没安装Visual C+系统环境的机器里也能运行。上一页 下一页返回1.3 使用MFC A
28、ppWizard 应用程序向导 1.3.4 输出窗口 输出窗口如图1.16 所示,常常见到程序编译完后,若正确则在此窗口中显示“文件名.exe 0 error(s),0 warning(s)”,若错误就在该窗口中出现一些错误信息。双击这些错误信息后,再到文档窗口的程序里查找已用箭头指示出的错误。从出现的第一个错误信息开始查,顺序地排除每个错误,程序就正常运行了。上一页返回1.4 ClassWizard 类向导 ClassWizard 称为类向导,能为一个项目添加一个类,进行消息和数据映射,创建OLEAutomation(自动化)属性和方法以及进行ActiveX 事件处理等。1.4.1 Clas
29、sWizard 的使用 例1.5用鼠标单击程序窗口,就能弹出一个对话框。(1)创建一个单文档的应用程序,名为“显示对话框”。(2)在视图类中添加鼠标左键按下映射消息:在程序窗口中选择菜单“View”“ClassWizard”(或按【Ctrl】+【W】组合键),在弹出的对话框中选择“Message Maps”选项卡,在“Class name”下拉列表框中选择“CMyView”(视图类),在“Object IDs”列表框中选择“CMyView”,在“Messages”列表框中找到并选中鼠标左键按下映射消息“WM_LBUTTONDOWN”,如图1.18 所示,单击“Add Function”按钮,然
30、后单击“Edit Code”按钮。下一页返回1.4 ClassWizard 类向导(3)在视图类中为刚刚添加的OnLButtonDown()函数中添写代码:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)MessageBox(攀登计算机科学高峰,鼠标左键按下消息,0);CView:OnLButtonDown(nFlags,point);说明:MessageBox(“攀登计算机科学高峰”,“鼠标左键按下消息”,0)函数只用于创建和显示消息对话框。参数:“攀登计算机科学高峰”:消息正文;“鼠标左键按下消息”:消息框标题(默认没有);0:消息框
31、的风格。上一页 下一页返回1.4 ClassWizard 类向导(4)编译运行,用鼠标单击程序窗口,就弹出如图1.19 所示的对话框。该程序就使用了ClassVizard(类向导),将“鼠标左键按下消息”映射到项目的视图类中,完成了程序要达到的目的。说明:在文档编辑窗口中任意处右键单击,从弹出的快捷菜单中也能选择ClassVizard 命令。可以看到“MFC ClassWizard”对话框包含了五个标签页面,其中最常用的有以下两个。(1)Message Maps(消息映射):用于添加、删除和编程处理消息的成员函数。(2)Member Variables(成员变量):添加或删除与控件相关联的成员
32、变量(或称为数据成员),以便与控件进行数据交换。例1.5 的程序设计中用到了“Message Maps”选项卡,如图1.18所示,表1.3 列出了其中的各项功能。上一页 下一页返回1.4 ClassWizard 类向导 1.4.2 消息和消息映射 Windows 编程与其他类型编程的最大不同之处在于使用消息机制。在Windows 中发生的一切都可以使用消息作为媒体来表示。消息用于告诉操作系统发生了什么,例如用户的键盘操作、鼠标操作、打印操作等都可以用消息来传递。窗口之间也可以使用消息来通信。可以说,消息机制是Windows 应用程序的核心。1.Windows 消息 在Windows 中,所有消
33、息都是通过各自的名字来访问的,当然对于不同的操作系统使用不同的数值来标记它们。一系列#define 语句将消息与特定数值相联系。例如,下面的语句定义了一条叫作WM_PAINT 的消息:#define WM_PAINT 120上一页 下一页返回1.4 ClassWizard 类向导 可以在程序中通过此消息名“WM_PAINT”来访问它。在Windows 中,不同的消息由应用程序的不同部分进行处理。例如,在窗口中的某个控件上右击,该控件将会接收一条WM_RBUTTONDOWN 消息,相应的程序就会处理这条消息;在窗口中右击,就会弹出一个快捷菜单等。2.消息分类(1)窗口消息(Windows mes
34、sage):窗口消息主要是指以WM_开头的消息(WM_COMMAND除外),一般由窗口类和视图类对象来处理,窗口消息往往带有参数,以标志处理消息的方法。窗口消息包括以下几项:上一页 下一页返回1.4 ClassWizard 类向导 1)鼠标消息,如图1.20 所示。WM_MOUSEMOVE 鼠标移动时发送该消息 WM_LBUTTONDOWN 鼠标左键被按下时发送该消息 WM_LBUTTONUP 鼠标左键被释放时发送该消息 WM_LBUTTONDBLCLK 鼠标左键被双击时发送该消息 WM_RBUTTONDOWN 鼠标右键被按下时发送该消息 WM_RBUTTONUP 鼠标右键被释放时发送该消息
35、WM_RBUTTONDBLCLK 鼠标右键被双击时发送该消息 WM_MBUTTONDOWN 鼠标中键被按下时发送该消息 WM_MBUTTONUP 鼠标中键被释放时发送该消息 WM_MBUTTONDBLCLK 鼠标中键被双击时发送该消息上一页 下一页返回1.4 ClassWizard 类向导 2)键盘消息,如图1.21 所示。WM_CHAR 将一次单击翻译成一个非系统字符时,发送该消息 WM_KEYDOWN 按一个非系统键盘时,发送该消息 WM_KEYUP 释放一个非系统键时,发送该消息 3)与窗口操作有关的消息,如图1.22 所示。WM_CREATE 生成一个窗口时发送该消息 WM_DESTR
36、OY 销毁一个窗口时发送该消息 WM_CLOSE 关闭一个窗口时发送该消息 WM_SIZE 改变窗口大小时发送该消息 WM_MOVE 移动一个窗口时发送该消息上一页 下一页返回1.4 ClassWizard 类向导 WM_PAINT 当窗口的大小发生变化、窗口内容发生变化、窗口间的层叠关系发生变化或调用函数UpdateWindow 或RedrawWindow 时,系统都将产生WM_PAINT 消息。表示要重新绘制窗口的内容。该消息处理函数的原型是“afx_msg void OnPaint();”。WM_ACTIVATE 激活窗口或关闭窗口 WM_ACTIVATEAPP 正被激活的窗口属于不同的
37、app WM_CANCELMODE 取消系统模式 WM_CHIDACTIVATE 移动的窗口 WM_ENABLE 窗口被激活或关闭 WM_ENDSESSION 会话结束 WM_ENTERIDLE 静待用户操作上一页 下一页返回1.4 ClassWizard 类向导 WM_ERASEBKGND 背景需要被清除 WM_GETMINMAXINFO 获得关于窗口大小的信息 WM_GETTEXT 获得相应于窗口的文本 WM_GETTEXTLENGTH 获得和窗口相关的文本长度 WM_ICONERASEBKGND 窗口背景需要被清除 WM_KILLFOCUS 用户按下不属于当前菜单中的键 WM_MENUS
38、ELECT 选取的菜单项 WM_PAINTICON 重画部分图标 WM_PARENTNOTIFY 窗口被创建或清除 WM_QUERYENDSESSION 结束会话命令 WM_QUIT 退出应用程序 WM_SETFOCUS 设置输入焦点上一页 下一页返回1.4 ClassWizard 类向导 WM_SETFONT 字体更改 WM_SETREDRAW 清除重画标志 WM_SETTEXT 设置窗口标题 WM_SHOWWINDOW 窗口将被隐藏或显示(2)控件通知消息(Control notifications):如图1.23 所示。当控件的状态发生改变(例如用户在控件中进行输入)时,控件就会向其父窗
39、口发送WM_COMMAND 通知消息。应用程序框架处理控件消息的方法和窗口消息相同,但按钮的BN_CLICKED 通知消息除外,它的处理方法与命令消息相同。上一页 下一页返回1.4 ClassWizard 类向导(3)命令消息(Command message):主要包括由用户交互对象(菜单、工具条按钮、加速键等)发送的WM_COMMAND 命令消息。命令消息的处理方式与以上两种消息不同,它能够被多种对象接收、处理,这些对象包括文档类、文档模板类、应用程序本身以及窗口和视图类等;而窗口消息和控件的通知消息是由窗口对象接收并处理的。这里的窗口对象是指CWnd 中派生的对象,它包括CFRameWnd
40、、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些类派生的对象等。3.消息映射系统自动生成的代码 查看例1.5 的程序代码,可以发现:ClassWizard 为WM_LBUTTOMDOWN(鼠标左键按 下)的消息映射做了以下3 个方面的工作。(1)在视图类的头文件“显示对话框View.h”中声明了鼠标左键按下的消息处理函数OnLButtonDown,即:上一页 下一页返回1.4 ClassWizard 类向导 protected:/AFX_MSG(CMyView)afx_msg void OnLButtonDown(UINT nFlags,CPoint
41、point);/AFX_MSG DECLARE_MESSAGE_MAP()代码中的“/AFX_MSG(CMyView)”和“/AFX_MSG”之间的部分是ClassWizard 定义的专门用作消息映射函数声明的标记。表示该程序块中的消息映射声明是由ClassWizard来自动管理的,用户一般不需要去更改。需要说明的是,凡“/”和“/”之间的程序代码块均由ClassWizard 自动管理。(2)在视图类的“显示对话框View.cpp”实现文件的消息入口处,添加了相应的映射宏ON_WM_LBUTTONDOWN(),即:上一页 下一页返回1.4 ClassWizard 类向导 BEGIN_MESSA
42、GE_MAP(CMyView,CView)/AFX_MSG_MAP(CMyView)ON_WM_LBUTTONDOWN()/AFX_MSG_MAP(3)在视图类的“显示对话框View.cpp”实现文件中写入一个空的消息处理函数的模板,以便用户填入具体代码,即:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call default CView:OnLButtonDown(nFlags,point);注意:如果要删除消息映射函数,需进行以下3 步
43、:上一页 下一页返回1.4 ClassWizard 类向导 在MFC ClassWizard 对话框的“Massages”列表框中选择要删除的消息映射函数,然后单击“Delete Function”按钮,最后关闭“MFC ClassWizard”对话框。在所在的类头文件(.h)的消息声明标记中删除该消息映射函数,在所在的类实现文件(.cpp)的消息声明入口处删除该消息映射宏。在所在的类实现文件(.cpp)中删除该消息映射函数体。1.4.3 消息映射方法实例 1.鼠标映射消息 鼠标是Windows 操作系统中最重要的输入工具之一。在MFC 中,鼠标输入,Windows将会产生相应的消息。例如,按
44、下鼠标左键时,Windows 就会产生WM_LBUTTONDOWN消息,释放鼠标左键时就会产生WM_LBUTTONUP 消息。上一页 下一页返回1.4 ClassWizard 类向导 如果需要,用户只要对这些消息编写相应的响应函数就能完成相应的功能,其中大部分的消息,Windows 系统均有默认的处理。例1.6鼠标映射消息。在屏幕x,y 坐标各为100 处,显示“鼠标位于点”,当鼠标移动时,显示出鼠标不断变化的位置和鼠标按下、鼠标释放的位置变化。(1)创建一个单文档应用程序,名为“处理鼠标”。(2)声明视图类的数据成员,为了记录用户操作鼠标的方式和位置,需定义一个变量存储,因此,在视图类头文件
45、CMyView.h 里的public 下添加一个数据成员:CString m_MousePoint;/存储鼠标的方式和位置在视图类执行文件CMyView.cpp 的构造函数中初始化该数据成员:上一页 下一页返回1.4 ClassWizard 类向导 m_MousePoint=;/将存储鼠标的方式和位置初始置为空(3)在视图类执行文件CMyView.cpp 的屏幕重画函数OnDraw()中添加输出代码:void CMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(100,100,m_Mou
46、sePoint);(4)按照例1.5(2)的操作步骤,在视图类中添加鼠标左键被按下时发送的消息WM_LBUTTONDOWN。上一页 下一页返回1.4 ClassWizard 类向导(5)再按照例1.5(2)的操作步骤,在CMyView 类中,添加鼠标左键被释放时发送的消息WM_LBUTTONUP 和鼠标移动时发送的消息WM_MOUSEMOVE。(6)分别为鼠标左键被按下、鼠标左键被释放和鼠标移动消息响应函数编写代码:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)/鼠标左键被按下 /在屏幕上显示鼠标所在位置的坐标 m_MousePoint
47、.Format(鼠标左键在点(%d,%d)按下,point.x,point.y);Invalidate();/强制执行OnDraw()函数,显示x,y 坐标的值 CView:OnLButtonDown(nFlags,point);上一页 下一页返回1.4 ClassWizard 类向导 void CMyView:OnLButtonUp(UINT nFlags,CPoint point)/鼠标左键被释放 CView:OnLButtonUp(nFlags,point);void CMyView:OnMouseMove(UINT nFlags,CPoint point)/鼠标移动 m_MousePo
48、int.Format(鼠标位于点(%d,%d),point.x,point.y);Invalidate();CView:OnMouseMove(nFlags,point);上一页 下一页返回1.4 ClassWizard 类向导(7)编译运行,结果如图1.24 所示。说明:1)Format()是格式打印函数,CString 类里定义了该函数,和C 语言中的printf 语句相似。其参数:“鼠标位于点(%d,%d)”在屏幕上显示其中的实际内容,并按%d、%d整型输出第2 个和第3 个参数的数字,就是x,y 的坐标。m_MousePoint 是CMyView.h 中定义的存储鼠标的方式和位置的CS
49、tring 类对象。2)m_MousePoint 是程序中在CMyView.h 中自己定义的存储鼠标的方式和位置的CString 类对象。3)Invalidate()函数的作用是使系统让用户区无效,从而调用重画函数OnDraw(),所以用户只要在OnDraw()中编写显示m_MousePoint 的语句即上一页 下一页返回1.4 ClassWizard 类向导 4)对于所有的鼠标消息来说,ClassWizard 都会将其映射成类似afx_msg void On的消息处理函数,如上面的鼠标左键按下映射消息函数OnLButtonDown,它具有如下函数原型:afx_msg void OnLButt
50、onDown(UINT nFlags,CPoint point)参数:point:表示鼠标光标在屏幕的(x,y)坐标。nFlags:表示鼠标键和键盘组合情况,它可以是下列值的组合(MK 是前缀,表示是“鼠标键”):MK_CONTROL 键盘上的【Ctrl】键被按下时,nFlags 设置为MK_CONTROL MK_LBUTTON 鼠标左键被按下时,nFlags 设置为MK_LBUTTON MK_MBUTTON 鼠标中键被按下时,nFlags 设置为MK_MBUTTON上一页 下一页返回1.4 ClassWizard 类向导 MK_RBUTTON 鼠标右键被按下时,nFlags 设置为MK_RB