使用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)){//执行计算将值赋给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 制作一个按钮可自适应屏幕大小的 简易加减乘除计算器相关推荐
- html怎么按钮设置字体大小,更改按一个按钮的HTML字体大小
嗨,大家好我写了一个简单的应用程序,在web视图中显示一个html文件,该html文件在主包中. 我不知道我怎样才能使HTML文件字体大小大/小由两个按钮 这是我的.m更改按一个按钮的HTML字体大小 ...
- vue中echarts自适应屏幕大小
vue中echarts自适应屏幕大小,延迟执行 项目中出现echarts适应屏幕大小,有时会遇到不管屏幕大小如何变化echarts图表大小不变的情况:或者出现图表变化延迟的情况,针对这两种情况,分别解 ...
- VMware安装的虚拟机窗口如何自适应屏幕大小
为了方便在windows开发机器上搭建并运行liunx环境,我们常常会用到VMware,只要准备好要安装的linux镜像文件(.iso)就可以通过VMware Workstation新建一个虚拟机快速 ...
- html自动适应屏幕分辨率,css如何自适应屏幕大小?
css如何自适应屏幕大小?下面本篇文章给大家介绍一下使用CSS实现屏幕大小自适应的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. css如何自适应屏幕大小? 要想实现css屏幕 ...
- java软件屏幕大小转换,android 用java写一个自动适配各种屏幕大小的工具
android 用java写一个自动适配各种屏幕大小的工具,假设我当前机器屏幕宽高为1920*1116,我页面某个组件的宽度为100px,那么在1280*800的机器上,按道理将应该是100/1920 ...
- Android图片自适应屏幕大小
1.drawable-(hdpi,mdpi,ldpi)的区别 dpi是"dot per inch"的缩写,每英寸像素数. 四种密度分类: ldpi (low), mdpi ( ...
- Android自适应屏幕大小和布局
一:不同的layout Android手机屏幕大小不一,有480x320, 640x360, 800x480,854x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下 ...
- android系统如何自适应屏幕大小
2019独角兽企业重金招聘Python工程师标准>>> 1.屏幕相关概念 1.1分辨率 是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸 ...
- ios 自动缩小字体_iOS 字体自适应屏幕大小
在项目的开发中,其他控件不管在IB里边还是纯代码形式中都能很简单的做到自适应屏幕的大小,但往往会忽略掉字体大小的适应,我们的UI是以6sPlus屏幕为基准设计的页面,我前期只是做了控件的自适应,以为字 ...
最新文章
- 新浪宣布2010年第四季度业绩 盘后跌4%
- 远程仓库与 fetch 命令——Git 学习笔记 20
- tensorflow-tf.train.shuffle_batch
- Linux多线程编程(一)---多线程基本编程
- Linux高性能server编程——高级I/O函数
- 树莓派蓝屏_树莓派刷写Windows 10 ARM版后成功运行桌面程序
- linux切换任务命令,Linux top详解之交互命令、命令行选项
- centos7mysql语句创建表格_CentOS7中安装MySQL(简便)及 网站的搭建
- ld 指令c语言实现,C语言符号、指令表.doc
- 谷歌(Google Chrome)插件安装
- 程序员如何淡定度过 2.14 情人节?
- bzoj 1610 连线游戏
- 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第三章 2020-12-25
- AxureRP9授权码
- 从零开发区块链应用(十一)--以太坊地址生成
- 使用谷歌API将任意语言翻译成英文
- endless walk
- dns被劫持了怎么处理 5种方法教你处理
- 当遇到error: stray ‘\241‘ in program错误的解决方法
- 物联网到底为什么这么火?
热门文章
- 3CDB:基于3C技术的染色质互作信息数据库
- 济南PMP俱乐部成立
- 【论文笔记】开放场景下的实时视觉重定位方法 HF-Net 2019
- nacos报错,.BeanCreationException: Error creating bean with name ‘nacosProperties‘ defined in class
- 【论坛转贴】IP spoof欺骗关于修改ip源向网页post的方法,伪造虚假IP来源!可用于群发发贴机拱贴机邮件EMail群发!!!!!!
- java面向对象 程序设计题_java面向对象程序设计练习题
- 隐隐约约看到了月全食
- Linux —— Ubuntu下C++获取CPU使用率、GPU使用率、GPU温度
- 如何用计算机拍照,怎样用电脑照相
- 20万以内,下一个爆款电动车会是谁?