使用100%缩放比例重新启动Visual Studio 界面模糊的解决方案
问题描述建议:如果是刚开始写WinForm项目 ,建议刚开始就去进行一个替换 ,要不然后面会很麻烦的 ,不仅要计算size 还要去 计算 location 的值
昨天碰到了这个问题 ,当时设置完之后界面就非常的模糊 ,虽然说界面变大了 ,但是看着异常难受 ,很模糊
解决方案
新建应用程序清单文件(Application Manifest File) , 保持默认名称 app.manifest,点击添加。
找到这段代码:
12345<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings></application>
替换DPI相关配置:
1234 ...
图片测试333
1111111111
活着11333
在苦难中活着:读余华《活着》
“人是为活着本身而活着,而不是为了活着之外的任何事物而活着。”
《活着》 是余华最具代表性的作品之一。它讲述福贵从富家少爷到孤身老人的一生,也讲述一个普通中国家庭在时代洪流中的破碎与坚持。读它需要一点勇气,因为它不回避死亡、贫穷和命运的无常。它不是一本 轻松治愈 的书,却是一本让人读完久久沉默的书。
一、故事:把苦难摊开给你看福贵年轻时荒唐、赌钱、败家;后来被抓壮丁,回来时母亲已经去世。再后来,妻子家珍、女儿凤霞、儿子有庆、女婿二喜、外孙苦根相继离开。余华没有用煽情笔法,而是让悲剧像日常一样发生:
有庆死于献血;
凤霞死于难产;
家珍死于病痛;
苦根死于意外。
这些事件不是戏剧化的“高潮”,而是生活里一次次沉默的塌陷。读完你会发现,活着 这两个字,比任何口号都沉重。
二、主题:活着不是胜利,而是承受余华在序言里说过类似的话:
人是为活着本身而活着,而不是为了活着之外的任何事物而活着。
这句话常被引用,却很容易被误解。它不是说人生没有意义,而是说意义不在远方,而在承受本身。福贵没有逆袭,没有顿悟,也没有被苦难“奖赏”。他只是继续活着,和一头老 ...
活着
在苦难中活着:读余华《活着》
“人是为活着本身而活着,而不是为了活着之外的任何事物而活着。”
《活着》 是余华最具代表性的作品之一。它讲述福贵从富家少爷到孤身老人的一生,也讲述一个普通中国家庭在时代洪流中的破碎与坚持。读它需要一点勇气,因为它不回避死亡、贫穷和命运的无常。它不是一本 轻松治愈 的书,却是一本让人读完久久沉默的书。
一、故事:把苦难摊开给你看福贵年轻时荒唐、赌钱、败家;后来被抓壮丁,回来时母亲已经去世。再后来,妻子家珍、女儿凤霞、儿子有庆、女婿二喜、外孙苦根相继离开。余华没有用煽情笔法,而是让悲剧像日常一样发生:
有庆死于献血;
凤霞死于难产;
家珍死于病痛;
苦根死于意外。
这些事件不是戏剧化的“高潮”,而是生活里一次次沉默的塌陷。读完你会发现,活着 这两个字,比任何口号都沉重。
二、主题:活着不是胜利,而是承受余华在序言里说过类似的话:
人是为活着本身而活着,而不是为了活着之外的任何事物而活着。
这句话常被引用,却很容易被误解。它不是说人生没有意义,而是说意义不在远方,而在承受本身。福贵没有逆袭,没有顿悟,也没有被苦难“奖赏”。他只是继续活着,和一头老 ...
333
测试
未命名
测试下看看
CSharp中的ref和out关键字使用
ref 是双向传递,out 是只出不进。
ref 和 out 都是用在方法参数上的关键字,用来改变「参数传递」的方式。之前你在 TryParse 里已经见过 out 了,这篇把 ref 和 out 一起讲清楚。
一、先搞清楚:默认是「复制一份」方法参数默认按值传递,等于复制一份。
先看一段代码,理解默认行为:
12345678910111213141516using System;class Program{ static void Main() { int x = 10; Change(x); // 把 x 传进去 Console.WriteLine(x); // 还是 10,没变! } static void Change(int n) { n = 999; // 改的是 n,不是 x }}
运行结果是 10,不是 999。因为传参时,只是把 x 的值复 ...
CSharp字符串与数值类型相互转换
字符串和数字互相转换,上位机几乎天天要用。
为什么需要互转?因为两边的「身份」不一样。
界面输入框里,用户敲进 25.6,程序拿到的是字符串 string,不是数字,没法直接做加减乘除。
PLC 通过 Modbus 传来的温度是数字,但显示到屏幕上、写进日志里,又得变成字符串。
所以必须学会两个方向:数字变字符串、字符串变数字。
本篇目标:会用 ToString 把数字变字符串,会用 Parse、TryParse 把字符串变数字,知道字符串转数字最大的坑,能用 TryParse 写出不崩溃的代码。
一、数值转字符串(简单方向)数字变字符串很简单,两个办法。
办法一:用加号拼接1234567891011121314151617using System;class Program{ static void Main() { double temp = 25.6; int count = 100; // 数字和字符串用 + 连,数字自动变成字符串 string s1 = "温度:& ...
CSharp数值类型的自动转换和强制转换
类型转换就是把一种类型的数据,变成另一种类型。
上位机里这种需求天天有:PLC 读上来的原始值常常是 int,换算工程量要用 double,算完又要显示成文字给操作员看。这一路就得不断做类型转换。这篇就讲两种转换:自动转换和强制转换。
本篇目标:分清「自动转换」和「强制转换」什么时候发生、会不会丢数据,能自己写转换代码,知道两个最容易踩的坑。
一、先打个比方:大杯子和杯子记住这个比喻,整篇都靠它。
想象两个杯子:
小杯子倒进 大杯子:水不会洒,安全,随便倒。
大杯子倒进 小杯子:水会溢出来,你得自己小心,还可能洒掉。
类型转换一模一样。范围小的类型(比如 byte)转成范围大的类型(比如 int),就像小杯子倒大杯子,安全;反过来范围大的转范围小的,就像大杯子倒小杯子,可能丢数据。
二、自动转换(隐式转换)自动转换就是「小转大」,电脑自动帮你完成,不用写任何东西,也不会丢数据。
1234567891011121314151617using System;class Program{ static void Main() { ...
CSharp运算符之位逻辑条件
运算符就是让数据之间发生关系的符号。这一篇讲三类:逻辑运算符(判断真假)、条件运算符(一句话二选一)、位运算符(直接摆弄二进制位)。其中位运算在上位机里特别常用,比如读 PLC 一个字节里的开关状态。
本篇目标:会用 &&、||、! 做判断,会用 ?: 做二选一,会用 &、|、<<、>> 做位操作,能读懂「读一个字节里的 8 个开关」这种经典代码。
零、先分清三类运算符
类别
符号
作用
结果类型
逻辑运算符
&& `
`!
判断真假
bool
条件运算符
?:
二选一取值
看情况
位运算符
& `
`^ ~ << >>
直接操作二进制位
整数
逻辑运算符 和 条件运算符 是「判断」,位运算符 是「摆弄二进制」。下面一个个来。
---
## 一、逻辑运算符:判断真假
逻辑运算符的答案只有两个:真(true)或假(false)。它用来回答「是不是、有没有、满不满足条件」这类问题。
三个符号先记牢:
与(&&):两边都为真,结果才为 ...
CSharp数据类型转换之拆箱装箱
拆箱装箱
值类型和引用类型之间的搬运
前面我们认识了各种数据类型。这一篇讲一个让很多新手发懵的词——装箱(Boxing)和 拆箱(Unboxing)。别怕,它俩说白了就是「把值装进盒子、再从盒子取出来」两件事,看完这篇你就能彻底搞懂。
本篇目标:能说出什么是装箱、什么是拆箱,能自己写一段装箱拆箱的代码,并且知道拆箱时最容易踩的坑。
一、先补个前提:值类型 和 引用类型拆箱装箱是「值类型」和「引用类型」之间的转换,所以得先分清这两类类型。就一句话。
用一个生活比喻分清两类类型
想象你有一笔钱(数据):值类型:把现金直接塞进自己的口袋。钱就在口袋里,要用直接掏。比如 int、double、bool、float,它们把「值本身」直接放在变量里。引用类型:口袋里的不是钱,是一把储物柜的钥匙。真正的钱放在储物柜里,你要用钱,得先拿着钥匙去开柜子。比如 string、object,它们变量里放的是「地址」,真正的数据在别处。一句话记:值类型装的是值本身,引用类型装的是地址。
...
CSharp常用的基础数值类型
C# 数值类型
装数字的十二只杯子
上一篇我们知道了「数据类型就是装数据的杯子」。这一篇专门讲其中的一大类——数值类型,也就是「能装数字」的类型。把 8 种整数 + 2 种小数吃透,上位机读数据、换算工程量就全通了。
本篇目标:看到 int、double、byte 这些词,能马上说出——是整数还是小数、大概能装多大、上位机里用在哪。
一、先认识两个基础词:位 和 字节理解数值类型,绕不开两个词。它们不复杂,就是「存储空间」的度量单位。
位(bit):电脑里最小的单位,只能存 0 或 1,就像一盏只能「开」或「关」的灯。
字节(byte):把 8 个位打包成一组,就是 1 个字节。
位和字节到底啥关系?
把 8 盏灯排成一排,每盏灯都是 0 或 1,这一整排 8 盏灯就是一个字节。1 个字节 = 8 个位,能表示 2 的 8 次方 = 256 种组合。2 个字节 = 16 个位,能表示 2 的 16 次方 = 65536 种组合。4 个字节 = 32 个位,能表示 2 的 32 次方 = 约 42 亿种组合。所以字 ...
CSharp数据类型的认识
零、先问个问题:数据类型是个啥?打个比方:你要往一个杯子里装东西,杯子有很多种——水杯(装水)、酒杯(装酒)、汤碗(装汤)。数据类型就是「装数据的杯子」,你得先告诉电脑你要用哪种杯子,它才知道怎么帮你装、怎么帮你用。
C# 自带了一堆「杯子」,每种能装的东西不一样大、不一样精确。我们这一篇先把表格里那 11 种类型一个一个过一遍。
本次目标只有一句话:看到一种类型,能说出来——它叫什么、能装多大、是整数还是小数、经常用在哪。
一、整型家族:byte 和 sbyte(最小的一对兄弟)表格里第一对是 Byte 和 SByte,它们的区别就一个字母 S:S 代表 Signed(有符号),没有 S 代表 Unsigned(无符号)。
类型
名字
范围
占用空间
sbyte
有符号字节
-128 到 127
1 字节
byte
无符号字节
0 到 255
1 字节
怎么理解「有符号 / 无符号」?
想象成一块路牌:无符号(byte)只能往前数:从 0 开始,数到 255。有符号(sbyte)有个 0 ...
04-Modbus RTU通信测试软件开发
前一部分我们写好了一个 Modbus RTU 通信库,但那个库是”没有脸”的——你只能在代码里写死参数去调用,看不到也摸不着。这一部分,我们给它配上一张”脸”:做一个图形界面软件,让你在窗口里点按钮、看数据,真正体验”上位机”是什么感觉。
这一部分用的是 WinForm(而不是 WPF)。WinForm 的特点是”拖控件 + 写代码”,不需要写 XAML,非常适合刚入门的你。我们一边拖控件设计界面,一边写事件代码,把这个测试软件一点点做出来。
先新建一个 WinForm 项目;
把上一部分的通信库加进来(直接复用,不用重写);
拖控件设计界面(4.1);
写”参数初始化 + 串口连接”代码(4.2);
逐个功能写测试代码(4.3 到 4.9);
用 Modbus Slave 模拟从站,跑起来看效果。
Visual Studio(推荐 2022);
已经会一点第 3 部分的内容(知道怎么开串口、怎么调读写方法);
最好装一个 Modbus Slave 软件,用来模拟从站,方便测试。
准备工作:新建 WinForm 项目第一步:用 Visual Studio 新建项目
打开 ...








