知识点:基本控件的使用、计算器窗体设计、简单if结构语句的使用。
实现效果:完整计算器界面,任意点选数字,实现基础数学运算。
实现步骤:
第一步:在项目实践3演示的项目MyCounter中,新添加一个窗体,设置窗体的Text属性为“完整版计算器”。
第二步:添加一个TextBox控件到窗体上,并设置TextAlign属性为right,让文本居右对齐。
添加按钮控件到窗体上,并设置好对应的Text属性,同时调整好按钮控件的顺序。(为了后面操作方便,我们按照控件拖入的顺序,依次设置其Text属性为1——9、等,也就是说将按钮控件的Name顺序和其Text显示的数字序号一一对应。)
第三步:进入窗体的代码模式,添加两行代码:
int op = 0; //声明一个整型变量,用来存放运算符号(用数字1/2/3/4等分别代表加减乘除,如加号是1,减号是2……)
double num1, num2, jieguo; //声明三个变量,用来存放操作数和结果。
第四步:依次给运算符号添加事件。
方法:在窗体设计界面,双击加号按钮,进入代码编写模式,添加两行代码:
op = 1;//当用户点击加号时,将数字1赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
依次给其他运算符号按钮添加事件,注意不同运算符号,对应不同的数字。
private void button13_Click(object sender, EventArgs e)//加号按钮+
{
op = 1;//当用户点击加号时,将数字1赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button14_Click(object sender, EventArgs e)//减号按钮-
{
op = 2;//当用户点击减号时,将数字2赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button15_Click(object sender, EventArgs e)//乘号按钮*
{
op = 3;//当用户点击乘号时,将数字3赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button16_Click(object sender, EventArgs e)//除号按钮/
{
op = 4;//当用户点击除号时,将数字4赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button17_Click(object sender, EventArgs e)//平方按钮x²
{
op = 5;//当用户点击平方号时,将数字5赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button18_Click(object sender, EventArgs e)//开方按钮√
{
op = 6;//当用户点击开方号时,将数字6赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button19_Click(object sender, EventArgs e)//取模按钮%
{
op = 7;//当用户点击取模按钮时,将数字7赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button20_Click(object sender, EventArgs e)//取清零按钮C
{
op = 0;//当用户点击清零按钮时,将数字0赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
第五步:给等号按钮添加点击事件。这里用一个switch判断,判断用户点击的是哪个操作符号,并计算出结果。然后将结果信息强制转换成string类型后,赋值给TextBox输入框。
private void button12_Click(object sender, EventArgs e)//等号按钮=
{
switch (op)
{
case 1://加号运算符
jieguo = num1 + num2;
break;
case 2://减号运算符
jieguo = num1 - num2;
break;
case 3://乘号运算符
jieguo = num1 * num2;
break;
case 4://除号运算符
jieguo = num1 / num2;
break;
case 5://平方运算符
jieguo =Math.Pow(num1,2);
break;
case 6://开方运算符
jieguo =Math.Sqrt(num1);
break;
case 7://取模运算符
jieguo = num1 % num2;
break;
case 0://清零运算符
jieguo = 0;
break;
}
textBox1.Text = Convert.ToString(jieguo);//将最终运算结果,强制转换成string类型后,赋值给TextBox1的文本属性
op = 0;//显示结果以后,将运算符变量op恢复到最初状态
}
第六步:依次给数字按钮,添加事件。方法:双击对应的数字按钮0——9和小数点,进入代码编写模式,添加代码。
private void button1_Click(object sender, EventArgs e)//数字1按钮的点击事件
{
textBox1.Text = textBox1.Text + "1";//将数字1显示在TextBox输入框里,因为输入框默认的Text类型是string类型
if (op == 0)//判断当前运算符号,如果是0,那么代表还没有点击运算符,即当前数字是num1
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2= Convert.ToDouble(textBox1.Text);
}
}
程序完整版代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MyCounter
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
//声明一个变量,用来存放运算符号(如加号是1,减号是2……)
int op = 0;
//声明三个变量,用来存放操作数和结果
double num1, num2, jieguo;
private void button13_Click(object sender, EventArgs e)//加号按钮+
{
op = 1;//当用户点击加号时,将数字1赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button14_Click(object sender, EventArgs e)//减号按钮-
{
op = 2;//当用户点击减号时,将数字2赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button15_Click(object sender, EventArgs e)//乘号按钮*
{
op = 3;//当用户点击乘号时,将数字3赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button16_Click(object sender, EventArgs e)//除号按钮/
{
op = 4;//当用户点击除号时,将数字4赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button17_Click(object sender, EventArgs e)//平方按钮x²
{
op = 5;//当用户点击平方号时,将数字5赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button18_Click(object sender, EventArgs e)//开方按钮√
{
op = 6;//当用户点击开方号时,将数字6赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button19_Click(object sender, EventArgs e)//取模按钮%
{
op = 7;//当用户点击取模按钮时,将数字7赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button20_Click(object sender, EventArgs e)//取清零按钮C
{
op = 0;//当用户点击清零按钮时,将数字0赋值给变量op
textBox1.Text = "";//同时,清空textBox1里的文本内容
}
private void button12_Click(object sender, EventArgs e)//等号按钮=
{
switch (op)
{
case 1://加号运算符
jieguo = num1 + num2;
break;
case 2://减号运算符
jieguo = num1 - num2;
break;
case 3://乘号运算符
jieguo = num1 * num2;
break;
case 4://除号运算符
jieguo = num1 / num2;
break;
case 5://平方运算符
jieguo =Math.Pow(num1,2);
break;
case 6://开方运算符
jieguo =Math.Sqrt(num1);
break;
case 7://取模运算符
jieguo = num1 % num2;
break;
case 0://清零运算符
jieguo = 0;
break;
}
textBox1.Text = Convert.ToString(jieguo);//将最终运算结果,强制转换成string类型后,赋值给TextBox1的文本属性
op = 0;//显示结果以后,将运算符变量op恢复到最初状态
}
private void button1_Click(object sender, EventArgs e)//数字1按钮的点击事件
{
textBox1.Text = textBox1.Text + "1";//将数字1显示在TextBox输入框里,因为输入框默认的Text类型是string类型
if (op == 0)//判断当前运算符号,如果是0,那么代表还没有点击运算符,即当前数字是num1
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2= Convert.ToDouble(textBox1.Text);
}
}
private void button2_Click(object sender, EventArgs e)//数字2按钮的点击事件
{
textBox1.Text = textBox1.Text + "2";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button3_Click(object sender, EventArgs e)//数字3按钮的点击事件
{
textBox1.Text = textBox1.Text + "3";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button4_Click(object sender, EventArgs e)//数字4按钮的点击事件
{
textBox1.Text = textBox1.Text + "4";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button5_Click(object sender, EventArgs e)//数字5按钮的点击事件
{
textBox1.Text = textBox1.Text + "5";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button6_Click(object sender, EventArgs e)//数字6按钮的点击事件
{
textBox1.Text = textBox1.Text + "6";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button7_Click(object sender, EventArgs e)//数字7按钮的点击事件
{
textBox1.Text = textBox1.Text + "7";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button8_Click(object sender, EventArgs e)//数字8按钮的点击事件
{
textBox1.Text = textBox1.Text + "8";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button9_Click(object sender, EventArgs e)//数字9按钮的点击事件
{
textBox1.Text = textBox1.Text + "9";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button10_Click(object sender, EventArgs e)//数字0按钮的点击事件
{
textBox1.Text = textBox1.Text + "0";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
private void button11_Click(object sender, EventArgs e)//数符号.按钮的点击事件
{
textBox1.Text = textBox1.Text + ".";
if (op == 0)
{
num1 = Convert.ToDouble(textBox1.Text);
}
else
{
num2 = Convert.ToDouble(textBox1.Text);
}
}
}
}
思考1:以上代码如何优化?
思考2:如何实现计算器的连续运算?(连续加减等)
思考3:如何实现计算器的退格功能?
===C#窗体技巧1:设置TextBox输入框只有底部有边框线
怎么设置TextBox输入框没有边框?如何设置TextBox输入框只有底部有边框线?可以重写TextBox的类,但是此方法比较麻烦,可以通过设置TextBox控件的属性,并结合Label控件做一个视觉上的效果。
实现方法:
第一步:设置TextBox控件的BorderStyle属性为None。此时TextBox控件没有边框线。
第二步:添加一个Label控件,设置其宽度和TextBox控件的宽度一致,设置其高度为1。设置BorderStyle属性为FixedSingle
第三步:取消输入框里的背景色。设置TextBox控件的BackColor属性值和窗体的BackColor属性值一致即可。
===C#窗体技巧2:设置Button按钮没有边框,鼠标滑过按钮时背景颜色发生变化
实现方法:
第一步:设置按钮Button控件的FlatStyle属性为Flat,并且设置FlatAppearance下的BorderSize为0。同时给按钮设置一个BackColor属性,即设置背景颜色。
第二步:分别给按钮添加MouseHover事件和MouseLeave事件。方法:在窗体设计界面,选中按钮后,在属性面板【事件】中,找到对应的事件名称,双击即可进入代码编写模式。
MouseHover事件添加代码: button1.BackColor = Color.FromArgb(255, 0, 0);
MouseLeave事件添加代码:button1.BackColor = Color.FromArgb(255, 192, 192);
完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MyCounter
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
//鼠标滑动到按钮上时,执行该事件
private void button1_MouseHover(object sender, EventArgs e)
{
//设置按钮的背景颜色
button1.BackColor = Color.FromArgb(255, 0, 0);
}
//鼠标离开按钮上时,执行该事件
private void button1_MouseLeave(object sender, EventArgs e)
{
//一般将鼠标离开后,按钮的背景颜色,设置为按钮原有背景颜色一致(即在窗体设计界面,设置按钮的BackColor属性)
button1.BackColor = Color.FromArgb(255, 192, 192);
}
}
}
结果演示:按钮没有边框,默认背景色粉丝,当鼠标滑过按钮时,背景变成红色,鼠标离开按钮后,背景又变回粉色。
===================这里是结束分割线======================