问题:

将Winform窗体设计程序从台式电脑拷贝到笔记本电脑后,刚开始运行,界面可以显示完全,但后来出现界面显示不完全问题,发现Winform窗体实际运行大小(QQ截图)与size属性设置不一致。
尝试一:
认为是误设置了窗体的某个属性,故与原来台式电脑上Winform窗体属性对比
结果:发现没有区别,未找到问题所在
尝试二:
尝试通过窗体属性设置如AutoSize、AutoScaleMode使窗体显示完全。
发现设置AutoScaleMode时,Font和Dpi效果一样,None和Inherit会使窗体控件间距变大,显示更加不完全,一般设置AutoScaleMode=Font或Dpi;设置AutoSize为True时,窗体实际运行大小(QQ截图)与size属性设置不一致,但窗体宽方向上显示完全,高方向上状态栏statusStrip被压在panel控件下面无法显示,将状态栏statusStrip放到panel控件中则可以显示完全(貌似把所有控件都放到一个panel中可以避免AutoSize为True时显示不完全的现象?不懂)
结果:发现将AutoSize属性设置为true,并把状态栏statusStrip(甚至所有控件都)放到一个panel中可以使界面显示完全,但Winform窗体实际运行大小(QQ截图)与size属性设置不一致。
**尝试三:**通过在Form_Load()中设置size更改窗体初始加载大小。(AutoSize=false;AutoScaleMode=Font)

            //size属性设置为1628*1062(界面恰好显示完全);实际显示1286*748(界面显示不完全)
            Rectangle ScreenArea = System.Windows.Forms.Screen.GetWorkingArea(this);//GetWorkingArea()检索显示器的工作区(工作区是显示器的桌面区域,不包括边界、标题栏、任务栏、停靠窗口和停靠工具栏)
            int mywidth = this.Width; //Winform窗体宽度---872 
            int myheight = this.Height; //Winform窗体高度---506
            mywidth = ScreenArea.Width; //工作区宽度(不包括边界,标题栏,任务栏,工具栏等) ---1280
            myheight = ScreenArea.Height; //工作区高度(不包括边界,标题栏,任务栏,工具栏等) ---680
            this.Size = new Size(mywidth, myheight);

结果:
1、窗体初始加载位置不在屏幕中央,整体偏右下
2、宽边的控件所在区域均在屏幕中,有一部分空白不在屏幕中,
在这里插入图片描述
高边的状态栏不在屏幕中。很奇怪
尝试四:
修改Windows显示设置中“缩放与布局”-“更改文本、应用等项目大小”:由150%改为100%(AutoSize=false;AutoScaleMode=Font)
在这里插入图片描述
结果:整个电脑字体、图标变小。窗体可以完全正常显示。
接着,将“更改文本、应用等项目大小”由100%恢复为150%,仍然有和原来一样的问题。
后来我发现窗体初始加载大小、size属性设置大小、this.Width和this.Height值与“更改文本、应用等项目大小”100%、150%之间有一定规律。
我上网搜索了有关Winform属性size属性单位、Windows缩放与布局相关资料,并且无意间有了尝试四,终于发现原因在于:
VS在缩放与布局设置为非100%的时候,就会自动启动DPI感知模式,以防止VS界面模糊,这将导致高DPI下(非100%缩放与布局)设计的winform程序当拿到不同的缩放条件下运行时就会遇到界面变形或不一致的问题。
解决方法一:
在做程序的时候必须使用100%缩放,否则在其他机器上容易出问题的。如果100%会让字小的没有办法使用电脑,则需调整降低你自己电脑的分辨率,使其在100%缩放的情况下看得清。只有在100%缩放做好程序之后,再考虑不同DPI情况下 显示不正常如何调整。参考19楼
解决方法二:
禁用VS的高DPI感知模式。
具体禁用方式如下
1、手动在注册表中添加项(未尝试成功)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\devenv.exe]
“dpiAwareness”=dword:00000000
2、Bat一键处理(新建文本文件.txt 改后缀为 bat,将下面代码粘贴到文本文件里保存,双击执行即可)
reg add"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT
\CurrentVersion\Image File Execution Options\devenv.exe" /v “dpiAwareness” /t REG_DWORD /d “0”
参考:解决VS在高DPI下设计出的Winform程序界面变形问题
尝试五:(无意间的尝试)
关闭VS,修改Windows显示设置中“缩放与布局”-“更改文本、应用等项目大小”:由150%改为100%(AutoSize=false;AutoScaleMode=Font)
结果:整个电脑字体、图标变小。打开VS,发现100%下,设计状态下的窗体size不正确,窗体显示不完全,故更改了窗体size属性,启动运行后,窗体显示完全。
接着,将“更改文本、应用等项目大小”由100%恢复为150%,启动运行后,发现窗体显示完全,和size属性一致!(震惊!!)

最终,猜测出现原因是:

我的笔记本电脑的“更改文本、应用等项目大小”(DPI)为150%,我在此环境下不小心手动修改了窗体的size或调整了控件位置,导致窗体变为了在高DPI环境下设计的窗体,启动了VS的DPI感知模式,使得界面变形,显示不完全。

解决方法:

(AutoSize=false;AutoScaleMode=Dpi/Font)
1、关闭VS(有DPI感知模式)
2、将笔记本电脑的“更改文本、应用等项目大小”(DPI)由150%修改为100%
3、重新打开VS,尝试修改Winform窗体的size并《启动》(这样C#部分才会生成解决方案)运行窗体
4、将笔记本电脑的“更改文本、应用等项目大小”(DPI)为150%
5、《启动》运行窗体(千万不要修改Winform窗体的size)
发现窗体显示大小与size一致。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