当前位置: 首页 > news >正文

记录|C# winform布局学习

目录

  • 前言
  • 一、自适应布局
    • Step1. 添加AutoAdaptWindowsSize类
    • Step2. Form中引用
    • Step3. 创建SizeChanged事件函数
    • Step4. 在Fram.Disiger中添加
  • 更新时间

前言

参考视频:
C#5分钟winform快速自适应布局
参考文章:
其他参考:

写这篇文章,主要是我发现自己的界面太丑了,我受不了。而且项目运行后,winform窗口是窗口,放大后又是另一种样子,丑到家了。
在这里插入图片描述


一、自适应布局

以下内容的原版在这:C#快速自适应布局
下面的代码是根据我实际写的界面进行更改了的。

Step1. 添加AutoAdaptWindowsSize类

  • 做法:将Form装入Panel容器中。在项目中添加AutoAdaptWindowsSize.cs类。代码见下图【直接复制类中内容即可,添加的类名重命名为AutoAdaptWindowsSize.cs】
  • 优点:不用在Form中添加任何布局,直接将类复制到项目中,在Form代码中调用即可,页面大小会自动计算,修改方便,速度块。
  • 缺点:Form中的背景图片会直接显示成纯图的背景。【AutoAdaptWindowsSize类中会创建一个Panel,Panel背景会自动设置,而Pannel的纯色背景会覆盖掉Form的背景。】

