Windos编程实验指导书解析

更新时间:2024-06-15 00:07:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一 框架的创建与消息处理

[程序1:Ex_SDIDemo] 创建一个默认的单文档应用程序 1.开始

选择“文件”?“新建”菜单,在弹出的“新建”对话框中选择“工程”标签,这时显示出一系列的应用程序项目类型; 2 .选择程序类型

(1) 从应用程序类型单个文档(Single Document,简称SDI)、 多重文档(Multiple Document ,简称MDI)和基本对话框(Dia log Based,基于对话框的应用程序)中选择“单个文档”。

(2) 决定应用程序中是否需要MFC的文档视图(“文档/查看体 系结构支持”)结构的支持。 (3) 选择资源所使用的语言 3. 简单创建

保留其他的默认选项,单击[完成]按钮出现一个对话框,显示出用户在步骤中作出的选择,单击[确定]按钮系统开始创建。

4. 编译并运行 到这里为止,用户虽然没有编写任何程序代码,但MFC AppW izard已经根据用户的选择内容自动生成基本的应用程序框架。

单击编译工具条 上的运行工具按钮

或按快捷键Ctrl+F5,系统开始编连并运行生成的单文档应用程序可执行文件Ex_SDIDemo.exe 请仔细查看生成的文件,理解文件内容。

【程序2:单文档消息映射】

生成一个单文档程序,实现鼠标右键单击,发送自定义消息,显示一个消息框.

【程序3:绘制直线鼠标消息实验】

生成一个单文档程序,实现用鼠标绘制直线的功能.

【程序4:按键消息实验】

生成一个单文档程序,当按下A键时,在消息窗口中显示“输入字符A!”。 .

实验二 图形与文本

【程序1:】

编写一个单文档的应用程序,在视图窗口中显示一行文本,要求文本颜色为红色,背景色为黄色。

【程序2:】

编写一个单文档的应用程序,在客户区使用不同的画笔和画刷绘制点、折线、曲线、圆角矩形、弧、扇形和多边形等几何图形。

【程序3:】

编写一个单文档的应用程序,在视图窗口中显示3个圆,通过使用不同颜色的画笔以及画刷来模拟交通红绿灯。

【程序4:】

编写一个单文档的应用程序,在视图窗口实现一行文本的水平滚动显示,要求每个周期文本为红、黄两种颜色,字体为宋、楷两种字体。

实验三 菜单和工具栏

【程序1:】

编写一个单文档,为程序添加主菜单“显示”,且“显示”菜单中包含“文本”和“图形”2个菜单项。当程序运行时,用户单击”文本“菜单项,可以在视图窗口中显示”我已经学会了如何设计菜单程序!“文本信息,单击“图形”菜单项,在视图窗口中画出一个红色的实心矩形。

【程序2:】

在程序1的基础上,新增菜单项添加控制功能,当“文本”菜单项被选中时,\图形“菜单项无效;当”图形“菜单项被选中时,”文本“菜单项无效。

【程序3:】

创建一个单文档,为该程序添加2个按钮到默认工具栏,单击第1个按钮,在视图窗口中弹出用于文件打开的”打开“对话框;单击第2个按钮,在消息框中显示”我已经学会使用默认工具栏了!“文本信息。

【程序4:】

在程序2上,新增工具栏,完成菜单里的对应的功能。并在状态栏中显示鼠标光标的坐标和当前系统时间。

实验四 对话框

[程序1:Ex_DlgDemo] 使用向导创建对话框应用程序

(1) 选择“文件”?“新建”菜单,在弹出的“新建”对话框中选择“工程”页面,选择MFC AppWizard(exe),在工程框中输入项目名Ex_DlgDemo。

(2) 单击[确定]按钮,在出现的“Step 1”对话框中选择“基本对话(框)”应用程序类型,如图所示。

(3) 单击[下一个]按钮,出现如图(右)所示的对话框,允许用户设置对话框的风格及ActiveX控件等特点的支持。

(4) 单击[下一个]按钮出现如图(左)所示的对话框,两个方面的选项可供用户选择:一是在源文件中是否加入注释用来引导用户编写程序代码,另一是使用动态链接库还是静态链接库。

(5) 保留默认选项,单击[下一个]按钮出现如图(右)所示的对话框。 (6) 单击[完成]按钮出现一个对话框,显示出用户在前面几个步骤中作出的选择内容,单击[确定]按钮系统开始创建。 应用程序可执行文件Ex_DlgDemo.exe,结果如图所示

[程序2:Ex_SDI] 在单文档程序中添加对话框资源 创建一个默认的单文档应用程序项目Ex_SDI。

