第六次作业之图形界面

时间:2023-01-28 07:31:06

这里是代码传送门Calculator

1作业要求

这次作业如果用几个字来描述,那么就是:百度百度百度百度再次百度

2第六次作业:

界面库选择:VS2015 MFC

实现步骤:

1.MFC界面雏形

表示VS是寒假安好的,但是我却一直因为不会用因为是坏的,感谢pbb亲授如何建立与执行项目(虽然我后来还是百度到了)

之后先是将DEV C++ 上的文件移植到VS上出了错,原因是,VS认为freopen不安全,然后又是在别人的帮助与查找资料的情况下,知道了解决方法:忽略警告

#pragma warning(disable:4996)//加在使用了freopen的.cpp处即可

然后就是正式开始啦,我一开始并不知道如何将MFC与自己的代码联系起来,为了熟悉一下MFC,我百度了很多个类似于制作计算器的网址,按照步骤全部做了一遍:

MFC制作简单计算器1

MFC制作简单计算器2

然后按钮什么的也都不懂,也百度了好久:

MFC基于对话框编程:[5]按钮的使用

然后这个时候,很幸运的偶然机会下,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++),但是却给了我一种挺好的感觉(虽然过程十分的痛苦),不过说真的,终于做完了这一系列作业,颇有感触。船到桥头自然直,我只要做好自己,勿忘初心即可。