小練習(xí):使用winform做一個(gè)小型計(jì)算器實(shí)現(xiàn)基本功能。
思路:首先要弄清楚的是計(jì)算器的實(shí)現(xiàn)原理,當(dāng)用戶按下計(jì)算器上的鍵計(jì)算器會(huì)做相應(yīng)的操作,同時(shí)在將反饋信息顯示在一個(gè)文本框中。對(duì)應(yīng)于程序中實(shí)際上是處理用戶點(diǎn)擊某個(gè)按鈕的事件,當(dāng)用戶點(diǎn)擊了某個(gè)按鍵之后,程序會(huì)做相應(yīng)的處理。例:如果用戶點(diǎn)的是數(shù)字鍵,會(huì)直接在計(jì)算器上部的文本框中顯示出來(lái),其他的就相應(yīng)做一個(gè)判斷,上部的文本框是結(jié)果的反饋。
成都創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來(lái)公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過(guò)去的十余年時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如成都辦公窗簾等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過(guò)硬的技術(shù)實(shí)力獲得客戶的一致稱(chēng)贊。
注:在處理事件時(shí)為了減少程序代碼量,沒(méi)必要單獨(dú)為每個(gè)button處理其點(diǎn)擊事件,例如當(dāng)用戶按下1-9的數(shù)字時(shí),在計(jì)算器上部的textbox中就會(huì)顯示用戶輸入的數(shù)字,可以將這幾個(gè)button事件放在一起處理,減少代碼量,具體實(shí)現(xiàn)如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//處理用戶點(diǎn)擊數(shù)字鍵的事件
button2.Click += new EventHandler(Button_Click);//將 button2.Click關(guān)聯(lián)到自定義方法Button_Click
button3.Click += Button_Click;//將button3.Click關(guān)聯(lián)到Button_Click方法
button4.Click += Button_Click;
button5.Click += Button_Click;
button6.Click += Button_Click;
button7.Click += Button_Click;
button8.Click += Button_Click;
button9.Click += Button_Click;
button10.Click += Button_Click;
button11.Click += Button_Click;
//處理用戶點(diǎn)擊運(yùn)算符的事件
button1.Click += Operator_Click;//將button1.Click事件關(guān)聯(lián)到Operator_Click方法
button14.Click += Operator_Click;
button15.Click += Operator_Click;
button16.Click += Operator_Click;
}
bool mark = true;//定義一個(gè)mark用來(lái)判斷什么時(shí)候可以可以輸入運(yùn)算符,比如用戶已經(jīng)輸了一個(gè)運(yùn)算符,就不能再輸了
///
///自定義的一個(gè)方法,當(dāng)用戶點(diǎn)擊了數(shù)字鍵或運(yùn)算符時(shí)將關(guān)聯(lián)到這個(gè)方法,將當(dāng)前button的文本屬性獲取顯示在textbox中
///
///
接收關(guān)聯(lián)來(lái)的對(duì)象
///
private void Button_Click(object sender, EventArgs e)
{
if (textBox1.Text == "0")//如果原來(lái)的文本框是0,就將按的button的文本值賦給textBox1.Text
{
textBox1.Text = (sender as Button).Text;
return;//跳出整個(gè)Button_Click方法
}
if (!equalmark)//已經(jīng)做了結(jié)果了運(yùn)算了,這時(shí)就清空原來(lái)的文本框,等待輸入一個(gè)數(shù),否則新輸入的數(shù)就會(huì)直接拼接在結(jié)果后 //面
{
textBox1.Clear();//清空文本框
}
equalmark = true;//表示可以繼續(xù)拼接數(shù)字了
if (!string.IsNullOrEmpty(operators) && mark)//!string.IsNullOrEmpty(operators)判斷如果operators不為空,即用戶已經(jīng)點(diǎn)擊過(guò)運(yùn)算符,并且文本框中也有值,表示用戶已經(jīng)輸入了第一個(gè)操作數(shù),并且mark為true,這是就清空文本框,然后將mark置為false可以無(wú)限制輸入而不是只能輸一位,這里的mark就是這個(gè)作用
{
textBox1.Clear();//清空文本框
mark = false;//將mark置為false,表示可以繼續(xù)點(diǎn)擊運(yùn)算符
}
textBox1.Text += (sender as Button).Text;
}
///
/// 定義一個(gè)方法,處理如果點(diǎn)的是運(yùn)算符所需要做的操作,處理運(yùn)算符,如果用戶輸入的是運(yùn)算符,就清空文本框中
/// 的內(nèi)容,但是在清空之前要保存原來(lái)文本框中的內(nèi)容,為后來(lái)做運(yùn)算用;同時(shí)將獲得的運(yùn)算符賦給textBox1.Text,
/// 同樣清空,因?yàn)橛?jì)算器中運(yùn)算符是沒(méi)有顯示出來(lái)的
///
///
///
string str;//定義一個(gè)string類(lèi)型的變量str,獲取用戶點(diǎn)的數(shù)字
string operators;//定義一個(gè)string類(lèi)型的變量operators,獲取用戶點(diǎn)的運(yùn)算符
private void Operator_Click(object sender, EventArgs e)
{
str = textBox1.Text;//獲取用戶輸入的數(shù)字賦值給str
operators = (sender as Button).Text;
}
///
/// 用戶按了=之后觸發(fā)的事件,根據(jù)用戶輸入計(jì)算值
///
///
當(dāng)前對(duì)象
///
bool equalmark = true;//定義一個(gè)bool類(lèi)型的equalmark表示用戶
private void button13_Click(object sender, EventArgs e)
{
switch (operators)
{
case "+"://如果用戶按的是+號(hào),處理加法
textBox1.Text =(double.Parse ( str) + double.Parse (textBox1.Text)).ToString ();//textBox1.Text原來(lái)存放的是第二次用戶輸入的數(shù)字加上原來(lái)保存的str最后賦值給textBox1.Text,作為最后的顯示,這里注意賦值不是拼接
break;
case "-":
textBox1.Text = (double.Parse(textBox1.Text)-double.Parse(str) ).ToString();
break;
case "*":
textBox1.Text = (double.Parse(str) * double.Parse(textBox1.Text)).ToString();
break;
case "/":
textBox1.Text = (double.Parse(textBox1.Text)/double.Parse(str)).ToString();
break;
}
//運(yùn)算完成
operators = "";//將保存運(yùn)算符的字段置為空
mark = true;//mark置為true表示當(dāng)已經(jīng)點(diǎn)過(guò)運(yùn)算符之后可以繼續(xù)輸入多位數(shù)字
equalmark = false;//equalmark用來(lái)實(shí)現(xiàn)在輸出的結(jié)果后面不能繼續(xù)累加數(shù)字的作用
}
///
/// 處理用戶按了小數(shù)點(diǎn)之后的事件
///
///
///
private void button12_Click(object sender, EventArgs e)
{
if (!textBox1.Text.Contains('.'))
{
if (textBox1.Text == "")//如果原來(lái)的文本框包含.并且原來(lái)為空,就將里面的文本變?yōu)?.
{
textBox1.Text += "0.";
}
else
{
textBox1.Text += ".";//如果原來(lái)的文本框不為0,并且不包含.,就把.添加進(jìn)去
}
}
}
}
}