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

一:成果物

 

 

 

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

二: 窗体包含内容

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文库

欢迎小伙伴一起讨论交流

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过设置控件的 Anchor 和 Dock 属性来实现 C# WinForm 自适应屏幕大小的效果。 Anchor 属性的作用是控制控件在窗口大小改变时的位置和大小,可以通过设置 Anchor 属性为左上角、右下角等组合来实现控件的自适应。例如,设置一个按钮的 Anchor 属性为左上角(Top, Left),那么当窗口大小改变时,按钮会始终保持在窗口的左上角。 Dock 属性的作用是让控件填充满父容器(如窗口),可以通过设置 Dock 属性为 Fill 来实现控件的自适应。例如,设置一个面板的 Dock 属性为 Fill,那么当窗口大小改变时,面板会始终填充满整个窗口。 下面是一个简单的示例代码,演示了如何使用 Anchor 和 Dock 属性实现 C# WinForm 自适应屏幕大小的效果: ``` private void Form1_Load(object sender, EventArgs e) { // 设置窗口大小屏幕大小的一半 this.Width = Screen.PrimaryScreen.WorkingArea.Width / 2; this.Height = Screen.PrimaryScreen.WorkingArea.Height / 2; // 设置一个按钮的 Anchor 属性为左上角 button1.Anchor = AnchorStyles.Top | AnchorStyles.Left; // 设置一个面板的 Dock 属性为 Fill panel1.Dock = DockStyle.Fill; } ``` 在上面的代码中,我们首先设置窗口的大小屏幕大小的一半,然后设置了一个按钮的 Anchor 属性为左上角,以及一个面板的 Dock 属性为 Fill。当窗口大小改变时,按钮会始终保持在窗口的左上角,面板会始终填充满整个窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值