(1) 选择“插入”?“资源”菜单,或按快捷键Ctrl+R打开“插入资源” 对话框中看到资源列表中存在Dialog项,若单击Dialog项左边的“+”号,将展开对话框资源的不同类型选项,表列出各种类型的对话框资源的不同用途。“插入资源”对话框 :

(2) 对展开的不同类型的对话框资源不作任何选择,选中“Dialog”,单击[新建]按钮,系统就会自动为当前应用程序添加了一个对话框资源。

系统为对话框资源自动赋给它一个默认标识符名称

使用通用的对话框模板创建新的对话框资源。对话框的默认标题为Dialog,有[OK]和[Cancel]两个按钮,这两个按钮的标识符分别为IDOK和IDCANCEL。

对话框模板资源所在的窗口称为对话框资源编辑,在这里可以通过控件工具栏和布局工具栏向对话框添加和布局控件,并可设置对话框的属性。 Visual C++6.0开发环境的工具栏具有“浮动”与“停泊”功能,图中的控件工具栏是处于“浮动”状态,通常将它拖放到窗口右侧,以便于操作。

在对话框模板处右击鼠标,从弹出的快捷菜单中选择“属性”菜单项,出现如图所示的对话框属性窗口。

对话框的属性有General(一般)、Styles(风格)、More Styles(更多)、Extended Styles(扩展风格)、MoreExtended Styles(更多扩展风格)等部分,这里仅介绍最常用的General属性。 对话框的General属性 项 目 ID框 标题框 字体按钮 Xpos/Ypos 菜单框 说 明 修改或选择对话框的标识符名称 输入对话框的标题名称,中英文均可,如“我的对话框” 单击此按钮可选择字体的种类(如宋体)及尺寸(如9号) 对话框左上角在父窗口中的X、Y坐标,都为0时表示居中 默认值为无,当对话框需要菜单时输入或选择指定的菜单资源

实验五 标准控件

[程序1:Ex_DlgCtrls] 用控件的编程方式来创建一个按钮

(1) 选择“文件”?“新建”菜单,在弹出的“新建”对话框中单击“工程”标签,选择MFCAppWizard(exe)的项目类型,在工程框中输入项目名Ex_DlgCtrls

(2) 单击[确定]按钮,在出现的“Step 1”对话框中选择“基本对话框)”应用程序类型,单击[完成]按钮,创建一个

默认的基于对话框的应用程序项目。

(3) 将项目工作区切换到ClassView页面,展开CEx_DlgCtrlsDlg类,右击CEx_DlgCtrlsDlg类名,弹出如图所示

的快捷菜单。

(4) 从快捷菜单中选择Add Member Variable,出现如图所示的对话框,在Variable Type(变量类型)编辑框中输

入CButto n(MFC按钮类),在Variable Name(变量名) 编辑框中输入要定义的CButton类对象名m_btnWnd。

(5) 单击[OK]按钮,这样Visual C++就会自动在CEx_DlgCtrlsDlg

类中添加该成员变量。

