使用MFC进行可视化编程
学生实验报告
开课实验室: 2011年6月25日
学院年级、专
业、班
姓名学号
实验课程名称面向对象程序设计实验成绩
实验项目名称使用MFC进行可视化编程指导
老师
一、实验目的及要求:
了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。控件是Windows图形用户界面的主要组成部分之一,用户通过操作控件对象完成与应用程序之间的交互。本实验要求通过对控件相关知识的学习,目的是要掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制等内容。
要求:(1)掌握MFC类的层次结构及主要类的用法。(2)使用应用程序向导创建MFC类的Windows应用程序。(3)使用静态控件、按钮、流动条、编辑框、列表框、组合框和对话框等创建应用程序。
二、实验设备
计算机:PC系统
软件平台:Windows XP操作系统,Visual C++ 6.0集成开发系统。
三、实验原理
利用Visual C++ 6.0开发环境,对实验所要求的程序设计项目,编辑C语言源程序并形成 .cpp 源代码文件,再编译.cpp 文件形成 .boj 目标代码文件,经过.boj文件与系统标准代码的连接形成 .exe 可执行代码文件,运行.exe文件以得到实验所期望的结果。
四、实验步骤
1. 打开PC机并启动Windows XP操作系统(利用实验设备)
2. 开启Visual C++ 6.0集成开发系统(形成软件开发环境)
3. 程序设计(按要求可先设计算法并给出流程图)
4. 编辑(生成 .cpp源程序文件)
5. 编译(调试并生成 .boj 目标文件)
6. 连接(调试并生成 .exe 可执行文件)
7. 运行(调试并得到预期的程序执行结果)
8. 按实验要求分析实验结果
五、实验过程及原始纪录(数据,图表,计算等)
六、实验结果及分析
8.1_1:用MFC的向导创建编辑框,在编辑框中实现算术“加”、“减”、“乘”及“除”的运算,界面如图13-1所示。
图13-1 具有“加”、“减”、“乘”及“除”运算功能的界面
实验步骤:
1、利用MFC向导建立程序框架,在MFC AppWizard Step1中选择Dialog based。其余都采用默认选项。这样建立了一个基于对话框的程序。
2、利用资源编辑器,建立对话框:在Resource View 选项卡中打开Dialog资源组,由于程序的文件名为editor, 因此,系统自动产生一个名为IDD_editor_DIALOG的资源文件,在ResourceView资源组框中双击IDD_editor_DIALOG,如图13-2所示。然后在右边的窗口中显示出待编辑的对话框。根据如图13-1所示的样式建立对话框。
图13-2 ResourceView资源组框
下面以“数据1”编辑框和“加”按钮为例介绍控件的创建过程,其余的编辑框和按钮可参照此操作:
(1) 在控件工具栏中选择“编辑框”,在控件工具上单击鼠标左键,在如图13-1所示的对话框编辑窗口上“数据1”编辑框的位置上,画出一个大小合适的编辑框。然后在对话框上单击鼠标右键,对该编辑框上的Properties属性进行设置,如图13-3所示,设置对话框的ID属性。
图13-3 Edit Properties对话框
(2) 在图13-1的“加”按钮的位置上,画出一个大小合适的下压式按钮。设置该按钮的Properties 选项,如图13-4所示,设置该控件的ID值和Caption属性。
图13-4 按钮“加”的属性设置
按照上面的操作过程编辑各按钮或编辑框等对象的属性。见表13-1所示。
表13-1 对象属性表
对象ID Caption
编辑框IDC_ITEM1_EDIT
编辑框IDC_ITEM1_EDIT
编辑框IDC_RESULT _EDIT
按钮IDC_ADD_BUTTON Add
按钮IDC_DIFFERENCE_BUTTON Difference
按钮IDC_MULTIPLY_BUTTON Multiply
按钮IDC_DEVIDE_BUTTON Devide
按钮IDC_EXIT_BUTTON Exit
(3) 添加代码
1)给编辑框连接变量:在任何一个编辑框上单击鼠标右键,设置ClassWizard菜单项,弹出MFC Class Wizard对话框,选择Member Variables 选项卡。然后在Control IDs 列表框中,选中IDC_ITEM1_EDIT,单击Add Variable按钮,在弹出的对话框中连接变量m_Item1_Edit.,结果如图13-5所示。按照上面的操作过程给另两个编辑框加入变量见表13-2所示。
图13-5 MFC Wizard中的Member Variables选项卡
表13-2 三个编辑框变量表
ID 变量变量类型
ID_ITEM1_EDIT m_Item1_Edit CEdit
ID_ITEM2_EDIT m_Item1_Edit CEdit
ID_ITEM3_EDIT m_Item1_Edit Cstring
2)给四个按钮连接代码:在“加”按钮上单击鼠标右键,选择ClassWizard,在弹出的对话框中选择Message Maps选项卡,在Object IDs列表框中选择IDC_ADD_BUTTON,在Messages列表框中选择BN_CLICKED选项,即选择单击按钮事件。单击右边的Add Function按钮,在弹出的对话框中接受默认的名字,执行结果如图13-6所示。单击Edit Code 按钮,此时显示源代码文件,在函数OnAddButton()中输入下列代码:
图13-6 为按钮连接代码
void CEditorDlg::OnAddButton()
{
char cstrItem1[10],cstrItem2[10];
double dfItem1,dfItem2,dfResult;
char cBuffer[10];
m_Item1_Edit.GetWindowText(cstrItem1,10);
m_Item2_Edit.GetWindowText(cstrItem2,10);
dfItem1=atof((LPCSTR)cstrItem1);
dfItem2=atof((LPCSTR)cstrItem2);
dfResult=dfItem1+dfItem2;
_gcvt (dfResult,10,cBuffer);
m_sResult_Edit=(LPCSTR)cBuffer;
UpdateData(FALSE);
}
3)同样的可以给“减”、“乘”、“除”按钮连接代码,不同的是消息映射函数中执行减、乘及除的操作。
减的操作代码如下:
void CEditorDlg::OnDifferenceButton()
{
char cstrItem1[10],cstrItem2[10];
double dfItem1,dfItem2,dfResult;
char cBuffer[10];
m_Item1_Edit.GetWindowText(cstrItem1,10);
m_Item2_Edit.GetWindowText(cstrItem2,10);
dfItem1=atof((LPCSTR)cstrItem1);
dfItem2=atof((LPCSTR)cstrItem2);
dfResult=dfItem1-dfItem2;
_gcvt(dfResult,10,cBuffer);
m_sResult_Edit=(LPCSTR)cBuffer;
UpdateData(FALSE);
}
乘的操作代码如下:
void CEditorDlg::OnMultiplyButton()
{
char cstrItem1[10],cstrItem2[10];
double dfItem1,dfItem2,dfResult;
char cBuffer[10];
m_Item1_Edit.GetWindowText(cstrItem1,10);
m_Item2_Edit.GetWindowText(cstrItem2,10);
dfItem1=atof((LPCSTR)cstrItem1);
dfItem2=atof((LPCSTR)cstrItem2);
dfResult=dfItem1*dfItem2;
_gcvt(dfResult,10,cBuffer);
m_sResult_Edit=(LPCSTR)cBuffer;
UpdateData(FALSE);
}
除的操作代码如下:
void CEditorDlg::OnDevideButton()
{
char cstrItem1[10],cstrItem2[10];
double dfItem1,dfItem2,dfResult;
char cBuffer[10];
m_Item1_Edit.GetWindowText(cstrItem1,10);
m_Item2_Edit.GetWindowText(cstrItem2,10);
dfItem1=atof((LPCSTR)cstrItem1);
dfItem2=atof((LPCSTR)cstrItem2);
dfResult=dfItem1/dfItem2;
_gcvt(dfResult,10,cBuffer);
m_sResult_Edit=(LPCSTR)cBuffer;
UpdateData(FALSE);
}
4)给“退出“按钮连接代码,利用ClassWizard将按钮消息BN_CLICKED加到函数OnExitButton( )中,例如下列代码:
void CEditorDlg::OnExitButton()
{
OnOK();
}
3、建立并运行程序
运行后该编辑框能实现“加”、“减”、“乘”及“除”的运算。如图13-7所示。
图13-7 实现“加”、“减”、“乘”及“除”的运算
#include "stdafx.h"
#include "加减乘除.h"
#include "加减乘除Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_EDIT3, m_Data3_Edit3);
DDX_Control(pDX, IDC_EDIT2, m_Data2_Edit2);
DDX_Control(pDX, IDC_EDIT1, m_Data1_Edit1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_Exit_BUTTON3, OnExitBUTTON3)
ON_BN_CLICKED(IDC_Plus_BUTTON1, OnPlusBUTTON1)
ON_BN_CLICKED(IDC_Cut_BUTTON2, OnCutBUTTON2)
ON_BN_CLICKED(IDC_Multiply_BUTTON4, OnMultiplyBUTTON4)
ON_BN_CLICKED(IDC_Except_BUTTON5, OnExceptBUTTON5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMyDlg::OnExitBUTTON3()
{
OnOK();
// TODO: Add your control notification handler code here
}
void CMyDlg::OnPlusBUTTON1()
{
double sum=0;
char Result[10];
m_Data1_Edit1.GetWindowText(Result,10);
sum+=atof(Result);
m_Data2_Edit2.GetWindowText(Result,10);
sum+=atof(Result);
sprintf(Result,"%.3f",sum);
m_Data3_Edit3.SetWindowText(Result);
// TODO: Add your control notification handler code here
}
void CMyDlg::OnCutBUTTON2()
{
double mission=0;
char Result[10];
m_Data1_Edit1.GetWindowText(Result,10);
mission+=atof(Result);
m_Data2_Edit2.GetWindowText(Result,10);
mission-=atof(Result);
sprintf(Result,"%.3f",mission);
m_Data3_Edit3.SetWindowText(Result);
// TODO: Add your control notification handler code here
}
void CMyDlg::OnMultiplyBUTTON4()
{
double indigestion=0;
char Result[10];
m_Data1_Edit1.GetWindowText(Result,10);
indigestion+=atof(Result);
m_Data2_Edit2.GetWindowText(Result,10);
indigestion*=atof(Result);
sprintf(Result,"%.3f",indigestion);
m_Data3_Edit3.SetWindowText(Result);
// TODO: Add your control notification handler code here
void CMyDlg::OnExceptBUTTON5()
{
double trader=0;
char Result[10];
m_Data1_Edit1.GetWindowText(Result,10);
trader+=atof(Result);
m_Data2_Edit2.GetWindowText(Result,10);
trader/=atof(Result);
sprintf(Result,"%.3f",trader);
m_Data3_Edit3.SetWindowText(Result);
// TODO: Add your control notification handler code here }
输出结果: