使用C# winform 制作一个按钮可自适应屏幕大小的 简易加减乘除计算器

这篇博客详细介绍了如何使用C# Winform创建一个具备按钮自适应屏幕大小功能的简易计算器。内容涵盖窗体组件布局,如Panel和Label的设置,以及按钮的动态调整代码实现。此外,还展示了数字输入和计算功能的实现,包括按钮事件处理和计算逻辑。提供了完整的代码示例和理解指南。
摘要由CSDN通过智能技术生成

一:成果物

 

 

 

不多展示,,,我们开始吧。。

二: 窗体包含内容

2.1 显示屏部分组成

显示屏部分由两个组件组成,一个是方便操作的panel控件位于顶部,且为了使其显示屏在改变窗体大小时一直位于顶部,要将其属性 设置为  (Dock :TOP)       

 

另外一个标签为 Label 标签 将其放置于Panel控件,将其调整至合适大小(将属性 AutoSize : False),可以为Label和Panel 调整合适的BackColor 使其区分开来。可以为Label设置合适的初值(Text)。并且使用另一种方式将此控件固定住,以防止窗口大小变化,控件不跟着变化:锚点(Anchor),将四个方向全部选上。

 

 2.2按键的组成部分

下部整个使用一个Panel(后面会使用到),Dock :Fill ,将下部填充。

而后放置16个 Button 控件 ,调整合适大小(可以按住Ctrl拖动来复制控件),并将每个Button的Text设置好对应的值

 三: 主要代码

3.1 按钮自适应屏幕大小

 这部分的操作主要针对于多个控件的情况,需要通过编码的形式来控制控件的大小,为什么不能使用Dock属性或者 Anchor 是属性呢?因为  ,Anchor和Dock是针对于整个窗体的固定过程,当窗体放大时 会同时放大。所以需要用代码进行一个大小控制。

先看代码

        int normalWidth = 0;
        int normalHeight = 0;
        Dictionary<string, Rectangle> normalControl = new Dictionary<string, Rectangle>();


        private void MainForm_Load(object sender, EventArgs e)
        {
            //记录对象及原始尺寸
            normalWidth = this.btnsPanel.Width;
            normalHeight = this.btnsPanel.Height;

            foreach (Control item in this.btnsPanel.Controls)
            {
                normalControl.Add(item.Name, new Rectangle(item.Left, item.Top, item.Width, item.Height));
            }


        }
       

this.btnsPanel.Width 是在获取当前 Panel 的宽度 (既下部的Panel 我将其Name属性更改为了 :btnsPanel)

foreach中是在循环btnsPanel中的所有控件,窗体中的控件全部继承于 Controls。

并将每个控件的位置和长宽添加至字典normalControl中。

 private void MainForm_SizeChanged(object sender, EventArgs e)
        {
            //根据原始尺寸比例进行新尺寸的计算
            int w = this.btnsPanel.Width;
            int h = this.btnsPanel.Height;

            foreach (Control item in this.btnsPanel.Controls)
            {
                int newX = Convert.ToInt32((w * 1.0) / normalWidth * normalControl[item.Name].X);
                int newY = Convert.ToInt32((h * 1.0) / normalHeight * normalControl[item.Name].Y);
                int newW = Convert.ToInt32((w * 1.0) / normalWidth * normalControl[item.Name].Width);
                int newH = Convert.ToInt32((h * 1.0) / normalHeight * normalControl[item.Name].Height);
                item.Left = newX;
                item.Top = newY;
                item.Width = newW;
                item.Height = newH;

            }
        }

主要原理是: 记录原来按钮与窗体的比例大小,当改变窗体大小时,按比例,等比的放大或缩小按钮的大小,以达到按钮的自适应大小的要求。

(新的坐标公式其实就是一个等比公式的算法,应该都看得懂吧。。。。)

其中有个细节需要注意:关于为什么要 *1.0 而后又转换为int类型。

如果不加以变化,w与h为整形        整形 / 浮点型 或 整形 / 整形 其损失精度会非常之大 如:5/3 =1.666  =》 1   损失非常之大。

所以要先乘1.0 使其转换为 浮点型进行计算,最后使用 Convert.ToInt32()

因为 这个方法是四舍五入,如果使用(int)强转的话是舍弃末尾数值。

另外:

这两个函数,写在 主函数后,页面初始化函数后调用。

3.2 数字部分

        private string _number1;

        public string Number1
        {
            get { return _number1; }
            set
            {
                _number1 = value;

                this.label1.Text = value;
            }
        }

        private string _number2;
        public string Number2
        {
            get { return _number2; }
            set
            {
                _number2 = value;

                this.label1.Text = Number1 + Operator + value;
            }
        }

        private string _operator;
        public string Operator
        {
            get { return _operator; }
            set
            {
                _operator = value;

                this.label1.Text = Number1 + Operator;
            }
        }

private void button1_Click(object sender, EventArgs e)
        {
            //获取触发这个时间的对象
            //拿到对象的text属性
            Button button = sender as Button;
            string number = button.Text;

            if (string.IsNullOrEmpty(Operator))
            {
                if (button.Text == ".")
                {
                    if(string.IsNullOrEmpty(Number1))
                    {
                        this.Number1 = "0";
                    }
                    if (this.Number1.IndexOf(".") <= 0)
                    {
                        this.Number1 += button.Text;
                    }
                }
                else
                {
                    this.Number1 += button.Text;
                }

            }
            else
            {
                if (button.Text == ".")
                {
                    if(string.IsNullOrEmpty(Number2))
                    {
                        this.Number2 = "0";
                    }
                    if (this.Number2.IndexOf(".") <= 0)
                    {
                        this.Number2 += button.Text;
                    }
                }
                else
                {
                    this.Number2 += button.Text;
                }
            }

        }

 这里写的是一个事件,一个按钮点击事件。需要将 数字按钮和“.”的事件设置为button1_Click

 button1_Click 中会先判断是否按过了 符号键,而后判断 符号键是否为小数点,小伙伴自己代入跟着逻辑想一下,应该可以想得明白。

if(string.IsNullOrEmpty(Number1))
{
  this.Number1 = "0";
}

的意义是 如果直接按 “.”  会自动补 0  既  0.X

 3.3 计算部分

private void button15_Click(object sender, EventArgs e)
        {
            Button button = sender as Button;
            string op = button.Text;
            if(string.IsNullOrEmpty(Operator))
            {
                this.Operator = op;

                if (!string.IsNullOrEmpty(Number2))
                {
                    //执行计算将值赋给num1
                    button10_Click(null, null);
                }
            }
            else
            {
                if (!string.IsNullOrEmpty(Number2))
                {
                    //执行计算将值赋给num1
                    button10_Click(null, null);
                }
                this.Operator = op;

                if (!string.IsNullOrEmpty(Number2))
                {
                    //执行计算将值赋给num1
                    button10_Click(null, null);
                }
            }
            
        }

        private void button10_Click(object sender, EventArgs e)
        {
            double n1 = double.Parse(this.Number1);
            double n2 = double.Parse(this.Number2);

            switch (Operator)
            {
                case "+":
                    this.Number1 = (n1 + n2).ToString();
                    break;
                case "-":
                    this.Number1 = (n1 - n2).ToString();
                    break;
                case "*":
                    this.Number1 = (n1 * n2).ToString();
                    break;
                case "/":
                    this.Number1 = (n1 / n2).ToString();
                    break;
            }

            this.Operator = "";
            this.Number2 = "";
        }
    }

按钮 {“+”,“-”,“*”,“/”} 事件设置为 button15_Click

按钮{“=”} 事件设置为 button10_Click

好了以上就是C# Winform 简易计算器的全部内容了

资源下载链接 :(94条消息) 使用C#winform制作一个按钮可自适应屏幕大小的简易加减乘除计算器-.Net文档类资源-CSDN文库

欢迎小伙伴一起讨论交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值