前言

在使用 Winform 开发过程中,经常发些因为显示器分辨率、窗体大小改变,控件却不能自适应变化,几经查找资料,和大佬的代码。经过细小修改,终于可以让窗体在外界影响下,窗体内背景图片、控件都会自适应变化大小(类似于网页的响应式)。

代码

完整代码如下:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace AutoSizeForm
{
    public partial class FrmMain : Form
    {
        private float X;
        private float Y;
        public FrmMain()
        {
            InitializeComponent();
        }
        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[] { ':' });
                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]) * Math.Min(newx, newy);
                con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
                if (con.Controls.Count > 0)
                {
                    SetControls(newx, newy, con);
                }
            }
        }
        //窗体Resize事件
        private void FrmMain_Resize(object sender, EventArgs e)
        {
            float newx = Width / X;
            float newy = Height / Y;
            SetControls(newx, newy, this);
            Text = Width.ToString() + " " + Height.ToString();
        }
        //窗体Load事件
        private void FrmMain_Load(object sender, EventArgs e)
        {          
            Resize += new EventHandler(FrmMain_Resize);
            X = Width;
            Y = Height;
            SetTag(this);
            FrmMain_Resize(new object(), new EventArgs());//x,y可在实例化时赋值,最后这句是新加的,在MDI时有用
        }
    }
} 

注意:在使用过程当中发现画面卡顿,可以打开窗体属性双缓存(DoubleBuffered属性改为True)。

标签:

Winform 窗体自适应的更多相关文章

  1. C# FTP上传下载 代码

    using System; using System.Collections.Generic; using Sy......

  2. 详解如何在C#中使用投影(Projection)

    投影(Projection) 是一种可以将查询结果进行 塑性 的一种操作,你可以使用 投影 将一个 object 转......

  3. C#编写一个在asp.net core 3.1下的简单的corn模式的计划任务和一个更简单的定时器类

    asp.net core 下,新增了一个BackgroundService用来实现能在后台跑一个长久运行的任务,因此......

  4. C#中File和FileStream的简单介绍和用法

    前言在近期的工作过程中发现自己的基础比较薄弱,所以最近在恶补基础知识。下面就对我所学习的File类和FileStre......

  5. c#发送请求访问外部接口的实例

    我就废话不多说了,大家还是直接看代码吧~string url = "https://cloud.soei.......

  6. C# 两个类的实例之间相同属性的值的复制

    在进行实体转换操作的时候通常需要在对两个实体之间两个属性字段相同的类要进行一个互相的转换,我们要把a对象的所有字段的......

  7. C#中DataGridView导出Excel的两种方法

    第一种是用数据流导出:#regionSaveFileDialog saveFileDialog = new Save......

  8. 基于C#的百度图片批量下载工具

    using System; using System.Collections.Generic; using Sy......

  9. C# 两个类的实例之间相同属性的值的复制

    在进行实体转换操作的时候通常需要在对两个实体之间两个属性字段相同的类要进行一个互相的转换,我们要把a对象的所有字段的......

  10. C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例)

    本文主要介绍了C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例),分享给大家,具体如......

随机推荐

  1. Node使用koa2实现一个简单JWT鉴权的方法

    JWT 简介什么是 JWT全称 JSON Web Token , 是目前最流行的跨域认证解决方案。基本的实现是服务端......

  2. .NET的并发编程(TPL编程)是什么?

    写在前面优秀软件的一个关键特征就是具有并发性。过去的几十年,我们可以进行并发编程,但是难度很大。以前,并发性软件的编......

  3. css3动画整理

    趁逢年味,整理一些小东西,希望大家能够喜欢;列举以下7个小demo来抛砖引玉1、多彩圆环利用 CSS3 的 back......

  4. java实现给图片加铺满的网格式文字水印

    效果:原图加水印后的图片废话不多说,直接上代码代码:package com.example.demo;import ......

  5. JS removeAttribute()方法实现删除元素的某个属性

    在 JavaScript 中,使用元素的 removeAttribute() 方法可以删除指定的属性。用法如下:re......

  6. HTML5与CSS3知识点总结

    HTML常用标签总结 手摸手带你学CSS 好好学习,天天向上本文已收录至我的Github仓库DayDayUP:git......

  7. C#编写一个在asp.net core 3.1下的简单的corn模式的计划任务和一个更简单的定时器类

    asp.net core 下,新增了一个BackgroundService用来实现能在后台跑一个长久运行的任务,因此......

  8. 从JAVA内存到垃圾回收,带你深入理解JVM

    摘要:学过Java的程序员对JVM应该并不陌生,如果你没有听过,没关系今天我带你走进JVM的世界。程序员为什么要学习......

  9. C# Aspose.Words 删除word中的图片操作

    今天介绍下 Aspose.Words 对 word 中的图片进行删除string tempFile = Applic......

  10. 从零搭建一个IdentityServer——集成Asp.net core Identity

    前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了......