程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> MFC編寫的仿Windows計算器

MFC編寫的仿Windows計算器

編輯:關於VC++

首先你應該了解面向對象的基於消息驅動的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);//即所有回歸默認

好了,其他的功能,用戶 可以同樣處理,只不過是換個樣子而已。當然了,讀者可以隨時想到隨時增加進去。希望, 讀者能夠有所收獲

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved