一:成果物
不多展示,,,我们开始吧。。
二: 窗体包含内容
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文库
欢迎小伙伴一起讨论交流