MFC表达式计算器课程设计报告实验名称:MFC课程设计指导教师:刘晓军专业:机械工程学院班级:5班学生姓名及学号:丁健华(02011507)李晓奇(02011513)吴继超(02011516)完成日期:2012年10月13日小组成员及分工:李晓奇(主要负责Calculate.cpp代码的编写)李晓奇(主要负责界面的设计和实现、辅助代码的编写)丁健华(主要负责功能的改进与创新、辅助代码的编写)丁健华(主要负责代码的链接、辅助代码的编写)吴继超(主要负责报告的书写、辅助代码的编写)题目:利用MFC框架编写简易表达式计算器【分析】一.设计过程1.Windows消息处理机制的理解首先编写程序需要对Windows程序的消息处理机制(MessageHandle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。2.界面的设计1)界面的初步设计仿照Windows附件里面的计算器,在资源视图中画好界面,如图:2)修改每个static的属性IDCAPTIONIDD_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中,如下:#includeCalculate.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_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgdialogCMyDlg::CMyDlg(CWnd*pParent/*=NULL*/):CDialog(CMyDlg::IDD,pParent){//{{AFX_DATA_INIT(CMyDlg)//NOTE:theClassWizardwilladdmemberinitializationhere//}}AFX_DATA_INIT//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_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_MAPEND_MESSAGE_MAP()//////////////////////////////////////////////////////////////////////////////CMyDlgmessagehandlers3.OnButton1()按钮的处理函数双击“等于(=)”按钮,添加如下代码:voidCMyDlg::OnButton1(){//TODO:AddyourcontrolnotificationhandlercodehereCStringstr;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:Addyourcontrolnotificationhandlercodeherem_result.SetWindowText(0);m_input.SetWindowText();m_input.SetFocus();}//函数的功能是把上次输入的表达式清空5.OnButton3()按钮的处理函数双击“全清(A)”按钮,添加如下代码:voidCMyDlg::OnButton3(){//TODO:Addyourcontrolnotificationhandlercodeherem_input.SetWindowText();m_input.SetFocus();}//函数的功能是把上次输入的表达式和运算结果都清除6.OnTimer(UINTnIDEvent)处理函数CWnd::SetTimer(1,500,NULL);//设置时间每隔500ms更新一次。voidCMyDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCStringch[]={日,一,二,三,四,五,六};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:AddyourcommandhandlercodehereCAboutDlgabout;about.DoModal();}//关于帮助和版权信息8.OnQuit()处理函数voidCMyDlg::OnQuit(){//TODO:AddyourcommandhandlercodehereOnOK();}//退出主程序菜单9.全部代码如下://计算器Dlg.cpp:implementationfile//#includestdafx.h#include计算器.h#include计算器Dlg.h#includeCalculate.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg: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//Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}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_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgdialogCMyDlg::CMyDlg(CWnd*pParent/*=NULL*/):CDialog(CMyDlg::IDD,pParent){//{{AFX_DATA_INIT(CMyDlg)//NOTE:theClassWizardwilladdmemberinitializationhere//}}AFX_DATA_INIT//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()-