首先你應該了解面向對象的基於消息驅動的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);//即所有回歸默認
好了,其他的功能,用戶 可以同樣處理,只不過是換個樣子而已。當然了,讀者可以隨時想到隨時增加進去。希望, 讀者能夠有所收獲