这里是代码传送门Calculator
1作业要求
这次作业如果用几个字来描述,那么就是:百度百度百度百度再次百度
2第六次作业:
界面库选择:VS2015 MFC
实现步骤:
1.MFC界面雏形
表示VS是寒假安好的,但是我却一直因为不会用因为是坏的,感谢pbb亲授如何建立与执行项目(虽然我后来还是百度到了)
之后先是将DEV C++ 上的文件移植到VS上出了错,原因是,VS认为freopen不安全,然后又是在别人的帮助与查找资料的情况下,知道了解决方法:忽略警告:
#pragma warning(disable:4996)//加在使用了freopen的.cpp处即可
然后就是正式开始啦,我一开始并不知道如何将MFC与自己的代码联系起来,为了熟悉一下MFC,我百度了很多个类似于制作计算器的网址,按照步骤全部做了一遍:
然后按钮什么的也都不懂,也百度了好久:
然后这个时候,很幸运的偶然机会下,sy妹子聊了起来,然后她很热心的一步一步截图教了我最基础的按键响应,如何让编辑框出现表达式的形式.....
做完之后大概是这个样子的:
2.实现基本的计算功能
弄完这一步后,我突然就明白了,可以将原来的代码,按类,一个一个添加进这个MFC的项目去,因为这个项目一开始创建就是选择C++的MFC,所以是不会冲突的,然后只要在‘=’这个button的函数中,嵌入原来在DEV C++的main 里面的功能,把表达式入栈,计算,都在这个函数里面处理,再把结果的double形式再变成字符型传回,即可完成一次计算
然后这里会遇见一个最耗时的问题:如何在CString类与String类质检进行转换?
经过百度了好久好久...以下是转换:
string tmp1 = “***”;
CString tmp2;
tmp2 = tmp1.c_str();//string要先变成 *char 才可以赋值给CString类
CString expression =“***” ;
USES_CONVERSION;
string tmp(W2A(expression))//我没看懂,但是亲测可用,虽然后面没有用到,但是是后话了
解决了这个问题,接下来就是将主函数中的东西照搬到 “=” 这个button里面就好了,在照搬过程中,可以顺便解决掉关于附加的第七次作业类名的要求.
3.实现按键响应功能
从这一步开始,我独自一人便跳入了深坑,一去不复返。。。
首先来一个教程:如何识别按键响应
啊..我是看了这个人的问题后才懂的,得先识别是否按键,然后再获取按键,这里要先知道一个前提:每一个按键对应一个ASCII码,然后它获取ASCII码后进行匹配,而我们做的就是:重载键盘的按键响应函数,将需要的按键的ASCII记录,让他实现我们需要使用的功能,仅此而已
附上响应的编码:在VC/MFC中响应键盘按键
但是!!你在重载的时候会发现,字母表上面那一排是没有宏定义的....
我找了很久后....明白了那个看起来乱七八糟的东西是宏定义...明白了按键与ASCII之间的关系...然后..直接百度了键盘按键的ASCII码...然后直接用ASCII来弄:
3.5小细节
做完前面的之后,你会发现...好激动...终于做出来的..但是不要高兴的太早...前面有一些比较坑的地方,我在这里列出来:
细节1:
BackSpace:string与CString如何删除最后一个字符
最后实现代码是:
CString expression;
expression = expression.Left(expression.GetLength() - 1);
String ToCalexpression;
ToCalexpression = ToCalexpression.substr(0, ToCalexpression.length() - 1);
细节2:
ESC:支持清空
这里强调一个::默认给你的确定
与取消
你删掉就好了,但是!对应的函数(里面的内容)千万千万不要删了....不然你会关!不!掉!程!序!,因为时间太短..我也没深究...没时间的孩子就不要像我这样没事找事了...
细节3 :
实现为“×”
、"÷"
,这个比较坑.当你弄了之后才发现,这看似是一个符号实际上是占2个字符的大小的...这样子就没有办法直接给原来的代码用了..解决办法2个...一个是改代码..我想了想..太麻烦...
然后选择了第二种....一个用CString显示到编辑框..然后就偷偷用另外一个string的变量.来进行实际的运算操作...这个就是为什么我说,我后来发现不需要将CString类变成string类的原因
4.支持文件输入输出:
因为不是一一次性做完...我后面打开的时候找不到Dialog的图形界面窗口了..
这里需要实现的功能是,用按钮实现弹窗,并支持查找文件与直接输文件:
这里也是需要大量资料的:
MFC实现弹窗这里注意看7.8楼说的
至于如何在编辑框实现与手动输入与确定,与第一级Dailog类似,将文件输入输出放置于确定按钮,然后将原DEV C++功能搬进来即可
一些细节:
实现一次操作后要清空表达式的值
(还有啥一下子想不起来了)
做完之后,再优化一下,界面就变成这样子的了:
吐槽一下,我知道界面很丑界面很丑界面很丑....不要喷我不要喷我不要喷我
(注:最后一个是强行用了一下MessageBox
...
UpdateData(TRUE);
CString cstr;
cstr = "Author : Anani_leaf\nBlog : http://home.cnblogs.com/u/Anani-leaf/\n";
MessageBox(cstr);
UpdateData(FALSE);
5.附加作业:
关于cmd模型下的支持我自己的没有完成....所以这方面不太像弄...如果有弄好的请务必告诉我怎么弄.....大概就这样子吧..虽然没成功,但是还是附上比较有用的资料吧:
获取命令行参数
小结:
虽然最后作业差一步cmd的没弄完.....但是总体是好的....
这应该算是我大学以来坚持的第二久的有实体的事情了....
这个算是我做的第一个比较类似于项目的东西,可以说,虽然这次作业做的有点吐血的,而且大部分都是查资料出来的,但是我觉得这次作业对我而言一个比前面5次作业的收获都大,不仅仅是知识方面,虽然大部分是查出来的,但是你把代码小心翼翼贴上去的时候,你发现可以执行的时候,这个感觉...真的是...挺好的...而且虽然不是很懂,但是弄多了..总还是有一些了解的..至少这次作业,让我真正找到了,C++做除了acm以外其他的事情,虽然我并不知道我何时(下学期还是再下学期)才会真正开始玩项目(即使不是C++),但是却给了我一种挺好的感觉(虽然过程十分的痛苦),不过说真的,终于做完了这一系列作业,颇有感触。船到桥头自然直,我只要做好自己,勿忘初心即可。