记录|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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/383201.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#】Visual Studio2022打包依赖第三方库的winForm程序为exe

0.简介 IDE&#xff1a;VS2022 平台&#xff1a;C# .NetFramework4.7.2 WinForm界面 有GDAL、EEplus第三方库的依赖&#xff0c;所以在其他未安装环境的电脑中功能无法使用。 1. 安装 1.1 运行文件输出 在VS扩展中选择管理扩展&#xff0c;安装&#xff1a;Microsoft Visua…

docker相关内容学习

一、docker的四部分 二、镜像相关命令 三、容器相关命令

【BUG】已解决:NameError: name ‘python‘ is not defined

NameError: name ‘python‘ is not defined 目录 NameError: name ‘python‘ is not defined 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…

SVN文件夹没有图标(绿钩子和红感叹号)

3分钟教会你解决SVN文件夹没有绿勾和红色感叹号的问题_svn文件被改动过不显示红色-CSDN博客https://blog.csdn.net/weixin_43382915/article/details/124251563 关于SVN状态图标不显示的解决办法(史上最全) - 简书 (jianshu.com)https://www.jianshu.com/p/92e8e1f345c0

接入百度文心一言API教程

然后&#xff0c;编辑文章。点击AI识别摘要&#xff0c;然后保存即可 COREAIPOWER设置 暂时只支持经典编辑器.古腾堡编辑器等几个版本后支持.在比期间,你可以自己写点摘要 摘要内容 AL识别摘要 清空 若有收获&#xff0c;就点个赞吧 接入文心一言 现在百度文心一言&…

网站基本布局CSS

代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title></title><style type"text/css">body {margi…

性能调优 17. GraalVM云原生时代的Java虚拟机

1. GraalVM诞生的背景 1.1. Java在微服务/云原生时代的困境及解决方案 ‌‌‌  事实 ‌‌‌  Java总体上是面向大规模、长时间的服务端应用而设计的。 ‌‌‌  即时编译器(JIT)、性能优化、垃圾回收等有代表性的特征需要一段时间来达到最佳性能。 ‌‌‌  矛盾 ‌…

4、Python+MySQL+Flask的文件管理系统【附源码,运行简单】

4、PythonMySQLFlask的文件管理系统【附源码&#xff0c;运行简单】 总览 1、《文件管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 注册2.3 个人中心界面2.4 文件上传界面2.5 其他功能贴图 3、下载 总览 自己做的项目&#xff0c;禁止转载&#xff0c…

大厂面试官问我:两个1亿行的文件怎么求交集?【后端八股文十五:场景题合集】

本文为【场景题合集】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f…

Unity UGUI 之 Input Field

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.Input Field是什么&#xff1f; 给玩家提供输入的输入框 2.重要参数 中英文对照着看…

设计模式|观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…

爬虫学习4:爬取王者荣耀技能信息

爬虫&#xff1a;爬取王者荣耀技能信息&#xff08;代码和代码流程&#xff09; 代码 # 王者荣耀英雄信息获取 import time from selenium import webdriver from selenium.webdriver.common.by import By if __name__ __main__:fp open("./honorKing.txt", "…

nginx隐藏server及版本号

1、背景 为了提高nginx服务器的安全性&#xff0c;降低被攻击的风险&#xff0c;需要隐藏nginx的server和版本号。 2、隐藏nginx版本号 在 http {—}里加上 server_tokens off; 如&#xff1a; http {……省略sendfile on;tcp_nopush on;keepalive_timeout 60;tcp_nodelay o…

Microsoft 365 Office BusinessPro LTSC 2024 for Mac( 微软Office办公套件)

Microsoft 365 Office BusinessPro LTSC 2024是一款专为商业用户设计的办公软件套件&#xff0c;它集成了Word、Excel、PowerPoint等核心应用&#xff0c;并特别包含了Microsoft Teams这一强大的协作工具。Teams将聊天、会议、文件共享、任务管理等功能整合到一个平台上&#x…

【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技&#xff1a;Laravel 项目性能提升 20 倍 这个项目能够在无需修改任何代码且无需第三方扩展的前提下&#xff0c;将你的 Laravel 项目性能提高 20 倍。它仅依赖于 PHP 原生的 pcntl、posix、fiber 和 sockets。 项目灵感 起因是看到官方发布的 PHP 8.1 更新…

软件开发者消除edge浏览器下载时“此应用不安全”的拦截方法

当Microsoft Edge浏览器显示“此应用不安全”或者“已阻止此不安全的下载”这类警告时&#xff0c;通常是因为Windows Defender SmartScreen或者其他安全功能认为下载的文件可能存在安全风险。对于软件开发者来说&#xff0c;大概率是由于软件没有进行数字签名&#xff0c;导致…

河南萌新联赛2024第(二)场:南阳理工学院

文章目录 原题链接A.国际旅行Ⅰ题意&#xff1a;思路&#xff1a;代码&#xff1a; F.水灵灵的学弟题意&#xff1a;思路&#xff1a;代码 I.重生之zbk要拿回属于他的一切题意&#xff1a;思路&#xff1a;代码&#xff1a; J.这是签到题意&#xff1a;思路&#xff1a;代码&am…

畅游时空|虚拟世界初体验,元宇宙游戏如何开发?

在元宇宙中&#xff0c;用户可以通过虚拟身份进行互动、社交、工作和娱乐&#xff0c;体验与现实世界平行的生活和活动。元宇宙不仅仅是一个虚拟空间&#xff0c;更是一个融合了虚拟和现实的生态系统&#xff0c;具有巨大的发展潜力和应用前景。 在不断发展的数字环境中&#x…

NCRE3 2-1 网络总体设计基本方法

这部分记忆的比较多 概览 设计网络建设总体目标确定网络系统方案设计原则网络系统总体设计设计网络拓扑结构进行网络设备选型网络系统安全设计 设计网络建设总体目标 这部分视频没说到 确定网络系统方案设计原则 这部分视频没说到 网络系统总体设计 核心层网络结构设计 …

图形编辑器基于Paper.js教程09:鼠标拖动画布,以鼠标点为缩放中心进行视图的缩放

如何使用Paper.js实现画布的缩放与拖动功能 在Web开发中&#xff0c;利用Paper.js库进行图形的绘制和交互操作是一种常见的实践。Paper.js是一个强大的矢量图形库&#xff0c;可以让开发者通过简洁的API完成复杂的图形操作。在本文中&#xff0c;我们将详细探讨如何使用Paper.…