MFC计算器课程设计报告.docx
《MFC计算器课程设计报告.docx》由会员分享,可在线阅读,更多相关《MFC计算器课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
MFC计算器课程设计报告
MFC表达式计算器课程设计报告
题目:
利用MFC框架编写简易表达式计算器
【分析】
一.设计过程
1.Windows消息处理机制的理解
首先编写程序需要对Windows程序的消息处理机制(MessageHandle)有个比较清晰的了解。
Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。
还有用户消息,比如鼠标的单击,双击,键盘的键入等。
2.界面的设计
1)界面的初步设计
仿照Windows附件里面的计算器,在资源视图中画好界面,如图:
2)修改每个static的属性
ID
CAPTION
IDD_STATIC4
简易表达式计算器
IDC_STATIC1
待求表达式
IDC_STATIC2
运算结果
IDC_STATIC3
系统当前时间
3)修改每个button的属性
IDC_BUTTON1
等于(=)
IDC_BUTTON2
全清(C)
IDC_BUTTON3
清除(A)
结果如下图:
4)修改每个button的处理机制
在类向导Classwizard窗口中进行,如下图:
其他button按钮的修改类似
5)修改每个edit的类型和名称
在类向导Classwizard窗口中进行:
单击AddVariable按钮,在如下窗口中进行修改
其他edit的修改类似
最终结果如下:
注:
主要使用到Layout菜单中的Align功能对各个按钮进行对齐,使界面更加整洁。
拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。
6)系统菜单的添加
在Menu的IDR_MENU1中添加系统菜单:
同理在“帮助”菜单中添加“关于”。
二.设计步骤
1.添加头文件
将Calculate.cpp(见附录)改为Calculate.h将其添加到计算器Dlg.cpp:
implementationfile中,如下:
#include"Calculate.h"。
2.成员函数及其释义:
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgdialog
CMyDlg:
:
CMyDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMyDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMyDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX,IDC_EDIT3,m_time);
DDX_Control(pDX,IDC_EDIT2,m_result);
DDX_Control(pDX,IDC_EDIT1,m_input);
//}}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_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON3,OnButton3)
ON_COMMAND(ID_ABOUT,OnAbout)
ON_COMMAND(ID_QUIT,OnQuit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////////////////
//CMyDlgmessagehandlers
3.OnButton1()按钮的处理函数
双击“等于(=)”按钮,添加如下代码:
voidCMyDlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstr;
char*ch;
m_input.GetWindowText(str);
ch=(LPSTR)(LPCTSTR)str;
charch2[50];
strcpy(ch2,ch);
Cala(ch2);
if(!
a.OK)
{m_result.SetWindowText("表达式不合法!
");//表达式不合法,判别出来并给出相应的错误提示
}
else
{if(a.Sign)
{m_result.SetWindowText("除数为零!
");//表达式不合法,可以判别出来并给出相应的错误提示
}
else
{str.Format("%lf",a.GetV());
m_result.SetWindowText(str);
}
}
}
以OnButton1()作为求值处理函数,函数的功能是单击等于(=)按钮,运算结果显示在IDC_EDIT2中
4.OnButton2()按钮的处理函数
双击“清除(C)”按钮,添加如下代码:
voidCMyDlg:
:
OnButton2()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_result.SetWindowText("0");
m_input.SetWindowText("");
m_input.SetFocus();
}
//函数的功能是把上次输入的表达式清空
5.OnButton3()按钮的处理函数
双击“全清(A)”按钮,添加如下代码:
voidCMyDlg:
:
OnButton3()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_input.SetWindowText("");
m_input.SetFocus();
}
//函数的功能是把上次输入的表达式和运算结果都清除
6.OnTimer(UINTnIDEvent)处理函数
CWnd:
:
SetTimer(1,500,NULL);//设置时间每隔500ms更新一次。
voidCMyDlg:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CStringch[]={"日","一","二","三","四","五","六"};
SYSTEMTIMEst;
:
:
GetLocalTime(&st);
CStringstr_temp;
str_temp.Format("%u/%u/%u星期"+ch[st.wDayOfWeek]+"%u:
%u:
%u\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
m_time.SetWindowText(str_temp);
CDialog:
:
OnTimer(nIDEvent);
}//函数的功能是把运算结果显示在IDC_EDIT3中
7.OnAbout()处理函数
voidCMyDlg:
:
OnAbout()
{
//TODO:
Addyourcommandhandlercodehere
CAboutDlgabout;
about.DoModal();
}
//关于帮助和版权信息
8.OnQuit()处理函数
voidCMyDlg:
:
OnQuit()
{
//TODO:
Addyourcommandhandlercodehere
OnOK();
}
//退出主程序菜单
9.全部代码如下:
//计算器Dlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"计算器.h"
#include"计算器Dlg.h"
#include"Calculate.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataE