首先,讓我們來仔細(xì)了解一下mircosoft的計算器吧,我們發(fā)現(xiàn)它是一個基于對話框的含有兩的主對話框、一個關(guān)于對話框、一個菜單的應(yīng)用程序。也就是說,我們應(yīng)該創(chuàng)建一個基于對話框的應(yīng)用程序,并且為其添加一個菜單和一個主對話框(因為,應(yīng)用程序已經(jīng)創(chuàng)建好了一個主對話框和關(guān)于對話框)
接下來,我們應(yīng)該設(shè)計對話框的界面了,這個是很簡單的事情,你只要將其和mircosoft的計算器比較就行了。當(dāng)然,你也可以添加其他控件。
第一個主對話框也就是默認(rèn)的主程序界面,是用于執(zhí)行簡單計算(+、-、*、/、開根、倒數(shù)、平方等)
第二個就是執(zhí)行科學(xué)計算的程序了。用戶可以用vc/MFC中的控件排版工具和TAB設(shè)計出一個漂亮的界面(通常,程序的界面在很大程度上會影響程序的普及度和用戶的情緒的)。好了,上面的工作完成后,我們進(jìn)入正題吧。
我們首先要為所有控件指定一個ID號(一定要見ID知其意),比如0控件我們用ID_0表示。其他控件依次類推。設(shè)計好ID后我們就應(yīng)該為其添加變量,這里我們?yōu)樗械某司庉嬁丶獾目丶付–String型變量,編輯控件為CEdit。然后我添加一些必要的成員變量(我們以簡單計數(shù)器為例介紹)
public:
char m_sign; //記錄運算符+、-、*、/等
int m; //控制編輯框中的字符
int n; //用于判斷連續(xù)進(jìn)行了幾次運算
CString strItem; //用于記錄當(dāng)前編輯框中的數(shù)據(jù)
CString m_string; //用于記錄前n-1次的運算結(jié)果
現(xiàn)在,我們編寫構(gòu)造函數(shù): m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m=n=0;
m_string="";
strItem="";
我們?nèi)缓鬄閿?shù)字鍵編寫程序:(以0為例)
if(!m) {m_Edit.SetWindowText("");m++;} //用于得到連續(xù)的輸入
m_Edit.GetWindowText(strItem); //將當(dāng)前字符保存在strItem中
CString str="0";輸入數(shù)字
strItem+=str;//連續(xù)輸入字符
m_Edit.SetWindowText(strItem); //顯示連續(xù)的輸入
其他字符同樣處理這些字符控件實際上就是數(shù)字發(fā)生器,只不過一字符形式保存。 下面,我們應(yīng)該處理這些數(shù)據(jù)了我們以加法為例: //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);
}//以上是進(jìn)行判別與運算,這里用了CString對象轉(zhuǎn)換成數(shù)據(jù)的函數(shù)
m_sign=''+'';
strItem="";
n++;
if(m>0)m--;//是執(zhí)行完加法后,編輯框輸入新數(shù)據(jù)
m_Edit.SetWindowText(m_string);//顯示上一次按運算件的結(jié)果
像其他的-、*、/可以同樣的處理。最后,顯示最終結(jié)果:(即等號運算)
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='' '';//等號運算完所有數(shù)據(jù)回歸成默認(rèn)
當(dāng)然你可以加一些輔助功能:下面我們舉兩個例子:一個是退格功能;一個是清除功能。退格功能:
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);//即所有回歸默認(rèn)
好了,其他的功能,用戶可以同樣處理,只不過是換個樣子而已。當(dāng)然了,讀者可以隨時想到隨時增加進(jìn)去。希望,讀者能夠有所收獲.
|
新聞熱點
疑難解答
圖片精選