背景问题解决方案:给Pannel的背景色改为透明(Transparent)。如 Panel.BackColor = Color.TransParents

    internal class AutoAdaptWindowsSize{double formOriginalWidth;//窗体高度原始宽度double formOriginalHeight;//窗体原始double scaleX;//水平缩放比例double scaleY;//垂直缩放比例Dictionary<string, string> ControlsInfo = new Dictionary<string, string>();//控件中心Left,Top,控件Width,控件Height,控件字体Sizeprivate Form _form;Panel Win_Panel1 = new Panel();public AutoAdaptWindowsSize(Form form){_form = form;//代码生成一个容器panel1,添加至窗体_form.Controls.Add(Win_Panel1);Win_Panel1.BorderStyle = BorderStyle.None;    //容器border样式Win_Panel1.Dock = DockStyle.Fill;             //设置填充,下面添加控件至容器完成后,容器会填充窗口Win_Panel1.BackColor = Color.Transparent;    // 这里默认的背景颜色是form的背景颜色,如果form页面时图片,需要将这里的颜色设置成透明,否则会被覆盖。//将窗体所有控件添加至panel1while (_form.Controls[0].Name.Trim() != ""){foreach (Control item in _form.Controls){if (item.Name.Trim() != "" && item.Name.Trim() != Win_Panel1.Name.Trim()){Win_Panel1.Controls.Add(item);}}}//保存窗体和控件初始大小InitControlsInfo(Win_Panel1);}public void InitControlsInfo(Control ctrlContainer){if (ctrlContainer.Parent == _form)//获取窗体的高度和宽度{formOriginalWidth = Convert.ToDouble(ctrlContainer.Width);formOriginalHeight = Convert.ToDouble(ctrlContainer.Height);}foreach (Control item in ctrlContainer.Controls){if (item.Name.Trim() != ""){//添加信息:键值:控件名,内容:据左边距离,距顶部距离,控件宽度,控件高度,控件字体。ControlsInfo.Add(item.Name, (item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2) + "," + item.Width + "," + item.Height + "," + item.Font.Size);}if ((item as UserControl) == null && item.Controls.Count > 0){InitControlsInfo(item);}}}public void FormSizeChanged(){try{if (ControlsInfo.Count > 0)//如果字典中有数据,即窗体改变{ControlsZoomScale(Win_Panel1);//表示pannel控件ControlsChange(Win_Panel1);}}catch { }}private void ControlsZoomScale(Control ctrlContainer){scaleX = (Convert.ToDouble(ctrlContainer.Width) / formOriginalWidth);scaleY = (Convert.ToDouble(ctrlContainer.Height) / formOriginalHeight);}/// <summary>/// 改变控件大小/// </summary>/// <param name="ctrlContainer"></param>private void ControlsChange(Control ctrlContainer){double[] pos = new double[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Sizeforeach (Control item in ctrlContainer.Controls)//遍历控件{if (item.Name.Trim() != "")//如果控件名不是空,则执行{if ((item as UserControl) == null && item.Controls.Count > 0)//如果不是自定义控件{ControlsChange(item);//循环执行}string[] strs = ControlsInfo[item.Name].Split(',');//从字典中查出的数据,以‘,’分割成字符串组for (int i = 0; i < 5; i++){pos[i] = Convert.ToDouble(strs[i]);//添加到临时数组}double itemWidth = pos[2] * scaleX;     //计算控件宽度,double类型double itemHeight = pos[3] * scaleY;    //计算控件高度item.Left = Convert.ToInt32(pos[0] * scaleX - itemWidth / 2);//计算控件距离左边距离item.Top = Convert.ToInt32(pos[1] * scaleY - itemHeight / 2);//计算控件距离顶部距离item.Width = Convert.ToInt32(itemWidth);//控件宽度,int类型item.Height = Convert.ToInt32(itemHeight);//控件高度if (float.Parse((pos[4] * Math.Min(scaleX, scaleY)).ToString()) != 0)         //缩放字体大小不能为0{ item.Font = new Font(item.Font.Name, float.Parse((pos[4] * Math.Min(scaleX, scaleY)).ToString())); }  //字体}}}}

Step2. Form中引用

引用:【这个是因为我将AutoAdaptWindowsSize.cs放在Manager文件夹下了】

using thinger.ProjectDemo.Manager;

在这里插入图片描述

创建全局变量

		AutoAdaptWindowsSize AutoSize; 

在Form_Load添加如下代码,在界面初始化的过程中创建AutoSize。

        private void FrmMain_Load(object sender, EventArgs e){autoSize = new AutoAdaptWindowsSize(this);}

Step3. 创建SizeChanged事件函数

        private void FrmMain_SizeChanged(object sender, EventArgs e){if (autoSize != null) // 这个判断防止电脑缩放的布局不是100%时候的报错。{autoSize.FormSizeChanged();}}

Step4. 在Fram.Disiger中添加

为了解决拖动窗口时出现的严重闪屏现象。Disiger位置:
在这里插入图片描述
代码如下:

using System.Windows.Forms;protected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;cp.ExStyle |= 0x02000000;return cp;}}

更新时间

  • 2024.07.19

相关文章:

记录|C# winform布局学习

目录 前言一、自适应布局Step1. 添加AutoAdaptWindowsSize类Step2. Form中引用Step3. 创建SizeChanged事件函数Step4. 在Fram.Disiger中添加 更新时间 前言 参考视频&#xff1a; C#5分钟winform快速自适应布局 参考文章&#xff1a; 其他参考&#xff1a; 写这篇文章&#xff…...

C/C++ json库

文章目录 一、介绍1.1 json 介绍 二、C/C json 库选型2.1 选型范围2.2 jsoncpp2.2.2 jsoncpp 编译和交叉编译 2.3 rapidjson2.4 nlohmann/json2.5 sonic-cpp 五、常见问题5.1 jsoncpp 中关于浮点数的控制和中文显示问题5.2 jsoncpp序列化double类型时精度损失问题的解决办法 一…...

C++案例四:简易记事本程序

文章目录 程序介绍代码说明包含必要的头文件主函数定义变量定义主循环显示菜单和读取选择处理用户选择程序介绍 编写一个简单的记事本程序,可以帮助用户添加和查看笔记。这个案例可以练习C++中的输入输出、向量(std::vector)、字符串处理(std::string)、以及简单的控制结…...

【VUE学习】day03-过滤器filter

VUE学习第三天 过滤器filter全局过滤器私有过滤器 过滤器filter 作用&#xff1a;常见的文本格式化使用场景&#xff1a;插值表达式、v-bind用法&#xff1a;{{msg | filterName}} ; v-bind:属性‘msg | filterName’ msg:需要格式化的文本信息&#xff08;管道符前面的数据&a…...

技术成神之路:设计模式(八)责任链模式

介绍 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许多个对象依次处理请求&#xff0c;避免请求的发送者和接收者之间的显式耦合。该模式通过将多个可能处理请求的对象连接成一条链&#xff0c;并沿着这条链传递请求…...

【Zynq UltraScale+ RFSoC】~~~

Zynq UltraScale RFSoC 系列为 5G 无线和射频级模拟应用引入了颠覆性的集成和架构突破&#xff0c;可直接支持整个 5G sub-6GHz 频段。这个创新系列现已开始批量生产。此设计演示展示了多通道&#xff08;8T8R 或 16T16R&#xff09;Zynq UltraScale RFSoC 评估工具工具工具&am…...

STM32之八:IIC通信协议

目录 1. IIC协议简介 1.1 主从模式 1.2 2根通信线 2. IIC协议时序 2.1 起始条件和终止条件 2.2 应答信号 2.3 发送一个字节 2.4 接收一个字节 3. IIC读写操作 3.1 写操作 3.2 读操作 1. IIC协议简介 IIC协议是一个半双工、同步、一主多从、多主多从的串行通用数据总…...

mysql的数据往hive进行上报时怎么保证数据的准确性和一致性

在将MySQL的数据往Hive进行上报时&#xff0c;确保数据的准确性和一致性可以通过下面一系列步骤来实现 一、准备工作 环境配置&#xff1a; 确保MySQL和Hive环境已经安装并配置好&#xff0c;且都处于可运行状态。检查Hadoop集群&#xff08;Hive通常运行在Hadoop之上&#x…...

问题:4、商业保险与政策性保险的主要不同之处是:经营主体不同、经营目标不同、承保机制不同。 #学习方法#其他#学习方法

问题&#xff1a;4、商业保险与政策性保险的主要不同之处是&#xff1a;经营主体不同、经营目标不同、承保机制不同。 参考答案如图所示...

Getx学习笔记之中间件鉴权

目录 前言 一、实现步骤 1.添加依赖 2.创建鉴权中间件 3.定义路由 4.设置初始路由 5.模拟登陆状态 二、Getx鉴权步骤总结 三、本文demo示例 四、参考文章 前言 在 Flutter 中&#xff0c;使用 GetX 可以很方便地实现中间件鉴权&#xff08;Authentication&#xff09…...

介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者&#xff1a;来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始&#xff0c;我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常&#xff0c;该模型用作第二…...

2024年计算机软考中级【硬件工程师】面试题目汇总(附答案)

硬件工程师面试题汇总分析 1、解释一下同步电路和异步电路 解题思路 同步电路和异步电路是指同步时序电路和异步时序电路。由于存储电路中触发器的动作特点不同&#xff0c;因此可以把时序电路分为同步时序电路和异步时序电路两种。同步时序电路所有的触发器状态的变化都是在同…...

ThinkPad改安装Windows7系统的操作步骤

ThinkPad&#xff1a;改安装Windows7系统的操作步骤 一、BIOS设置 1、先重新启动计算机&#xff0c;并按下笔记本键盘上“F1”键进入笔记本的BIOS设置界面。 2、进入BIOS设置界面后&#xff0c;按下键盘上“→”键将菜单移动至“Restart“项目&#xff0c;按下键盘上“↓”按键…...

微软Edge浏览器全解析教程

微软Edge浏览器全解析教程 微软Edge浏览器&#xff0c;作为微软公司精心打造的一款现代化网页浏览器&#xff0c;自其首次发布以来&#xff0c;凭借其卓越的性能、出色的用户体验和不断迭代的功能&#xff0c;赢得了广大用户的青睐。本文将全面解析微软Edge浏览器的各个方面&a…...

