WinForms幻影边框
问题描述:
我有一个应用程序在工作,它是用VS2008在VB.Net winforms中编写的。它最近更新到VS2015;但是,一些幻像边界已经开始出现在用户界面上。大多数控件/用户界面都是自定义控件,但希望这里的某个人可能会对2015年为什么现在出现这些内容有所了解。(我在2008年编写了相同的代码,并且边框不在那里)。WinForms幻影边框
下面的屏幕截图显示了在操作中的“幻影边框”。
这可能是很难看到的,但在文字左侧的浅灰色线是“幻影边界”。虽然在这种情况下这看起来不是什么大问题,但在整个用户界面上的情况要严重得多,所有其他控件的功能都差不多。
希望有人有一些想法,因为我是新鲜的!
我试过了 - 禁用控件中的所有边界,然后禁用(以确保没有缓存状态)。检查用户控件上的所有属性以确保我不会丢失属性。
答
典型。提出问题,然后出现答案。
问题是由于在基本用户控件中覆盖了“OnPaintBackground”方法。
看起来像Windows 10/vs2015(不知道该公式的哪个元素)改变了像素计算的方式。
其中基础控件将获得背后形式的背景图像,为用户控件执行手动“透明度”时,大小将在宽度和/或高度上为1像素太小。
(即创建的幻象边界)之前的代码:
Dim srcRec As Rectangle = Bounds
srcRec.Offset(backgroundSource.Origin)
e.Graphics.DrawImage(backgroundSource.BackgroundImage, 0, 0, srcRec, GraphicsUnit.Pixel)
正如你所看到的,它抓住了控件的大小,然后获取其背后的背景部分,并提请该图像作为自己的背景。
改正的代码(即摆脱幻象边界):
Dim srcRec As Rectangle = Bounds
srcRec.Width +=1
srcRec.Height +=1
srcRec.Offset(backgroundSource.Origin)
e.Graphics.DrawImage(backgroundSource.BackgroundImage, -1, -1, srcRec, GraphicsUnit.Pixel)
这似乎解决问题,隐藏幻象边界和正确渲染UI。
谢谢任何至少看到这个问题的人!从我无法分享的代码库中总结问题是很困难的。希望这可以帮助未来的其他人。
我会在众目lim lim之下宣布你的应用程序是DPI Aware。在VS2015中开始一个新的Winform项目。转到项目菜单 - >项目属性 - 查看窗口设置按钮以打开app.manifest文件。将''块中包含'dpiAware'标记的块复制到旧应用程序中。 –
TnTinMn
@TnTinMn有趣的想法!我明天去看看。您是否大致了解这些设置的dpi识别时间?我发现最奇怪的是,如果我构建它,它将在win7和win10上呈现相同的效果,而不仅仅是10.必须承认这是一个相当令人困惑的问题。 –
DPI认知度一直是回到XP的移动目标。在[编写DPI-Aware桌面和Win32应用程序](https://msdn.microsoft.com/zh-cn/)中介绍了一个很好的摘要表。COM/EN-US /库/ dn469266(V = vs.85)的.aspx#high_dpi_tutorial)。最有可能的罪魁祸首是在Vista中启动的DPI虚拟化,但监视器需要几年时间才能更换,以便问题变得明显。 – TnTinMn