Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2086782
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:41:56

一起学习
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);//即所有回归默认

好了,其他的功能,用户可以同样处理,只不过是换个样子而已。 当然了,读者可以随时想到随时增加进去。 希望,读者能够有所收获 下载本文示例代码


MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器MFC 编写的仿 Windows 计算器
阅读(675) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~