【过题记录】7.20

前两题一直在打模拟赛&#xff0c;有点忙&#xff0c;就没更 Red Playing Cards 算法&#xff1a;动态规划 其实这就是一个线段覆盖问题&#xff0c;只不过大线段能够包含小线段。 这就启发我们&#xff0c;对于每个大线段分别跑一个dp&#xff0c;合并在他内部的小线段。而后…...

Linux系统学习日记——vim操作手册

Vim编辑器是linux下的一个命令行编辑器&#xff0c;类似于我们windows下的记事本。 目录 打开文件 编辑 保存退出 打开文件 打开 hello.c不存在也可以打开&#xff0c;保存时vim会自动创建。 效果 Vim打开时&#xff0c;处于命令模式&#xff0c;即执行命令的模式&#x…...

【深度学习图片】图片清洗,只留下图像中只有一张人脸的,而且人脸是全的

环境&#xff1a; conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia -ypip install onnx1.15 onnxruntime-gpu1.17pip install insightface0.7.3pip install opencv-pythonpip install gradio图片清洗&#xff0c;只留下图像中只有一张人脸…...

如何在 PostgreSQL 中处理海量数据的存储和检索?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 如何在 PostgreSQL 中处理海量数据的存储和检索&#xff1f;一、优化表结构设计二、分区技术三、数据压…...

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.1物联网与2.2.2云计算

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…...

Redis集群的主从复制原理-全量复制和增量复制-哨兵机制

Redis集群的主从复制原理-全量复制和增量复制-哨兵机制 作用 数据备份 这一点直观,因为现在有很多节点,每个节点都保存了原始数据的备份. 读写分离 这一点主要是当发生读写的时候&#xff0c;读数据的操作大部分都会进入到从节点&#xff0c;而写数据的操作都会进入到主节点&…...

23年阿里淘天笔试题 | 卡码网模拟

第一题 字典序最小的 01 字符串 解题思路&#xff1a; 模拟&#xff0c;统计遇到的连续的1的个数记为num&#xff0c;直到遇到0&#xff0c;如果k>num&#xff0c;直接将第一个1置为0&#xff0c;将遇到的0置为1&#xff0c;否则将第一个1偏置num-k个位置置为0&#xff0…...

【SpringBoot】单元测试之测试Service方法