在项目工作区的ClassView页面中,双击OnInitDialog函数名,在该函数中添加下列代码: BOOL CEx_DlgCtrlsDlg::OnInitDialog() { CDialog::OnInitDialog();

… m_btnWnd.Create(\你好\ BS_PUSHBUTTON, CRect(20, 20, 120, 60), this, 201); // 创建 CFont *font = this->GetFont(); // 获取对话框的字体 m_btnWnd.SetFont(font); // 设置控件字体 return TRUE; // return TRUE unless you set the focus to a control }

(6) 编译并运行,结果如图所示

上述是通过编程方式实现控件的,但比较繁琐和复杂,一般是通过对话框模板中用编辑器指定控件。

[程序2:映射控件消息]

1. 在MFC中,映射一个控件消息是非常简便的,如下面的过程是对新添加的按钮控件映射BN_CLICKED(单击)消息。将项目工作区窗口切换到ResourseView页面,双击Dialog资源下的标识IDD_EX_DLGCTRLS_DIALOG,打开该对话框资源模板。删除“TODO: 在这里设置对话控制。”控件,添加一个按钮控件,保留其默认属性。如图所示。

2 按快捷键Ctrl+W,打开MFC ClassWizard对话框,查看“Class name”列表中是否选择了CEx_DlgCtrlsDlg,在IDs列表中选择IDC_BUTTON1,这是添加按钮后,系统自动为此按钮设置的默认标识符,然后在Messages框中选择BN_CLICKED消息。

3 单击[Add Function]按钮或双击BN_CLICKED消息,出现“Add Member Function”对话框,在这里可以输入成员函数的名称,系统默认的函数名为OnButton1。

4 单击[OK]按钮,在MFC ClassWizard的“Member functions”列表中将列出新增加的成员函数。 在此成员函数中添加下列代码: void CEx_DlgCtrlsDlg::OnButton1() { MessageBox(\你按下了\\\按钮!\} 5.

编译并运行,当单击[Button1]按钮时,就会执行OnButton1函数,弹出一个消息对话框。这就是按钮BN_CLICKED消息的映射过程,其他控件的消息也可以类似操作。

[程序3:]

写一个单文档程序,用菜单命令打开一个对话框,通过该对话框中的红色,绿色,蓝色单选按钮选择颜色,在视图中绘制不同颜色的矩形。

[程序4:]

写一个单文档程序,添加一个工具栏按钮。单击该按钮弹出一个对话框,通过该对话框中的红色,绿色,蓝色复选框选额颜色,在视图中输出一行文本。

[程序5:]

写一个对话框程序,根据用户从列表框中选择的线条样式,在对话框中绘制一个矩形。线条样式有水平线,垂直线,向下斜线,十字线等四种画刷。

[程序6:]

用组合框取代列表框,实现程序5一样的功能。

实验六 文档与视图

[程序1:] 文档数据和视图显示。

编写单文档程序,为文档对象添加数据成员recno(int类型),表示学号,stuname(CString类型)表示姓名,并在视图中输出文档对象中的内容。要求当按向上箭头或按向下箭头时,学号每次递增1或递减1,能在视图中反映学号变化。

(1)首先建立一个单文档程序。

(2)在文档类添加类的成员变量。 头文件: public: int recno; CString stuname;

并在实现文件里构造函数中初始化: CDemo1Doc::CDemo1Doc()

{ }

// TODO: add one-time construction code here recno=1;

stuname=\张三\

(3)在ClassWizard里面利用消息映射(Message Maps)在对应类中(如*View)添加对WM_KEYDOWN的响应函数。 添加下面阴影部分的代码。

void CDemo1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default //获取文档类的指针 CDemo1Doc* pDoc = GetDocument(); switch(nChar) { }

case VK_UP://上 //学号递增 pDoc->recno++; break;

case VK_DOWN: //下 //学号递减 pDoc->recno--; break; }

//刷新客户区,重新绘制 Invalidate();

CView::OnKeyDown(nChar, nRepCnt, nFlags);

(4)在视图类的OnDraw函数实现在客户区显示姓名和学号。 添加下面阴影的代码:

void CDemo1View::OnDraw(CDC* pDC) { CDemo1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

}

CString message;

message.Format(\学号:%d,姓名:%s\//在客户区显示姓名和学号 pDC->TextOut(0,0,message);

// TODO: add draw code for native data here

(5)调试运行。

按键盘里的向上键时学号递增,向下键时学号递减。

【程序2:单文档综合程序】

(1) 选择“文件”?“新建”菜单,在弹出的“新建”对话框中选择“工程”标签,选择MFC AppWizard(exe)的项目类

型,指定项目工作文件夹位置,输入项目名Ex_SDI2,单击[确定]按钮。

(2) 在向导的第一步中,将应用程序类型选为“单个文档”。

(3) 单击[下一个]按钮,出现向导的第二步对话框,在这里用户可以选择 程序中是否加入数据库的支持。

(4) 单击[下一个]按钮,出现向导的第三步对话框,允许用户在程序中加入复合文档、自动化、ActiveX控件的支持。

(5) 单击[下一个]按钮,出现向导的第四步对话框,对话框的前几项依次确定对浮动工具条、打印与预览以及通信网络等特性的支持。

(6)单击[高级]按钮,出现下图所示的对话框,分别用于文档模板字串资源内容和窗口风格的修改。

(7) 单击[关闭]按钮回到向导对话框,单击[下一个]按钮,出现如下图所示的对话框。

(8) 单击[下一个]按钮,出现对话框。在这里,用户可以对MFC AppWizard提供的默认类名、基类名、各个源文件名进行修改。

(9)添加一个描述学生信息的类。

选择vc++的菜单project-》Add to Project-》New,新建一个头文件StudentInfo.h

Student代码:

//StudentInfo.h 文件内容

class CStudentInfo : public CObject { CString strName; CString strNO; BOOL bMale; CTime tBirth; CString strSpecial; DECLARE_SERIAL(CStudentInfo) public:

// 姓名 // 学号 // 性别,是否为男 // 出生年月 // 专业 // 序列化声明

CStudentInfo() {};

CStudentInfo(CString name, CString id, BOOL male, CTime birth, CString special); void Serialize(CArchive &ar);

void Display(int y, CDC *pDC); // 在坐标为(0,y)处显示数据 };

选择vc++的菜单project-》Add to Project-》New,新建一个实现文件StudentInfo.cpp

//StudentInfo.cpp 文件内容 #include \

#include \

CStudentInfo::CStudentInfo(CString name, CString id, BOOL male, CTime birth, CString special) { strName = name; strNO = id; bMale = male; tBirth = birth; strSpecial = special; }

void CStudentInfo::Display(int y, CDC *pDC) { CString str, strSex(\女\ if (bMale) strSex = \男\ str.Format(\ %s %s %s %s\ strSex, tBirth.Format(\ pDC->TextOut(0, y, str); }

IMPLEMENT_SERIAL(CStudentInfo, CObject, 1) // 序列化实现

void CStudentInfo::Serialize(CArchive &ar) { if (ar.IsStoring()) ar<>strName>>strNO>>bMale>>tBirth>>strSpecial; }

(10)添加用于学生基本信息记录输入的对话框

在资源视图里,添加一个对话框资源,资源id为:IDD_DIALOG_student

双击对话框资源, 添加一个对话框的新类。、

向对话框资源里添加控件。

用classwizard绑定各个控件的变量。

(11)添加并处理菜单项

在Ex_SDI2Doc.cpp文件的开始处,添加包含CStuInfoDlg类的头文件包含。

在菜单资源的主菜单中添加顶层菜单项“学生基本信息(&S)”,在该顶层菜单项中添加子菜单“添加(&A)”(ID_STUINFO_ADD)。

用MFC ClassWizard为CEx_SDI2Doc类添加处理菜单项ID_STUINFO_ADD的COMMAND 消息,并添加代码:

void CEx_SDI2Doc::OnStuinfoAdd() { // TODO: Add your command handler code here //打开添加学生信息的对话框 CStuInfoDlg dlg; if (dlg.DoModal() != IDOK) return; // 添加学生的一条记录

}

CStudentInfo *pStudent = new CStudentInfo(dlg.m_name, dlg.m_id, dlg.m_male, dlg.m_birth, dlg.m_special); m_stuObArray.Add(pStudent);

SetModifiedFlag(); // 设置文档更改标志 UpdateAllViews(NULL); // 更新视图

3. 修改CEx_StudentDoc类代码

在Ex_SDI2Doc.h文件的class CEx_SDI2Doc前面,添加包含CStudentInfo类的头文件。 #include \

为CEx_ SDI2Doc类添加下列成员变量:

public:

CObArray m_stuObArray; // 对象集合类对象

为CEx_SDI2Doc类添加成员函数CStudentInfo* GetStudentInfoAt(int nIndex),用来获取m_stuObArray中指定索引号的CStudentInfo类指针。

为CEx_SDI2Doc类添加成员函数int GetAllRecNum(void),用于获取集合类中对象的个数其代码如下:

在Ex_SDI2Doc.h头文件手工添加如下代码:

// Attributes public:

CObArray m_stuObArray; // 对象集合类对象 CStudentInfo* GetStudentInfoAt(int nIndex); //获取指定学生 int GetAllRecNum(void); //获取学生个数 在Ex_SDI2Doc.cpp实现文件手工添加如下代码:

CStudentInfo* CEx_SDI2Doc::GetStudentInfoAt(int nIndex) { //返回指定学生 return (CStudentInfo *)m_stuObArray[nIndex]; }

int CEx_SDI2Doc::GetAllRecNum() { //返回学生个数 return m_stuObArray.GetSize(); }

(5) 在CEx_ SDI2Doc类析构函数~CEx_ SDI2Doc添加下列代码: CEx_ SDI2Doc::~CEx_ SDI2Doc() { int nIndex = GetAllRecNum(); while (nIndex--)

delete m_stuObArray.GetAt(nIndex); // 删除并释放对象的内存空间 m_stuObArray.RemoveAll(); }

(6) 在CEx_ SDI2Doc::Serialize函数中添加下列代码,实现保存功能。 void CEx_SDI2Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) { m_stuObArray.Serialize(ar); } else { m_stuObArray.Serialize(ar); } }

修改CEx_ SDI2View类代码

将CEx_ SDI2View::OnDraw代码修改,用来将所有的学生基本信息记录显示在视图中: void CEx_ SDI2View::OnDraw(CDC* pDC) {

CEx_SDI2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here int y = 0; for (int nIndex = 0; nIndex < pDoc->GetAllRecNum(); nIndex++) { pDoc->GetStudentInfoAt(nIndex)->Display(y, pDC); y += 16; }

}

5. 编译运行并测试

本文来源:https://www.bwwdw.com/article/hry3.html

Top