相关文章推荐
含蓄的枇杷  ·  C# WinForm ...·  4 周前    · 
体贴的可乐  ·  read_kafka 表值函数 - ...·  1 年前    · 
低调的饭盒  ·  Mysql Duplicate entry ...·  2 年前    · 
潇洒的钥匙  ·  python - 从控制台 ...·  2 年前    · 

c#中使控件的大小可以根据窗口自动调整位置与大有两种方式

1.设置Anchor或Dock属性

Anchor用于设置控件到边缘的距离保持不变,主要用来保证各控件的相对布局整齐,这里以button为例,正确的设置方法如下
button Anchor设置
图片拉伸后控件大小与布局不变
拉伸后的效果

Dock用于设置控件附着于form边缘,正确设置如下(这里需要注意,设置控件的Dock的顺序对结果又很大影响,本例子中先设置上下,然后左右,最后中间,具体设置顺序要看需求)
buttor Dock设置

图片拉伸后空间的布局不变,大小随着窗体大小而改变
拉伸后的效果![](https://img-blog.csdn.net/20170510221523835?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXlfY2xlYXJfbWluZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

2.控件根据窗体大小百分比调整(网上看到的)

这种方式相当于把整个窗体当做一个图片进行缩放,较为美观。

双击窗体进入编辑form1的load函数

private void Form1_Load(object sender, EventArgs e)
{
this.Resize += new EventHandler(Form1_Resize);//窗体调整大小时引发事件
X = this.Width;//获取窗体的宽度
Y = this.Height;//获取窗体的高度
setTag(this);//调用方法
}

自己写方法:

    float X, Y;
    private void setTag(Control cons)
        //遍历窗体中的控件
        foreach (Control con in cons.Controls)
            con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
            if (con.Controls.Count > 0)
                setTag(con);
    private void setControls(float newx, float newy, Control cons)
        //遍历窗体中的控件,重新设置控件的值
        foreach (Control con in cons.Controls)
            string[] mytag = con.Tag.ToString().Split(new char[] { ':' });//获取控件的Tag属性值,并分割后存储字符串数组
            float a = Convert.ToSingle(mytag[0]) * newx;//根据窗体缩放比例确定控件的值,宽度
            con.Width = (int)a;//宽度
            a = Convert.ToSingle(mytag[1]) * newy;//高度
            con.Height = (int)(a);
            a = Convert.ToSingle(mytag[2]) * newx;//左边距离
            con.Left = (int)(a);
            a = Convert.ToSingle(mytag[3]) * newy;//上边缘距离
            con.Top = (int)(a);
            Single currentSize = Convert.ToSingle(mytag[4]) * newy;//字体大小
            con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
            if (con.Controls.Count > 0)
                setControls(newx, newy, con);

form的load添加

this.Resize += new EventHandler(Form1_Resize);//窗体调整大小时引发事件
X = this.Width;//获取窗体的宽度
Y = this.Height;//获取窗体的高度
setTag(this);//调用方法

在form1的方法中双击Resize写入

private void Form1_Resize(object sender, EventArgs e)
{
float newx = (this.Width) / X; //窗体宽度缩放比例
float newy = this.Height / Y;//窗体高度缩放比例
setControls(newx, newy, this);//随窗体改变控件大小
this.Text = this.Width.ToString() + ” ” + this.Height.ToString();//窗体标题栏文本
}
拉伸前

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 控件百分比调整大小
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
float X, Y;
private void setTag(Control cons)
{
//遍历窗体中的控件
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + “:” + con.Height + “:” + con.Left + “:” + con.Top + “:” + con.Font.Size;
if (con.Controls.Count > 0)
setTag(con);
}
}
private void setControls(float newx, float newy, Control cons)
{
//遍历窗体中的控件,重新设置控件的值
foreach (Control con in cons.Controls)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ‘:’ });//获取控件的Tag属性值,并分割后存储字符串数组
float a = Convert.ToSingle(mytag[0]) * newx;//根据窗体缩放比例确定控件的值,宽度
con.Width = (int)a;//宽度
a = Convert.ToSingle(mytag[1]) * newy;//高度
con.Height = (int)(a);
a = Convert.ToSingle(mytag[2]) * newx;//左边距离
con.Left = (int)(a);
a = Convert.ToSingle(mytag[3]) * newy;//上边缘距离
con.Top = (int)(a);
Single currentSize = Convert.ToSingle(mytag[4]) * newy;//字体大小
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setControls(newx, newy, con);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
this.Resize += new EventHandler(Form1_Resize);//窗体调整大小时引发事件
X = this.Width;//获取窗体的宽度
Y = this.Height;//获取窗体的高度
setTag(this);//调用方法
}

private void Form1_Resize(object sender, EventArgs e)
{
float newx = (this.Width) / X; //窗体宽度缩放比例
float newy = this.Height / Y;//窗体高度缩放比例
setControls(newx, newy, this);//随窗体改变控件大小

参考:https://blog.csdn.net/hy6688_/article/details/19431097 using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.L C# WinForm控件随窗体大小改变自动适应改变 在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性。Anchor属性定义控件的定位点位置。当控件锚定到某个窗体时,如果该窗体的大小调整,那么该控件维持它与定位点位置之间的距离不变。例如,如果“:Button”控件锚定到窗体的左、右和底边缘,那么当调整该窗体的大小时,Button控件水平调整大小,维持到该窗体左边和右边的距离不变,另外控件垂直定位其自身,以便其. 下载后解压缩即可运行使用,代码中有详细的备注。 使用方法见博客:https://blog.csdn.net/chbxgbin/article/details/109690260 1.把自适应的类整体复制到你的工程命名空间里,这样做,每个窗体均可使用。 2.声明自适应类实例。 3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的自适应方法,完成自适应。 4.Panel,DataGridView等控件同样适用。 当winform的窗体放大缩小时,希望窗体内的控件可以随着窗体的放大缩小,等比例的也随之改变,一般的想法是根据窗体的改变比例,将控件也等比例放大缩小,这个方法理论上应该可行,但是按比例计算会有精度损失差值,这个随着放大缩小的次数,控件也会发生偏移性改变。我个人认为比较可行的是按整形计算的方式,这样便不会有精度损失差值的问题。 当窗体放大或缩小后,求得窗体放大或缩小的差值N,将N与需要发生放大缩小的控件进行模运算,抛掉余数,然后给各个控件分配可平均的放大缩小数额。 放大前:. 复杂界面,要做到好的设计,是需要逐步将复杂界面进行两两拆分,第一步把整个窗体拆分为基本控件一+其他控件的容器一进行设计,第二步把其他控件的容器拆分为基本控件二+其他控件的容器二进行设计... ...所以布局设计的基础操作,是对容器/窗体中的两个控件进行布局,再复杂的窗体也只是不断拆分成基础操作去重复;同时要实现控件自动大小调整,其核心使用控件Dock属性,使其跟随父容器的大小变化而变化。(All/Left/Right/Top/Buttom),影响控件一被“码”的位置,调整以至于给控件二预留合适大小; 1.在需要自适应的Form中实例化全局变量   AutoSizeFormClass.cs源码在下方      AutoSizeFormClass asc = new AutoSizeFormClass(); 2.Form_Load事件中