测试Service方法 SpringBootTest public class UserServiceTest{ Autowired private UserService userService; Test public void findOne () throws Exception{ Assert.assertEquals("1002",userService.findOne()); } } 测试Controller接口方法 Runwith(S…...

剪辑师和小白都能用的AI解说神器,一键把短剧变解说视频-手把手教程-2024

为什么短剧、综艺、电影和电视剧需要以解说形式在抖音、快手和TikTok推广&#xff1f; 此类专业影视内容由于时间过长、平台用户的习惯、算法去重需求和版权问题&#xff0c;专业的影视综节目通常需要用解说类型的视频来不断重复的宣发剧集。具体的原因如下&#xff1a; 1. 视…...

我去,怎么http全变https了

项目场景&#xff1a; 在公司做的一个某地可视化项目。 部署采用的是前后端分离部署&#xff0c;图片等静态资源请求一台minio服务器。 项目平台用的是http 图片资源的服务器用的是https 问题描述 在以https请求图片资源时&#xff0c;图片请求成功报200。 【现象1】: 继图…...

IDEA的详细设置

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …...

为什么Spring选择使用容器来管理对象,而不是直接使用new

为什么Spring选择使用容器来管理对象&#xff0c;而不是直接使用new 在Java应用程序开发中&#xff0c;对象的创建和管理是一项基础且关键的任务。传统上&#xff0c;开发者习惯于使用new关键字直接在代码中实例化对象。然而&#xff0c;随着应用程序规模的扩大和复杂度的增加…...

腾讯云发送短信验证码

1、在腾讯云平台中 开通短信服务 2、发送短信 2.1引用jar包 <dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-sms</artifactId><version>3.1.1043</version> </dependency>2.2 发送短…...

嵌入式人工智能(13-基于树莓派4B的指纹识别-AS608)

1、指纹识别模块 指纹识别是一种生物识别技术&#xff0c;通过分析人体指纹的纹理特征来进行身份验证。每个人的指纹纹路都是独一无二的&#xff0c;通过将指纹与事先存储的指纹数据库进行比对&#xff0c;可以确定是否为同一人。指纹识别在安全领域得到广泛应用&#xff0c;例…...

【Vue】`v-on` 指令详解:事件绑定与处理的全面指南

文章目录 一、v-on 指令概述缩写语法 二、v-on 的基本用法1. 绑定方法2. 内联处理器 三、v-on 指令的高级用法1. 事件修饰符.stop.prevent.capture.self.once 2. 按键修饰符.enter自定义按键修饰符 3. 系统修饰符 四、v-on 指令的实际应用1. 表单处理模板部分 (<template>…...

【Spark On Hive】—— 基于电商数据分析的项目实战

文章目录 Spark On Hive 详解一、项目配置1. 创建工程2. 配置文件3. 工程目录 二、代码实现2.1 Class SparkFactory2.2 Object SparkFactory Spark On Hive 详解 本文基于Spark重构基于Hive的电商数据分析的项目需求&#xff0c;在重构的同时对Spark On Hive的全流程进行详细的…...

山西企业模板建站信息/可以直接进入网站的正能量

苹果已经发布了其Swift 5编程语言 &#xff0c;具有稳定的应用程序二进制接口&#xff08;ABI&#xff09;和二进制兼容性&#xff0c;苹果公司表示这将导致更小的应用程序的开发。 与其他语言的互操作性也得到改善。 通过此升级&#xff0c;ABI现在可以在Apple平台上稳定&…...

扬中网站建设/登封搜索引擎优化

2019独角兽企业重金招聘Python工程师标准>>> 当你无法迅速的理解一个方法的逻辑时&#xff0c;把方法的逻辑转换成几个同一层面上的、能够说明意图的步骤。 动机&#xff1a; Composed Method由对其他方法的调用组成&#xff0c;好的Composed Method的代码都在细节的…...

浅谈政府门户网站建设/上海站优云网络科技有限公司

概述 通过可视化设置好ip地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;dns后&#xff0c;重启电脑或者关机后&#xff0c;网卡的网关会自动消失&#xff0c;自己不见了&#xff0c;导致上不去网。 解决办法 方法一&#xff1a;通过注册表解决 1、开始–运行–输入“…...

网站keyword如何排列/金华百度推广公司

#从新下载 下载完才覆盖原来已有 scp zhangyong13:/datM_BL-HiC_Rep2/hic_results/data/MKO_DM_BL-HiC_Rep2/MKO_DM_BL-HiC_Rep2_mm9.bwt2pairs.DEPairs /mnt/d/myodvalid/ ####u参数同步&#xff0c;不覆盖已有文件&#xff0c;会跳过&#xff01; rsync -avzut --progress z…...

做关于时尚网站的目的/1+x网店运营推广

Linux命令--xargs 1.功能&#xff1a; xargs可以将stdin中以空格或换行符进行分隔的数据&#xff0c;形成以空格分隔的参数&#xff08;arguments&#xff09;&#xff0c;传递给其他命令。因为以空格作为分隔符&#xff0c;所以有一些文件名或者其他意义的名词内含有空格的时候…...

网站建设业务员好做吗/开封网络推广公司

我们都知道在使用电脑的过程中&#xff0c;有时候可能会遇到过电脑网络出现红叉怎么修复的情况&#xff0c;出现这种现象该怎么办呢&#xff1f;下面笔者就和大家具体介绍下该问题的解决方法&#xff0c;希望可以帮助大家~1、首先按下winr键打开运行窗口&#xff0c;输入“serv…...