zoukankan      html  css  js  c++  java
  • 第六次程序设计作业 计算器图型界面的设计

    前言

    很遗憾,并没有在规定的时间之内完成这项作业。截止目前(2016/6/7)我还剩下输入输出路径的问题没有解决。但是我会把它做完的。本篇随笔是我之前遇到的问题的小结。

    在一周过后(6/11)我做出了成品,在断断续续的备考时间里,做出这个小成品感觉很开心,也收获了很多东西。

    实现计算器图型界面遇到的问题

    1.VS2015的登录问题。

    计算器我在上周一的时候就已经着手开始落实,在了解到VS上有MFC的平台之后,决定使用MFC进行本次作业操作的工具,除去中间想使用qt试试的时间,写出雏形也只用了两天不到的时间实现了计算器的大体功能,当时想的很当然,周末的时间内解决掉剩下的两个问题。结果遇到了这个无法登入的问题,花了很长的时间才解决。

    VS2015在刚刚下载的时候有一个试用期,是一个月。当它到期之后就需要使用你的微软账号进行登录(使用Windows10的朋友不必担心,当初申请Windows10的登录账号就可以使用了)。然而我是没有的(...),于是使用我的qq邮箱进行注册,不幸的是,在它发送邮件之后点击邮件准备激活的时候,我的百度游览器出现了页面错误,当我重新点开邮件里的链接的时候,微软很贴心的提示我此链接已过期,需要重新发送邮件。重新申请,好,我照办了,邮件也顺利的过来了,再一次点开邮件内的链接,好吧,还是页面错误。这就比较尴尬了。

    好吧,可能此路暂时不通,那么我就打算使用别人已经申请好的账号登录。那么出现了最蛋疼的bug,点我
    解决方案:升级IE游览器,重启,重启VS。

    可能是笔记本的原因,重新打开VS之后又一次加载不出来,当时的心情有些崩溃,于是调整了一下,决定先出去自习一会。晚上回到寝室,重新试了一下,发现可以使用了!!

    好了,看一下时间,肯定是做不完了。但是,不代表我永远做不出来。

    2.消息响应函数的实现。

    写主界面的时候顺风顺水,但是在写键盘消息响应的时候遇到了困难。主要是最后返回时是返回CDialogEx::PreTranslateMessage(pMsg),而我返回了其派生类的PreTranslateMessage函数。但是编译器的纠错却指向了该函数头部,让我找了半天。

    下面是我的消息响应函数:

    BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg)
    {
    	if (pMsg->message == WM_KEYDOWN)
    	{
    		switch (pMsg->wParam) // wParam 是 消息响应机制
    		{
            // 小键盘上 为虚拟键VK值 主键盘上 为十六进制
    
    		// 1.数字 0 ~ 9 键的实现 :
    
    		case 0x30 : // 主键盘 下同
    		case VK_NUMPAD0 : // 小键盘 下同
    			if (GetKeyState(VK_SHIFT) < 0) // 该函数检取指定SHIFT键的状态
    			{
    				OnBnClickedButtonRight(); // 当SHIFT键处于激活状态时 表示右括号
    			}
    			else // 当SHIFT键未被触发时 表示数字0
    			OnBnClickedButtonNum0();
    			break;
    
    		case 0x31 :
    		case VK_NUMPAD1 :
    			OnBnClickedButtonNum1();
    			break;
    
    		case 0x32 :
    		case VK_NUMPAD2 :
    			OnBnClickedButtonNum2();
    			break;
    
    		case 0x33 :
    		case VK_NUMPAD3 :
    			OnBnClickedButtonNum3();
    			break;
    
    		case 0x34 :
    		case VK_NUMPAD4 :
    			OnBnClickedButtonNum4();
    			break;
    
    		case 0x35 :
    		case VK_NUMPAD5 :
    			OnBnClickedButtonNum5();
    			break;
    
    		case 0x36 :
    		case VK_NUMPAD6 :
    			OnBnClickedButtonNum6();
    			break;
    
    		case 0x37 :
    		case VK_NUMPAD7 :
    			OnBnClickedButtonNum7();
    			break;
    
    		case 0x38 :
    		case VK_NUMPAD8 :
    			if (GetKeyState(VK_SHIFT) < 0) // 当SHIFT键处于激活状态时 表示乘法
    			{
    				OnBnClickedButtonmultiply(); 
    			}
    			else // 当SHIFT键未被触发时 表示数字8
    			OnBnClickedButtonNum8();
    			break;
    
    		case 0x39 :
    		case VK_NUMPAD9 :
    			if (GetKeyState(VK_SHIFT) < 0) // 当SHIFT键处于激活状态时 表示左括号
    			{
    				OnBnClickedButtonLeft();
    			}
    			else // 当SHIFT键未被触发时 表示数字9
    			OnBnClickedButtonNum9();
    			break;
    
    		case VK_BACK : // backspace
    			OnBnClickedButtonBackspace();
    			break;
    
    		case VK_RETURN : // enter
    			OnBnClickedOk();
    			break;
    
    		case 0XBF : // ?/键
    			OnBnClickedButtondivide();
    			break;
    
    		case VK_OEM_PLUS : // +=键
    			if (GetKeyState(VK_SHIFT) < 0)  // 当SHIFT键处于激活状态时 表示加号
    			{
    				OnBnClickedButtonAdd();
    			}
    			else // 当SHIFT键未被触发时 表示 = 
    			OnBnClickedOk();
    			break;
    
    		case VK_OEM_MINUS: // -键
    			OnBnClickedButtoncut();
    			break;
    
    		case 0x6E:  // .键 (小数点)
    			OnBnClickedButtonPoint();
    			break;
    		}
    		return FALSE;
    	}
    	return CDialogEx::PreTranslateMessage(pMsg);
    	// return CMFCApplication1Dlg::PreTranslateMessage(pMsg);
    }
    

    3.实现界面中的界面(按下按键弹出另一个界面)

    这里我利用了DOMODAL()函数,在另一个界面设计好了以后,把他们两个联系在了一起,困难谈不上,纪念一下一直寻找解决方法的自己。

    Switch按键的函数

    void CMFCApplication1Dlg::OnBnClickedButtonSwitch()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	WasMyNewDlg Wasdns;
    	Wasdns.DoModal();
    }
    

    4.选择文件路径

    先来看代码:

    void WasMyNewDlg::OnBnClickedButton1()
    {
    	// TODO: 在此添加控件通知处理程序代码
    
    	//将 szFilter (char *) 转换成 LPCTSTR
    	char  szFilter[] = "文本文件 (*.txt)|*.txt|All Files (*.*)|*.*||";
    	int num1 = MultiByteToWideChar(0, 0, szFilter, -1, NULL, 0);
    	wchar_t *wide1 = new wchar_t[num1];
    	MultiByteToWideChar(0, 0, szFilter, -1, wide1, num1);
    
    	//将 txt (char *) 转换成 LPCTSTR
    	char txt[] = "txt";
    	int num2 = MultiByteToWideChar(0, 0, txt, -1, NULL, 0);
    	wchar_t *wide2 = new wchar_t[num2];
    	MultiByteToWideChar(0, 0, txt, -1, wide2, num2);
    
    	//打开操作
    	CString filePath("");
    	CFileDialog OpenDlg(true, wide2, NULL, OFN_HIDEREADONLY, wide1); 
    	if (OpenDlg.DoModal() == IDOK)
            {
    		VERIFY(filePath = OpenDlg.GetPathName()); //得到完整文件名
    	}
    	INPUTFILE = filePath; //得到文件路径
    
    	UpdateData(false);
    }
    

    很奇怪的是,根据网上的部分资料显示的做法,编译器报错,显示没有该类型的CFileDialog的构造函数,刚刚开始我以为是TRUE出了问题,后来点进类库里面查看了一下,第一个参数确实是BOOL类型的,才发现是最后传入的参数是char *类型的,进行了一次类型转换改正了过来。

    界面展示

    主界面

    副界面(文件操作)

    个人感慨

    距离我们高考结束已经过去了一年的时间,在这一年的时间里,我自认为是成长了很多,了解了很多的知识,也结识了很多优秀的朋友,像本次作业的完成,离不开朝夕男神和伟鹏男神,还有泉州一霸景钊的帮助,有了他们的经验我少走了很多弯路。

    其实结束也是一种新的开始,去年的今天我曾经背过一段语文的作文模板,其中有一句话仍然让我记忆犹新:
    其实现在的你在哪里,并不重要,重要的是,你依然站在前进的道路上,做着坚韧上进的自己。

    有时候,看似很困难去实现的一件事情,在时间面前也是很微不足道的。

    却顾所来径,苍苍横翠微。
    ---2016/6/11

  • 相关阅读:
    Jenkins+Docker+Git+Harbor流水线打包
    docker镜像批量打包
    二进制安装docker-18.06.3-ce
    kubeadm添加新master或node
    Host is not allowed to connect to this MySQL server
    RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】
    RecyclerSwipeAdapterDemo【使用AndroidSwipeLayout用于列表项侧滑功能】
    RecyclerViewItemTouchHelperDemo【使用ItemTouchHelper进行拖拽排序功能】
    Android APP应用启动页白屏(StartingWindow)优化
    KeyboardUtil【软键盘弹出后输入框上移一定的高度】
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5568026.html
Copyright © 2011-2022 走看看