一、目的要求 1 .了解和使用 VC 集成开发环境。
2 .熟悉 VC 环境的基本命令和功能键,熟悉常用的功能菜单命令。
3 .进一步熟悉用 Visual C++ 开发 Windows MFC 应用程序的过程。
4 .掌握 Windows 程序的消息机制和编程模式。
5 .使用 AppWizard 自动生成的程序框架。
6 .复习 Windows 程序运行结构。
7 .学习简单的绘图操作。
二、启事与范例 1. Windows 程序的消息机制及菜单和工具条的使用
例 1 菜单和工具条的使用
[ 实验步骤 ]
1 )创建一个新项目
利用 Developer Studio 的 AppWizard 生成 Hello 程序的框架。
2 )添加菜单
现在我们要在主窗口中加入自己的菜单。菜单编程一般分三步:
① 首先是编辑菜单资源,设置菜单属性(包括菜单名和 ID )。
选择项目工作区的 ResourceView 标签,切换到资源视图。选择菜单资源类型。选定菜单资源 IDR_MAINFRAME 。然后编辑当前菜单,插入新菜单项 Test 。在 Test 弹出菜单下加入以下一个菜单项。菜单项属性设置如下表:
|
菜单名 |
菜单 ID |
菜单提示 (Prompt) |
|
Say &Hello |
ID_SAY_HELLO |
Say hello to you! |
② 采用系统工具 ClassWizard 自动映射菜单消息和成员函数。
启动 ClassWizard ,利用 ClassWizard 为 Hello 程序增加菜单消息和成员函数的映射。在 View 菜单下选择 ClassWizard ,弹出 MFC ClassWizard 对话框。选择 Message Maps 页,在 Class Name 下拉列表中选择 CMainFrame 类。在 Object IDs 中选择 ID_SAY_HELLO ,在 Messages 栏中双击 COMMAND ,弹出 Add Member Function 对话框。对话框中给出缺省的成员函数 OnSayHello ,按 OK 接收缺省的成员函数名。此时 OnSayHello 成员函数就出现在 Member Functions 列表框中。然后双击 Member Functions 列表中的 OnSayHello ,编辑 OnSayHello 成员函数。
③ 手工编辑成员函数,加入相应的菜单消息处理代码。
在 OnSayHello 成员函数体中加入语句。
void CMainFrame::OnSayHello()
{
AfxMessageBox(“Hello!”);
}
3 )修改工具条资源
选择项目工作区的 ResourceView 标签,切换到资源视图。选择工具条资源类型。选定工具条资源 IDR_MAINFRAME 。然后编辑当前工具条。
先删除 “ ? ” 按钮前面的所有按钮,删除的方法是用鼠标将要删除的按钮拖出工具条。然后选中 “ ? ” 按钮后面的空白按钮,在该按钮的放大位图上用红色画一个实心圆圈。接着为新加的按钮指定命令 ID 为 ID_SAY_HELLO 。指定 ID 的方法是选中按钮按回车键,在弹出的属性对话框中输入 ID 。注意这个按钮的 ID 与 Test 菜单中的菜单项 SayHello 的 ID 相同,这样同样的命令既可以通过菜单执行,也可以 通过工具条执行。
4 )编译连接运行
按 F7 或者选择菜单 Build|Build hello.exe ,编译连接得到可执行程序,再按 Ctrl+F5 或者选择 Build|Execute hello.exe 运行该程序。程序的结果如下:
选择 Test 菜单中的菜单项 SayHello ,将弹出一个消息框。
单击工具条中的红色按钮,也会弹出一个相同的消息框。
2. 简单图形绘制
绝大多数的 Windows 应用都需要在屏幕上显示自己的数据。 Windows 是一个设备无关的操作系统,屏幕输出功能是间接地通过一个设备上下文 (device context) 的对象来完成。围绕设备上下文, MFC 提供了一系列与其配合使用的绘图对象,比如画笔对象、刷子对象以及字体对象等等。这些绘图对象的工作模型基本上都是相同的:首先设置设备上下文对象( DC 对象),然后选择在屏幕上输出信息所需要的工具,最后用 DC 对象的输出函数绘制图形。屏幕输出的目标一般都是窗口的客户区。
如果采用 Windows API 编程,我们通常在绘制之前调用 BeginPaint 函数,然后在设备上下文中进行一系列的绘制操作,最后调用 EndPaint 函数结束绘制。而 MFC 类 CPaintDC 封装了这一过程。 CPaintDC 是 MFC 提供的一个从 CDC 继承出来的类。在构造 CPaintDC 对象的同时,其构造函数自动调用 BeginPaint 函数;在销毁 CPaintDC 对象的同时,其析构函数自动调用 EndPaint 函数。因此前面所讲述的过程变成下面的三个步骤:构造一个 CDC 对象,进行绘制操作,销毁该 CDC 对象。在基于文档 / 视结构的应用程序框架中,这个过程被进一步的简化。我们只需简单地通过该对象进行绘制,而不需要关心这一对象的构造和销毁。这一过程由框架自动完成。 比如我们一般在视类的 OnDraw 成员函数中处理有关重绘的操作。框架通过 OnPrepareDC 成员函数,自动的向 OnDraw 成员函数传递一个类型为 CPaintDC 的设备上下文对象,隐藏在背后的设备上下文在对 OnDraw 的调用返回时由框架进行释放。
下面我们通过一个简单的例题学习使用画笔和画刷绘制图形的基本过程。画笔和画刷是常用的两种 GDI 对象,画笔是 WindowsGDI 提供的用来绘制直线和图形的对象。 Windows 中提供的画笔类是 CPen ,你可以构造这个类的对象来创建自己的画笔。画刷是用来填充一个空间、窗体或其他与区域有关的 GDI 对象。 Windows 中提供的画刷类是 CBrush 。 在例题中,将尝试在视图区域中画个矩形或是椭圆。
例 2 用画笔和画刷绘制图形。
[ 实验步骤 ]
1 )创建一个新项目
利用 Developer Studio 的 AppWizard 生成一个基于 SDI 的应用程序,工程名为 DrawTest 。
2 )修改 OnDraw 成员函数,实现图形绘制
选择项目工作区的 ClassView 标签,切换到 类 视图。选择视 类 CdrawTestView ,双击 OnDraw 成员函数。在 OnDraw 成员函数体中加入语句:
void CDrawTestView::OnDraw(CDC* pDC)
{
CDrawTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// 用缺省画笔画十个椭圆
for(int i = 1; i < 20; i+=2)
pDC->Ellipse(50+i,50+i,100+i,100+i);
// 建立一个画笔对象,可以画红色的宽度为 1 个象素的实线
CPen aPen(PS_SOLID,1,RGB(255,0,0));
// 将画笔对象选进设备上下文
CPen *pOldPen = pDC->SelectObject(&aPen);
// 用选定画笔画四条直线,构成一个矩形
pDC->MoveTo(10,10);
pDC->LineTo(50,10);
pDC->LineTo(50,50);
pDC->LineTo(10,50);
// 恢复原来的画笔对象
pDC->SelectObject(pOldPen);
// 建立一个绿色的画刷对象
CBrush brBackGround(RGB(0,255,0));
// 将该对象选进设备上下文
CBrush *pOldBrush = pDC->SelectObject(&brBackGround);
// 在规定范围内画一个填充椭圆
CRect rcEllipse(100,100,15,200);
pDC->Ellipse(rcEllipse);
// 恢复原来的画刷对象
pDC->SelectObject(pOldBrush);
}
3 )编译连接运行
按 F7 编译连接得 到可执行程序,再按 Ctrl+F5 运行该程序。程序的结果如下:

3. 对话框和基本控件
对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。对话框与控件密不可分,在每个对话框内一般都有一些控件,对话框通过控件与用户进行交互。
在 MFC 中,对话框的功能被封装在了 CDialog 类中。控件 (Control) 的种类较多, Windows 支持六种控制类型 : 静态文本框、可编辑文本框、按钮、滚动条、列表框和组合框。下面我们通过一个简单的例题学习 创建 对话框和使用控件实现输入输出的基本过程。
例 3 对话框和基本控件的使用
1 )创建一个新项目
利用 Developer Studio 的 AppWizard 生成一个基于 SDI 的应用程序,工程名为 DialogTest 。
2 )对话框模板的设计
切换至资源视图,选择 Insert-Resource 命令,并在 Insert Resource 对话框中双击 Dialog 项。完成后在资源视图中会出现一个名为 IDD_DIALOG1 的新的对话框模板资源。双击 IDD_DIALOG1 ,则会切换到对话框模板的编辑窗口。在窗口的旁边有一个控件面板,在控件面板上用鼠标选择一个控件,然后在对话框中点击,则相应的控件就被放置到了对话框模板中。在对话框模板中加入三个编辑框和一个命令按钮。
控件类型
|
控件类型 |
ID |
标题 (Caption) |
其它属性 |
|
编辑框 ( 输入 ) |
IDC_INPUT |
|
缺省 |
|
编辑框 ( 输出 ) |
IDC_OUTPUT |
|
缺省 |
|
单选按钮 ( 显示 ) |
IDSHOW |
显示 |
缺省 | 3 )对话框类的设计
完成对话框模板的设计后,就需要设计一个对话框类以实现对话框的功能。
激活 ClassWizard ,由于 IDD_ DIALOG1 是一个新的对话框模板,于是它会询问是否要为 IDD_ DIALOG1 创建一个对话框类。按 OK 键确认。在 Create New Class 对话框中,在 Name 栏中输入 CTestDialog ,在 Base class 栏中选择 CDialog ,在 Dialog ID 栏中选择 IDD_ DIALOG1 。按 Create 按钮后,对话框类 CTestDialog 即被创建。
4 )为对话框类加入成员变量
对话框的主要功能是输出和输入数据,例子中对话框的任务就是在输入编辑框中输入字符串,单击显示按钮,在输出编辑框中输出相同的字符串。
在对话框中,控件用来表示或输入数据,因此,存储数据的成员变量应该与控件相对应。与控件对应的成员变量可以是一个数据,也可以是一个控件对象,这由具体需要来确定。利用 ClassWizard 可以很方便地为对话框类 CTestDialog 加入以下的成员变量。
|
控件 ID |
变量类型 |
变量名 |
|
IDC_INPUT |
CEdit |
m_Edit1 |
|
IDC_OUTPUT |
CEdit |
m_Edit2 | 5 )处理控件通知消息
为对话框中的控件添加代码。
给显示按钮添加代码。创建的方法是进入 ClassWizard 后,选 Message Maps 页并在 Class name 栏中选择 CTestDialog ,然后在 Object IDs 栏中选择 IDSHOW ,在 Messages 栏中双击 BN_CLICKED 。在确认使用缺省的消息处理函数名 OnIDSHOW 后,按回车键退出 ClassWizard 。
void CTestDialog::OnIDSHOW()
{
// TODO: Add your control notification handler code here
m_Edit1.SetSel(0,-1);
m_Edit1.Copy();
m_Edit2.SetSel(0,-1);
m_Edit2.ReplaceSel("");
m_Edit2.Paste();
}
至此,对话框的处理已经完成。要使用该对话框,还需在视类中添加该类的对象,并调用对话框类的 DoModal() 函数
6 )添加菜单
在主窗口中采用前面介绍的方法加入新菜单项 --- 消息菜单项。
|
菜单名 |
菜单 ID |
菜单提示 (Prompt) |
|
测试对话框 |
ID_MESSAGE_TEST |
Test Message |
启动 ClassWizard ,利用 ClassWizard 为“测试对话框” 菜单项增加菜单消息和成员函数 OnMESSAGE_TEST 。在 CdialogTestView 类中添加对象成员 m_Dlg ,然后手工编辑 OnMESSAGE_TEST 函数,加入相应的代码。
void CMainFrame::OnSayHello()
{
m_Dlg.DoModal();
}
7 )编译连接运行
按 F7 编译连接得 到可执行程序,再按 Ctrl+F5 运行该程序。
三、练 习 [6.1] 创建一带“时间”菜单的应用程序,该菜单下面有“年、月、日”、“小时、分、秒”选项。当选择“年、月、日” 选项时,在窗口中显示一个对话框,对话框中显示当天的日期;当选择“小时、分、秒” 选项时,在窗口中显示一个对话框,对话框中显示现在的时间。
[6.2] 编写一个窗口应用程序。在原有菜单基础上添加一个“测试”菜单项,该菜单下面有“显示”、“隐藏”、“退出”选项。在原有工具栏基础上添加与菜单项“显示”、“隐藏”、“退出”对应的三个工具按钮。当选择“显示” 选项或对应的工具按钮时,在窗口中显示一个对话框,对话框中显示“你好!”;当选择“隐藏” 选项或对应的工具按钮时,对话框消失;当选择“退出” 选项或对应的工具按钮时,退出应用程序的执行。
[6.3] 编写一个窗口应用程序。窗口的工具栏中带有“圆”、“矩形”按钮。选中“圆” 工具栏按钮,可以拖拉鼠标画一个圆;选中“矩形” 工具栏按钮,可以拖拉鼠标画一个矩形。
[6.4] 编写一个窗口应用程序。在窗口中显示一个灰色的圆。当鼠标光标落在视窗中时,每当按一下鼠标左键,圆就会不断得放大和缩小。
[6.5] 创建一个如下图所示的界面:

[6.6] 创建一基于对话框的应用程序如图 , 在编辑框内输入数据 , 通过单击加、减、乘、除按钮,分别实现加、减、乘、除操作,结果显示在结果编辑框内。单击退出按钮,退出应用程序的执行。

[6.7] 编写程序,在窗口上设计一行文字,如“字体显示程序!”。这一行文字从窗口的左边向右边滚动形式,而且每显示一轮,改变一次颜色和字体,一个周期为 4 种颜色,分别为红、绿、黄、蓝,四种字体分别为宋体、楷体、仿宋体和黑体。
[6.8 ] 创建一个带有时钟显示的状态栏窗口,并且还能设置时钟栏的显示方式。
提示:VC 的 Status bar 控件可以在窗体状态栏中添加日期和时间。
[6.9] 创建一个窗口, 在界面上点击鼠标左键时, 用不同的渐变色填充背景。
提示:利用 AppWizard 生成一个基于 SDI 的应用程序, 在 ClassWizard 中添加鼠标左键的消息处理映射函数。
[6.10] 创建一 单文档, 拖拉鼠标画多个圆,同时保持圆的坐标。
|