当前位置: 首页 > 图文教程 > 开发语言 > VC++ > MFC 编写的仿 Windows 计算器

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 MFC 编写的仿 Windows 计算器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 125 ::
收藏到网摘: n/a

MFC 编写的仿 Windows 计算器

作者 章志强


  首先你应该了解面向对象的基于消息驱动的Windows消息编程,当然,对于编写这个计算器,你不必知道太多的windows编程,你重要会编写基于对话框的简单应用程序就可以了。
  首先,让我们来仔细了解一下mircosoft的计算器吧,我们发现它是一个基于对话框的含有两的主对话框、一个关于对话框、一个菜单的应用程序。也就是说,我们应该创建一个基于对话框的应用程序,并且为其添加一个菜单和一个主对话框(因为,应用程序已经创建好了一个主对话框和关于对话框)
  接下来,我们应该设计对话框的界面了,这个是很简单的事情,你只要将其和mircosoft的计算器比较就行了。当然,你也可以添加其他控件。
  第一个主对话框也就是默认的主程序界面,是用于执行简单计算(+、-、*、/、开根、倒数、平方等)
  第二个就是执行科学计算的程序了。用户可以用vc中的控件排版工具和TAB设计出一个漂亮的界面(通常,程序的界面在很大程度上会影响程序的普及度和用户的情绪的)。好了,上面的工作完成后,我们进入正题吧。
  我们首先要为所有控件指定一个ID号(一定要见ID知其意),比如0控件我们用ID_0表示。其他控件依次类推。设计好ID后我们就应该为其添加变量,这里我们为所有的除了编辑控件外的控件指定CString型变量,编辑控件为CEdit。然后我添加一些必要的成员变量(我们以简单计数器为例介绍)

public:	char m_sign; //记录运算符+、-、*、/等	int m;	//控制编辑框中的字符	int n;	//用于判断连续进行了几次运算	CString strItem;	//用于记录当前编辑框中的数据	CString m_string;	//用于记录前n-1次的运算结果
现在,我们编写构造函数:
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m=n=0;m_string="";strItem="";
我们然后为数字键编写程序:(以0为例)
if(!m) {m_Edit.SetWindowText("");m++;}	//用于得到连续的输入	m_Edit.GetWindowText(strItem);	//将当前字符保存在strItem中	CString str="0";输入数字	strItem+=str;//连续输入字符	m_Edit.SetWindowText(strItem);	//显示连续的输入
其他字符同样处理这些字符控件实际上就是数字发生器,只不过一字符形式保存。下面,我们应该处理这些数据了我们以加法为例:
//n用来判断是不是第一次按+号按扭if(!n){	m_string=strItem;	if(m_string==""){m_string="";return;}}else{	double num1,num2;	num1=atof(m_string);	num2=atof(strItem);	switch(m_sign)	{	case ''+'':num1+=num2;break;	case ''-'':num1-=num2;break;	case ''*'':num1*=num2;break;	case ''/'':if(!num2) AfxMessageBox("the divisor is 0!"); else num1/=num2;break;	case ''%'':if(!num2) AfxMessageBox("the divisor is 0!"); else num1=(int)num2%(int)num1;break;	default:break;	}	m_string.Format("%.6f",num1);}//以上是进行判别与运算,这里用了CString对象转换成数据的函数m_sign=''+'';strItem="";n++;if(m>0)m--;//是执行完加法后,编辑框输入新数据m_Edit.SetWindowText(m_string);//显示上一次按运算件的结果
像其他的-、*、/可以同样的处理。最后,显示最终结果:(即等号运算)
if(!n){	m_string=strItem;}else{	double num1,num2;	num1=atof(m_string);	num2=atof(strItem);	switch(m_sign)	{	case ''+'':num1+=num2;break;	case ''-'':num1-=num2;break;	case ''*'':num1*=num2;break;	case ''/'':if(!num2) AfxMessageBox("the divisor is 0!"); else num1/=num2;break;	case ''%'':if(!num2) AfxMessageBox("the divisor is 0!"); else num1=(int)num1%(int)num2;break;	default:break;	}	m_string.Format("答案: %.6f",num1);}m_Edit.SetWindowText(m_string);m_string="";strItem="";n=0;m=0;m_sign='' '';//等号运算完所有数据回归成默认
当然你可以加一些辅助功能:下面我们举两个例子:一个是退格功能;一个是清除功能。退格功能:
m_Edit.GetWindowText(strItem);if(!strItem.GetLength())::AfxMessageBox("the contents is empty!");else {	strItem.SetAt(strItem.GetLength()-1,NULL);	m_Edit.SetWindowText(strItem);}
读者可以自己体会,并相处更好的更多的其他功能。清除功能:
strItem="";m_string="";n=0;m=0;m_sign='' '';m_Edit.SetWindowText(m_string);//即所有回归默认
好了,其他的功能,用户可以同样处理,只不过是换个样子而已。当然了,读者可以随时想到随时增加进去。希望,读者能够有所收获