程序设计与框架I课程设计报告-跨区间无缝线路设计及其养护维修.doc_第1页
程序设计与框架I课程设计报告-跨区间无缝线路设计及其养护维修.doc_第2页
程序设计与框架I课程设计报告-跨区间无缝线路设计及其养护维修.doc_第3页
程序设计与框架I课程设计报告-跨区间无缝线路设计及其养护维修.doc_第4页
程序设计与框架I课程设计报告-跨区间无缝线路设计及其养护维修.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章 题目及程序功能设计说明程序设计与框架I课程设计报告题目:模拟计算器学院:软件学院专业:软件工程班级:113301学号:20113792 20113817 20113811姓名:刘秀仪 郑晓雪 张佳指导老师:韩旭明设计日期:2013年12月23日第一章 题目及程序功能设计说明目录第一章 题目及程序功能设计说明11.1题目:利用MFC框架编写简易计算器11.2程序功能设计1第二章 程序涉及的知识点22.1 SetWindowText22.2 按钮控件22.3 编辑框数据的输出与获取22.4 Updatedata函数3第三章 功能设计43.1 功能设计4第四章 详细设计64.1 详细设计6第五章 部分窗体界面及代码清单215.1 窗体界面215.2 代码清单21第六章 体会及总结34第七章 参考文献351第一章 题目及程序功能设计说明第一章 题目及程序功能设计说明1.1题目:利用MFC框架编写简易计算器要求使用MFC框架在VC6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现C功能。1.2程序功能设计使用MFC AppWizard创建基于对话框的Windows应用程序,应用程序要求通过单击相应的菜单项同样可以实现算术加、减、乘和除的运算。计算器上数字09为一个控件数组,加、减、乘、除为一个控件数组这个模拟计算器即可以通过按钮输入数字,又可以通过键盘输入数字,它包含三个编辑框,其中两个是输入数字的,一个是用来输出结果的,计算功能基本上是用系统内部函,程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象,基于MFC库类对对话框界面的设计,通过创建类成员函数成员变量,编辑控件创建消息映射,调用消息函数完成数据的输入输出,实现计算功能,生成简单的应用软件。2第2章 程序涉及的知识点第二章 程序涉及的知识点2.1 SetWindowText BOOL SetWindowText(HWNDhwnd,LPCTSTRlpString);参数说明:hWnd,要改变文本内容的窗口或控件的句柄;lpString,指向一个空结束的字符串的指针,该字符串将作为窗口或控件的新文本。返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。2.2 按钮控件按钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,PushButton,CheckBox,RadioBox。所以在利用CButton对象生成按钮窗口时需要指明按钮的风格。创建按钮:BOOLCButton:Create(LPCTSTRlpszCaption,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);其中lpszCaption是按钮上显示的文字,dwStyle为按钮风格,除了Windows风格可以使用外(如WS_CHILD|WS_VISUBLE|WS_BORDER)。2.3 编辑框数据的输出与获取编辑框数据的输出与获取有两种方法,第一种,为编辑框关联一个CONTROL类型的类,假如是m_OutResult,那么要获取数据,就先定义一个CString类的对象,假如为m_Data;那么m_OutResult.GetWindowText(m_Data);此时,m_Data就存储有编辑框里的内容。输出就用SetWindowText函数,如CString m_Data=”abcdefg”;m_OutResult.SetWindowText(m_Data);或者把括号里的m_Data换成“abcdefg”。第二种方法是直接为编辑框关联一个VALUE的类型,有CString,double,int等等类型,假如为CString类型,名也为OutResult;此时如果要获取该编辑框信息就调用UpdateData(FALSE);调用之后,OutResult就存储有编辑框里的信息了。如果要输出的话,比如要输出”abcdefg”,那么就是下面语句:OutResult=”abcdefg”;UpdateData(TRUE);这样就更新数据到编辑框里了,可以推断,如果编辑框里只是int类型,那么就选int;而double就是double。2.4 Updatedata函数UpdateData(true); 用窗体上控件中的内容来更新和控件相关连的变量的值(只能更新value类型的变量) 。UpdateData(false); 和上面的正好相反,以Edit为例,当你在程序中改变了m_strName变量的内容的时候,如果你想让那个Edit也显示更新后的 m_strName,就必须调用UpdateData(false)。UpdateData(TRUE)是将控件的状态传给其关联的变量,当然你要为控件关联上变量才行。 UpdateData(FALSE)是将控件的关联变量的值传给控件并改变控件状态。 UpdateData刷新的是当前对话框。UpdateData(true);/用于将屏幕上控件中的数据交换到变量中。 UpdateData(false);/用于将数据在屏幕中对应控件中显示出来。使用UpdateData()函数时,当前界面上所有绑定了的变量(即通过MFC ClassWizard给控件添加了对应的变量)都会被UpdateData(TRUE)更新成对应控件中的内容;同样所有绑定了变量的控件中的内容也会 UpdateData(FALSE)更新成对应变量中的内容。第3章 功能设计第三章 功能设计3.1 功能设计首先从加法开始:void CMyDlg:OnButton1()/ TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz20;sprintf(sz,%f,m_result);m_CResult.SetWindowText(sz); UpdateData() 是MFC的窗口函数,用来刷新数据的,由于我们进行基本运算需要更新数据 所以必须添加这个函数。n_result = m_num1 + m_num2; m_result = n_result; char sz20; sprintf(sz,%f,m_result); 以上代码是进行 加法的基本语句,然后数组保存并格式化打印输出。m_CResult.SetWindowText(sz);此句是把结果输出在之前用CEdit类创建的对象m_CResult,m_CResult调用SetWindowText(sz);把结果显示在编辑框中。剩下的减法 乘法和除法也是大同小异。这里所有加减乘除的代码:4第4章 详细设计第四章 详细设计4.1 详细设计1、 首先打开VC,选择MFC AppWizardexe,设定好路径和工程名(这里我设置工程名为为“My”)。这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框。”。2、基本对话框建立完成。此时我们把当前页面上原配的控件按Delete全部清除(如下图)。3、 我们按照MFC自带的控件选项进行我们本次计算器的控件添加(以下是控件)。 我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。当然作为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,甚至会影响用户的心情。 上图我们用按钮控件添加一共15个按钮,分别是数字“ 0 9” 以及 “+ - * /”。每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。(如下图)。4、 这里我们把数字按钮0 设置ID为IDC_BUTTON14_NUM0,其他的依次类推。完成修改ID后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。MFC默认下了的响应信息都为On_开头,而且以下显示的是数字5的消息响应.之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直接点击OK即可。之后就会跳转到具体的代码实现过程 这里我们依次给每一个控件添加消息响应函数(以下仅列出一部分)。 5、添加的控件消息响应函数。编辑框控件的ID是:IDC_EDIT1;IDC_EDIT2;IDC_EDIT3。还有 加减乘除的控件添加当初没有进行名字的设置,默认为:void CMyDlg:OnButton1()/加;void CMyDlg:OnButton2()/减;void CMyDlg:OnButton3()/乘;void CMyDlg:OnButton4()/除。 在开始第二步之前有一项工作时必须要做的,那便是添加3个成员变量和一个CEdit类的变量。具体添加方法,就是右键主对话框CMyDlg-Add Member Variable,也可以是在菜单栏中选择“查看”-“建立类向导”。 这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点),之后再在控件IDC_EDIT3中选择Add Variable,并且数据类型选择Control类型此时变量自动改为了CEdit类,这步的意思是说,我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。6、控件消息响应函数具体代码添加部分。加法:void CMyDlg:OnButton1()/ TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz20;sprintf(sz,%f,m_result);m_CResult.SetWindowText(sz); UpdateData() 是MFC的窗口函数,用来刷新数据的。由于我们进行基本运算需要更新数据 所以必须添加这个函数。n_result = m_num1 + m_num2; m_result = n_result; char sz20; sprintf(sz,%f,m_result); 以上代码是进行加法的基本语句,然后数组保存并格式化打印输出。m_CResult.SetWindowText(sz);此句是把结果输出在之前用CEdit类创建的对象m_CResult,m_CResult调用SetWindowText(sz);把结果显示在编辑框中。剩下的减法、乘法、除法和加法差不多。所有加减乘除的代码:void CMyDlg:OnButton1()/ TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz20;sprintf(sz,%f,m_result);m_CResult.SetWindowText(sz);void CMyDlg:OnButton2()/ TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 - m_num2;m_result = n_result;char sz20;sprintf(sz,%f,m_result);m_CResult.SetWindowText(sz);void CMyDlg:OnButton3()/ TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 * m_num2;m_result = n_result;char sz20;sprintf(sz,%f,m_result);m_CResult.SetWindowText(sz);void CMyDlg:OnButton4()/ TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 / m_num2;m_result = n_result;char sz20;sprintf(sz,%f,m_result);m_CResult.SetWindowText(sz);7、由于我们预设了2个编辑框所想实现的功能是,如在编辑框1内输入一个输入30,然后再编辑框2内输入另一个数字20,并且再进行运算。那么存在一个问题。这个问题其实困惑了我很久,那就是,如何用判断用户是在哪个编辑框上输入了数字,所以我们需要给程序加入一个功能,那便是判断用户是在编辑框1输入,还是编辑框2内输入。 那么我们想,在日常我们用电脑的过程中,一般都是用鼠标去点击编辑框来进行一系列操作。那么我可以加入一个鼠标左键点击WM_LBUTTONDOWN消息和一个 EN_SETFOCUS事件来响应这个鼠标消息。 EN_SETFOCUS为判断焦点事件(通俗点说,那便是判断光标在什么地方)这样一来,一切逻辑都理顺了。我们用户用鼠标选择并点击编辑框的时候,我们用WM_LBUTTONDOWN消息去响应,然后与此同此,我们把响应的和EN_SETFOCUS联系起来,我们预设一个全局变量nEditFlag ,作为在EN_SETFOCUS函数里的一个 标记,并在鼠标点下的时候用nEditFlag 去表示编辑框目前被选定的状态,nEditFlag =1 的时候我们就判断用户选择了编辑框1 ,再者当nEditFlag =2的时候说明编辑框2被选定。这里我告诉大家如何添加 事件 EN_SETFOCUS,由于EN_SETFOCUS是一个判断焦点的,所以对象应该是编辑框1和编辑框2里添加,所以我们回到对话框编辑页面。“右键编辑框1”-点击“事件”- “选择EN_SETFOCUS”(这里程序默认的响应函数是OnsetfocusEdit1)。依次类推我们也给编辑框2添加事件响应函数OnsetfocusEdit2,方法同上,如下图:设置好之后,我们还要做一些初始化工作,在程序运行之初,我们先初始化nEditFlag = 0;OnInitDialog()内进行初始化;我们只需在OnInitDialog()函数中加入一nEditFlag = 0;就可以了。之后我们再为两个事件响应函数进行OnsetfocusEdit1()和OnsetfocusEdit2()添加代码。 当用户选定编辑框1的时候,nEditFlag = 1;当用户选定编辑框2的时候,nEditFlag = 2;而鼠标消息WM_LBUTTONDOWN具体代码如下:这里由于代码都大同小异,所以就用数字按钮1,2来进行简要说明。用if语句去判断标记常量 nEditFlag 从而给判断是m_num1还是m_num2进行操作这里m_num1是编辑框1内的数字,m_num2是编辑框2内的数字,剩下了39代码以上大同小异。m_num2=m_num2*10+1; 很多人会问这步是说明意思,这步乍看貌似有点一头雾水(当初我也是这样)但是仔细看看还是能看明白的。比方说 用户想打出自然数“234”。用户第一次点的数字是2 那么此时对应代码执行是这段m_num2=m_num2*10+2; 那么m_num2 = 0*10 +2 (初始化时m_num2 = 0)。之后如果在点击3的时候执行的代码是m_num2=m_num2*10+3; (此时经过第一步m_num2已经为2了,再点了3 结果为m_num2= 2*10+3 = 23);最后点击4 执行的代码是m_num2=m_num2*10+4;(23*10 +4=234)。32第5章 部分窗体界面及代码清单 第五章 部分窗体界面及代码清单5.1 窗体界面5.2 代码清单/ MyDlg.cpp : implementation file/#include stdafx.h#include My.h#include MyDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutint nEditFlag;double num1;double num2;class CAboutDlg : public CDialogpublic: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/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMyDlg dialogCMyDlg:CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg:IDD, pParent)/AFX_DATA_INIT(CMyDlg)m_num1 = 0.0;m_num2 = 0.0;m_result = 0.0;/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CMyDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMyDlg)DDX_Control(pDX, IDC_EDIT3, m_CResult);DDX_Text(pDX, IDC_EDIT1, m_num1);DDX_Text(pDX, IDC_EDIT2, m_num2);DDX_Text(pDX, IDC_EDIT3, m_result);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CMyDlg, CDialog)/AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_BN_CLICKED(IDC_BUTTON5, OnButton5)ON_BN_CLICKED(IDC_BUTTON6, OnButton6)ON_BN_CLICKED(IDC_BUTTON7, OnButton7)ON_BN_CLICKED(IDC_BUTTON8, OnButton8)ON_BN_CLICKED(IDC_BUTTON11, OnButton11)ON_BN_CLICKED(IDC_BUTTON9, OnButton9)ON_BN_CLICKED(IDC_BUTTON10, OnButton10)ON_BN_CLICKED(IDC_BUTTON13, OnButton13)ON_BN_CLICKED(IDC_BUTTON14, OnButton14)ON_BN_CLICKED(IDC_BUTTON15, OnButton15)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_EN_SETFOCUS(IDC_EDIT1, OnSetfocusEdit1)ON_EN_SETFOCUS(IDC_EDIT2, OnSetfocusEdit2)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMyDlg message handlersBOOL CMyDlg:OnInitDialog()CDialog:OnInitDialog();nEditFlag = 0;/ 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 AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a controlvoid CMyDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog: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 paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint 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 icondc.DrawIcon(x, y, m_hIcon);elseCDialog: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:OnButton2() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+1;else if(nEditFlag=2)m_num2=num2*10+1;UpdateData(FALSE);void CMyDlg:OnButton3() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+2;else if(nEditFlag=2)m_num2=num2*10+2;UpdateData(FALSE);void CMyDlg:OnButton4() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+3;else if(nEditFlag=2)m_num2=num2*10+3;UpdateData(FALSE);void CMyDlg:OnButton5() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+4;else if(nEditFlag=2)m_num2=num2*10+4;UpdateData(FALSE);void CMyDlg:OnButton6() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+5;else if(nEditFlag=2)m_num2=num2*10+5;UpdateData(FALSE);void CMyDlg:OnButton7() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+6;else if(nEditFlag=2)m_num2=num2*10+6;UpdateData(FALSE);void CMyDlg:OnButton8() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+7;else if(nEditFlag=2)m_num2=num2*10+7;UpdateData(FALSE);void CMyDlg:OnButton11() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+0;else if(nEditFlag=2)m_num2=num2*10+0;UpdateData(FALSE);void CMyDlg:OnButton9() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+8;else if(nEditFlag=2)m_num2=num2*10+8;UpdateData(FALSE);void CMyDlg:OnButton10() / TODO: Add your control notification handler code hereUpdateData(true);if(nEditFlag=1)m_num1=num1*10+9;else if(nEditFlag=2)m_num2=num2*10+9;UpdateData(FALSE);/*void CMyDlg:OnButton12() / TODO: Add your control notification handler code here*/void CMyDlg:OnButton13() / TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论