《MFC编程及应用》课程设计报告
题目: 简易型科学计算器
学号: 姓名:
指导老师: 杨均匀
时间: 20##年5月16日
1、设计步骤
a) 工程建立
本工程建立的是一个基于对话框的应用程序。
b) 类中新增变量的作用
m_inputstr :CEdit类型,用于与程序中编辑框相关联;
m_FormerBase :用于记录上一次是出于何种进制之下,便于进制转换;
CMathString:用于对字符串进行逆波兰表达式的转换并计算结果
c) 需处理的消息的详细代码
对按钮0(OnBnClickedButton0)的响应函数:
void CMy1106840420Dlg::OnBnClickedButton0()
{
CString temp;//定义一个CString对象
this->UpdateData(true);//从编辑框获得m_inputstr的值
m_inputstr.GetWindowText(temp);//获取字符串并存入temp中
temp += '0';//在字符串末尾添加字符‘0’
this->m_inputstr.SetWindowText(temp);//将字符串设置回m_inputstr中
this->UpdateData(false);//更新数据,编辑框显示
}
对按钮1(OnBnClickedButton1)、2(OnBnClickedButton2)、3(OnBnClickedButton3)、4(OnBnClickedButton4)、5(OnBnClickedButton5)、6(OnBnClickedButton6)、7(OnBnClickedButton7)、8(OnBnClickedButton8)、9(OnBnClickedButton9)、A(OnBnClickedButtonA)、B(OnBnClickedButtonB)、C(OnBnClickedButtonC)、D(OnBnClickedButtonD)、E(OnBnClickedButtonE)、F(OnBnClickedButtonF)、左括号(OnBnClickedButtonLbracket)、右括号(OnBnClickedButtonRbracket)、+(OnBnClickedButtonAdd)、—(OnBnClickedButtonMinus)、×(OnBnClickedButtonMultiply)、/(OnBnClickedButtonDiv)、小数点(OnBnClickedButtonPoint)、PI(OnBnClickedButtonPi)的响应函数与按钮0类似,仅末尾添加的字符变为相应的字符。
对按钮Sqrt(OnBnClickedButtonSqrt)的响应函数:
void CMy1106840420Dlg::OnBnClickedButtonSqrt()
{
CString temp1;
CString temp2;//定义两个CString变量
this->UpdateData(true);//更新数据
m_inputstr.GetWindowText(temp1);//获得字符串并存入temp1中
temp2 += "sqrt(";
temp2 += temp1;
temp2 += ")";//将字符串1改造成符合sqrt()函数样式的字符串,存入temp2
this->m_inputstr.SetWindowText(temp2);//将temp2设为m_inputstr的值
CMy1106840420Dlg::OnBnClickedButtonEqual();
//调用OnBnClickedButtonEqual()函数计算最终结果并显示
}
对求立方(OnBnClickedButtonCube)、平方(OnBnClickedButtonSqu)、任意次方(OnBnClickedButtonPower)、Log(OnBnClickedButtonLog)、ln(OnBnClickedButtonLn)、10的次方(OnBnClickedButton10e)、e的次方(OnBnClickedButtonExp)、取整(OnBnClickedButtonInt)、sin(OnBnClickedButtonSin)、cos(OnBnClickedButtonCos)、tan(OnBnClickedButtonTan)、arcsin(OnBnClickedButtonArcsin)、arccos(OnBnClickedButtonArccos)、arctan(OnBnClickedButtonArctan)、取模(OnBnClickedButtonMod)、绝对值(OnBnClickedButtonAbs)的消息响应函数与按钮Sqrt相类似,仅对应函数变化。
对按钮Backspace(OnBnClickedButtonBackspace)的响应函数:
void CMy1106840420Dlg::OnBnClickedButtonBackspace()
{
CString temp1;
CString temp2;
this->UpdateData(true);
m_inputstr.GetWindowText(temp1);
for (int i=0;i<_tcslen(temp1)-1;++i)
temp2.AppendChar(temp1[i]);//取得字符串长度减一个字符
this->m_inputstr.SetWindowText(temp2);
this->UpdateData(false);
}
对按钮CE的响应函数:
void CMy1106840420Dlg::OnBnClickedButtonClear2()
{
CString temp1;
this->UpdateData(true);
m_inputstr.GetWindowText(temp1);
temp1="";//字符串置为空
this->m_inputstr.SetWindowText(temp1);
this->UpdateData(false);
}
对按钮=(OnBnClickedButtonEqual)的消息响应函数:
void CMy1106840420Dlg::OnBnClickedButtonEqual()
{
char str[1000];
CString m_value;
CMathString mathstring;//定义一个字符串计算类的对象
m_inputstr.GetWindowText(str,m_inputstr.GetWindowTextLength()+2);
mathstring.Initial(str);//初始化CMathString类的对象
if(mathstring.checkString())//检查表达式是否合法
{
mathstring.stringToBolan();//将表达式转换成逆波兰后缀表示法
if(!mathstring.compvalue())//计算结果
{
m_value.Format("%f",mathstring.getvalue());
m_inputstr.SetWindowText(m_value);
}
else
MessageBox(_T("计算时发生错误"));
}
else
MessageBox(_T("表达式错误?"));
}
对单选按钮十进制(OnClickedDec)的响应函数:
void CMy1106840420Dlg::OnClickedDec()
{
GetDlgItem(IDC_BUTTON_A)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_B)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_C)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_D)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_E)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_F)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_9)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_8)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_7)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_6)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_5)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_4)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_3)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_2)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_1)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_0)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_Point)->EnableWindow(true);
//将十进制下按钮显示,非十进制的按钮灰化,使其无法使用
CString temp1;
CString temp2;
char temp3[100];
int dblData = 0;
this->UpdateData(true);
m_inputstr.GetWindowText(temp1);
if (this->m_FormerBase == 8){
sscanf(temp1.GetBuffer(temp1.GetLength()), "%o",&dblData);
//以8进制方式将字符串转换为整型
itoa(dblData,temp3,10);//转换为10进制
temp2 = temp3;
}else if (this->m_FormerBase == 16){
sscanf(temp1.GetBuffer(temp1.GetLength()), "%x",&dblData);
//以16进制方式将字符串转换为10进制
itoa(dblData,temp3,10);
temp2 = temp3;
}else if (this->m_FormerBase == 10){
temp2 = temp1;
}
this->m_inputstr.SetWindowText(temp2);
this->UpdateData(false);
this->m_FormerBase = 10;//表示此次结果为十进制,为以后转换服务
}
对8进制按钮与16进制按钮的处理与10进制类似
2、遇到的问题及解决办法
(1)首先是Unicode字符集导致字符串的各种函数无法使用,上网搜寻了N多的方法之后,最终还是只能放弃Unicode字符集,使用多字节字符。
(2)但修改为多字节字符集之后,程序的窗口风格变成了古老的win95系列的风格。再次上网上搜寻N久之后,通过修改stdafx.h头文件中相关的定义之后,修改回win7的样式风格。
(3)获取编辑框的字符串之后,要对字符串进行求值。首先想到的就是使用逆波兰后缀表达式法对字符串求值。找出高中时写的代码,尝试修改接口,使之运行。但字符串求值实在是麻烦,调试了好多遍之后,还是放弃自己编写的代码,使用网络上高手提供的CMathString类。该类可以求算术表达式的值,支持各种函数,例如sin,log,sqrt,exp等。通过调用CMathString完成对表达式的求值操作。
(4)十进制、八进制、十六进制之间的进制转换可以直接调用系统的函数来实现,但二进制却没有相关的直接转换函数,如果需要实现与二进制转换相关功能,需手动对字符串修改,过于繁琐,遂放弃此功能。
3、体会与建议
(1)通过此计算器课程设计的制作,深刻感受到了使用MFC开发应用程序的方便与简单。
(2)严格说来,这个程序是我制作的第一个基于win32窗口的应用程序,与原先的命令行程序有着天壤之别。MFC高度的底层代码封装性,着实在开始使用时很不习惯,连最基本的main()函数都找不到了,程序的运行过程也是有点摸不着头脑。
4、参考文献
侯俊杰《深入浅出MFC(第二版)》华中科技大学出版社
第二篇:孔永刚MFC课程设计报告
《MFC编程及应用》课程设计报告
题目:
学号: 1104620110 姓名: 孔永刚
指导老师: 杨均匀
时间: 20##年5月28日
总结:
MFC课程设计报告终于完成了,它与我之前学过的C++面向程序的设计相比,更加的复杂,更加难懂,由于我之前对MFC方面的知识了解不是很透彻,所以在设计程序时遇到了很多的困难。例如:在设计一些窗口时,对着程序看了一上午,也没有把问题解决,后来不得不请教学长,有了学长的帮忙在把这个问题搞定了。还有很多不如意的地方我就不依依例举了。总之,设计这个程序花费了我很多的功夫。但同时也让我学到了不少的学习经验。计算机是一门重要的课程,它的应用十分广泛,我们只有不断的积累,才能慢慢地了解它,并掌握它。
我知道,这次设计的程序中依然存在着不少问题。例如:在开发简单程序方面,我任然感觉十分吃力,在对话框UI和工作部分不能很好的结合,接口很生涩,程序效率不高。我认为这一点又必要进行修改。还有几处微小的部分需要进行修改。但我的知识有限,同时,时间也很紧迫,所以有些问题尚需要解决。
总之,不管怎样,通过不懈的努力,完成了这次课题的设计,是值得高兴的。同时也让我明白,只要坚持不懈的去做一件事,不管结果怎样,享受过程是美好的。当克服一个个困难时,那种喜悦的气氛久久不会消逝。
此外,我认为学好计算机课程是必要的,其中的方法有很多,只要自己多编程,多思考,多研究,与其他人一起交流,细心观察别人编写的程序的方法,同是在错误中不断的调试,就一定能够编好程序,学懂计算机。