一:成果物

 

 

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

二: 窗体包含内容

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)){//执行计算将值赋给num1button10_Click(null, null);}}else{if (!string.IsNullOrEmpty(Number2)){//执行计算将值赋给num1button10_Click(null, null);}this.Operator = op;if (!string.IsNullOrEmpty(Number2)){//执行计算将值赋给num1button10_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文库

欢迎小伙伴一起讨论交流

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

  1. html怎么按钮设置字体大小,更改按一个按钮的HTML字体大小

    嗨,大家好我写了一个简单的应用程序,在web视图中显示一个html文件,该html文件在主包中. 我不知道我怎样才能使HTML文件字体大小大/小由两个按钮 这是我的.m更改按一个按钮的HTML字体大小 ...

  2. vue中echarts自适应屏幕大小

    vue中echarts自适应屏幕大小,延迟执行 项目中出现echarts适应屏幕大小,有时会遇到不管屏幕大小如何变化echarts图表大小不变的情况:或者出现图表变化延迟的情况,针对这两种情况,分别解 ...

  3. VMware安装的虚拟机窗口如何自适应屏幕大小

    为了方便在windows开发机器上搭建并运行liunx环境,我们常常会用到VMware,只要准备好要安装的linux镜像文件(.iso)就可以通过VMware Workstation新建一个虚拟机快速 ...

  4. html自动适应屏幕分辨率,css如何自适应屏幕大小?

    css如何自适应屏幕大小?下面本篇文章给大家介绍一下使用CSS实现屏幕大小自适应的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. css如何自适应屏幕大小? 要想实现css屏幕 ...

  5. java软件屏幕大小转换,android 用java写一个自动适配各种屏幕大小的工具

    android 用java写一个自动适配各种屏幕大小的工具,假设我当前机器屏幕宽高为1920*1116,我页面某个组件的宽度为100px,那么在1280*800的机器上,按道理将应该是100/1920 ...

  6. Android图片自适应屏幕大小

     1.drawable-(hdpi,mdpi,ldpi)的区别 dpi是"dot per inch"的缩写,每英寸像素数. 四种密度分类: ldpi (low), mdpi ( ...

  7. Android自适应屏幕大小和布局

    一:不同的layout  Android手机屏幕大小不一,有480x320, 640x360, 800x480,854x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下 ...

  8. android系统如何自适应屏幕大小

    2019独角兽企业重金招聘Python工程师标准>>> 1.屏幕相关概念 1.1分辨率 是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸 ...

  9. ios 自动缩小字体_iOS 字体自适应屏幕大小

    在项目的开发中,其他控件不管在IB里边还是纯代码形式中都能很简单的做到自适应屏幕的大小,但往往会忽略掉字体大小的适应,我们的UI是以6sPlus屏幕为基准设计的页面,我前期只是做了控件的自适应,以为字 ...

最新文章

  1. 新浪宣布2010年第四季度业绩 盘后跌4%
  2. 远程仓库与 fetch 命令——Git 学习笔记 20
  3. tensorflow-tf.train.shuffle_batch
  4. Linux多线程编程(一)---多线程基本编程
  5. Linux高性能server编程——高级I/O函数
  6. 树莓派蓝屏_树莓派刷写Windows 10 ARM版后成功运行桌面程序
  7. linux切换任务命令,Linux top详解之交互命令、命令行选项
  8. centos7mysql语句创建表格_CentOS7中安装MySQL(简便)及 网站的搭建
  9. ld 指令c语言实现,C语言符号、指令表.doc
  10. 谷歌(Google Chrome)插件安装
  11. 程序员如何淡定度过 2.14 情人节?
  12. bzoj 1610 连线游戏
  13. 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第三章 2020-12-25
  14. AxureRP9授权码
  15. 从零开发区块链应用(十一)--以太坊地址生成
  16. 使用谷歌API将任意语言翻译成英文
  17. endless walk
  18. dns被劫持了怎么处理 5种方法教你处理
  19. 当遇到error: stray ‘\241‘ in program错误的解决方法
  20. 物联网到底为什么这么火?

热门文章

  1. 3CDB:基于3C技术的染色质互作信息数据库
  2. 济南PMP俱乐部成立
  3. 【论文笔记】开放场景下的实时视觉重定位方法 HF-Net 2019
  4. nacos报错,.BeanCreationException: Error creating bean with name ‘nacosProperties‘ defined in class
  5. 【论坛转贴】IP spoof欺骗关于修改ip源向网页post的方法,伪造虚假IP来源!可用于群发发贴机拱贴机邮件EMail群发!!!!!!
  6. java面向对象 程序设计题_java面向对象程序设计练习题
  7. 隐隐约约看到了月全食
  8. Linux —— Ubuntu下C++获取CPU使用率、GPU使用率、GPU温度
  9. 如何用计算机拍照,怎样用电脑照相
  10. 20万以内,下一个爆款电动车会是谁?