C#winform第一个小程序——简易计算器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SmallMr/article/details/70880490

  分享我的第一个完整的C#winform小程序,只为记录!
  
  写这个小程序的时候,我连语法还都不怎么会,只能边写边学,拖控件、设置属性也还是临时学会的。所以会有比较大的缺陷,而且使用的语法都是比较简单的,没有涉及稍微复杂一点点的代码。因为初学,所以很多地方不完善,已经做到当时尽可能的最好了。
  
  写这个程序的时候一开始真的是一点头绪都没有的,当时一片空白,无从下手,但是最终做出来之后那种自豪感是不言而喻的。
  
  首先上界面图:
  这里写图片描述
  
  先把各控件全部拖放好,排列整齐,为了美观,背景什么的稍微做了点改动,不至于太过单调。
  因为按钮比较多,所以按钮起名要稍微注意些,便于识别。

思路:
1. 首先需要把按钮按下的各个按键文本显示到文本框中
2. 在输入第一个按键的时候需要考虑的是必须是数字才行,否则无效(按下小数点,则默认为0.)
3. 当按下运算符之后保存运算符之前的第一个操作数
4. 当按下等号之后保存等号之前的第二个操作数
5. 第三和四步都可以使用 SubString() 方法来截取字符串然后转换成数字
6. 处理完使用鼠标点击只好,键盘的按下只需要托管给点击事件就行了,这样也不必去考虑按下的按键到底是不是数字,规避了其它符号的输入
7. 注册各个按钮的点击事件

注意点:
1. 每个操作数的小数点最多只能有一次,按第二次则无效
2. 除数不能为零
3. 按下等号之后如果继续按操作符,则按照正常逻辑应该是可以连续运算
4. 按了清除键之后,所有全部归为初始化


以下是需要用到的字段

        double num1;        //记录第一个操作数
        double num2;        //记录第二个操作数
        string str1;        //点击运算符之前的文本框内容
        string str2;        //点击运算符之后的文本框内容
        string str3;        //记录运算符之后的字符串
        bool isSymbool = false;    //是否点击过运算符
        string symbool = null;     //记录符号
        bool isPoint = false;      //记录是否点过小数点
        bool isEqu = false;        //记录是否点过等于号,以便按过等于之后按退格键直接全部清除

最简单的一个点击事件个人认为是属于CE按钮的清除事件了,只需要把所有的字段初始化成默认值就行,如下:

        //清除键-CE
        private void button_CE_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            isSymbool = false;
            num1 = 0;
            num2 = 0;
            str1 = null;
            str2 = null;
            isPoint = false;
            isEqu = false;
        }

看以下代码,数字键0-9的点击事件全部都是一样的写法,唯一区别只是按钮名称修改一下。在做这些之前,需要把每一个按钮的Text属性设置为“0~9、+、-、*、/”

我这里的button_0代表的就是按键0,button_1就是代表的按键1
button_15则代表了等号

        private void button_0_Click(object sender, EventArgs e)
        {
            //每个数字按键的if else语句是为了判断是否已经点过等号,以便再次点击数字按键时候直接清空。例如如果已经按过等号,那么就是说文本框中已经有一个结果,那么我继续按一个数字的时候希望文本框中显示的是我现在点的数字
            if (isEqu == false)
            {
                textBox1.Text += button_0.Text;
                button15.Focus();//这个步骤主要是为了让焦点回归到等于号按钮上,在窗体加载的时候写上不知道怎么就是不想,TabIndx设置了也不行,很郁闷,没办法之下,只好每个按键都来这么一句了
            }
            else
            {
                //调用button_CE.Click事件
                button_CE.PerformClick();
                textBox1.Text += button_0.Text;
            }
        }

以下是退格键的代码片

        //退格键-←
        private void button_back_Click(object sender, EventArgs e)
        {
            //判断文本框中的字符是否含有内容
            if (textBox1.Text.Length > 0)
            {
                //先判断是否点过等号,没点进入if,点了进入else
                if (isEqu == false)
                {
                    //清除文本框中最后一个字符
                    textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1, 1);

                    //如果清除过后文本框中还能转换成数字,说明符号已经删除
                    if (double.TryParse(textBox1.Text, out num1))
                    {
                        num1 = double.Parse(textBox1.Text);
                        isSymbool = false;
                        symbool = null;
                    }

                    //如果symbool为null,则Contains方法会报错,所以必须是symbool不为空才进入循环
                    //symbool!=null,必须写在前面,&&会先判断第一个条件,如果是false,则后面的不再去判断,直接跳出
                    if (symbool != null && textBox1.Text.Contains(symbool))
                     {
                         //获取符号所在字符串的索引值
                         int a = textBox1.Text.IndexOf(symbool);
                         //截取符号之前的值给num1
                         double.TryParse(textBox1.Text.Substring(0, a), out num1);
                      }                
                }
                else
                {
                     button_CE.PerformClick();                   
                }               
            }
        }

以下是小数点代码片

        private void button_point_Click(object sender, EventArgs e)
        {
            if (isEqu == false)
            {
                //去除小数点首位的情况
                if (textBox1.Text.Length > 0)
                {
                    //判断按之前是否文本框中已经包含小数点,是则返回,操作无效
                    if (isPoint == false)
                    {
                        textBox1.Text += button_point.Text;
                    }
                    else
                    {
                        return;
                    }
                    isPoint = true;//按过之后记录已经点击过小数点
                }
            }
        }

以下是等于号代码片

 private void button15_Click(object sender, EventArgs e)
        {
            if (str1 != null)
            {
                if (isEqu == false && symbool != null)
                {
                    str2 = textBox1.Text;
                    //将字符串str2符号以及符号之前的字符截掉
                    str3 = str2.Substring(str1.Length + 1);

                    double.TryParse(str3, out num2);

                    switch (symbool)
                    {
                        case "+":
                            textBox1.Text = Convert.ToString(num1 + num2);
                            break;

                        case "-":
                            textBox1.Text = Convert.ToString(num1 - num2);
                            break;

                        case "*":
                            textBox1.Text = Convert.ToString(num1 * num2);
                            break;

                        case "/":
                            if (num2 == 0)
                                textBox1.Text = "除数不能为0";
                            else
                                textBox1.Text = Convert.ToString(num1 / num2);
                            break;

                        default:
                            break;
                    }
                }
            }

            isEqu = true;
            isSymbool = false;
        }

最后这个就是把键盘按下事件委托给鼠标的点击代码片
需要注册一个键盘按键事件

        //把键盘的数字按键直接委托给按钮,就不需要额外再编写关于键盘操作的程序
        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            button15.Focus();
            switch (e.KeyChar)
            {
                case '0':
                    button_0.PerformClick();
                    e.Handled = true;   //这个代码目的:当键盘操作按下0,这个时候文本框直接输入0,但是又委托了按钮同样输入一个0
                    break;              //导致了,按下一次按键出现两个值,这种情况下需要把键盘的事件不响应                   

                case '1':
                    button_1.PerformClick();
                    e.Handled = true;
                    break;

                case '2':
                    button_2.PerformClick();
                    e.Handled = true;
                    break;

                case '3':
                    button_3.PerformClick();
                    e.Handled = true;
                    break;

                case '4':
                    button_4.PerformClick();
                    e.Handled = true;
                    break;

                case '5':
                    button_5.PerformClick();
                    e.Handled = true;
                    break;

                case '6':
                    button_6.PerformClick();
                    e.Handled = true;
                    break;

                case '7':
                    button_7.PerformClick();
                    e.Handled = true;
                    break;

                case '8':
                    button_8.PerformClick();
                    e.Handled = true;
                    break;

                case '9':
                    button_9.PerformClick();
                    e.Handled = true;
                    break;

                case '/':
                    button_div.PerformClick();
                    e.Handled = true;
                    break;

                case '+':
                    button_add.PerformClick();
                    e.Handled = true;
                    break;

                case '-':
                    button_sub.PerformClick();
                    e.Handled = true;
                    break;

                case '*':
                    button_mul.PerformClick();
                    e.Handled = true;
                    break;

                case '.':
                    button_point.PerformClick();
                    e.Handled = true;
                    break;

                case (Char)13:         //(Char)13代表的是Enter按键

                    button15.PerformClick();
                    e.Handled = true;
                    break;

                case (Char)27:         //(Char)20代表的是Esc按键
                    button_CE.PerformClick();
                    e.Handled = true;
                    break;

                case (Char)8:         //(Char)代表的是BackSpace退格键
                    button_back.PerformClick();
                    e.Handled = true;
                    break;

                default:     //当按下的按钮不是以上按键时候,直接不响应,不需要再去判断了
                    e.Handled = true;
                    break;
            }
        }

  以上代码组合到Form1中就是完成了计算器的只做了,当然数字按键需要补全下。

  菜单栏其实没什么作用,因为当时是根据PC自带的计算器做的,为了样式一样,就拖了一个菜单栏控件,并没有实际效果,要实现的话,可能就得以后学的更多了。

  当时,我连try…catch…都还不会,程序经常会报错,没办法之下基本是使用了if…else逻辑判断来规避这个问题的,做到了尽量乱按也不会报错,所以有些地方逻辑判断可能会有点多,有点乱,不如直接使用try…catch…来得更为方便。

展开阅读全文

没有更多推荐了,返回首页