Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以为DPI自动缩放表单而不使其变得模糊吗?_C#_.net_Winforms - Fatal编程技术网

C# 我可以为DPI自动缩放表单而不使其变得模糊吗?

C# 我可以为DPI自动缩放表单而不使其变得模糊吗?,c#,.net,winforms,C#,.net,Winforms,我正在用C#开发一个WinForms应用程序。它使用一个面板来绘制Mandelbrot分形的图像。在程序手册中,每当我在某个地方发布有关它的内容时,我建议人们将缩放设置设置为100%,否则图像看起来就不好看。这是因为在其他设置中,图像在绘制后会放大,并变得模糊。所有其他控件也很模糊 例如:我的面板是500x500。“我的窗口”中的缩放比例设置为125%。当我运行程序时,面板内部仍然是500x500,但它显示为625x625,模糊相反,当程序运行时,我希望面板内部调整为625x625,并显示为62

我正在用C#开发一个WinForms应用程序。它使用一个面板来绘制Mandelbrot分形的图像。在程序手册中,每当我在某个地方发布有关它的内容时,我建议人们将缩放设置设置为100%,否则图像看起来就不好看。这是因为在其他设置中,图像在绘制后会放大,并变得模糊。所有其他控件也很模糊

例如:我的面板是500x500。“我的窗口”中的缩放比例设置为125%。当我运行程序时,面板内部仍然是500x500,但它显示为625x625,模糊
相反,当程序运行时,我希望面板内部调整为625x625,并显示为625x625

我找到了以下解决方案:我从中找到了关于SetProcessDPIAware()的信息。使窗口不缩放的设置(看起来好像是在100%缩放设置下),但文本会缩放(并且不会变得模糊)。然后,在程序开始时,我可以计算适当的乘数(dpi=DpiX/96),并将其交给一个包含以下命令的大型方法

xentrylabel.Location = new Point((int)(xentrylabel.Location.X * dpi),(int)(xentrylabel.Location.Y * dpi));
xentry.Location = new Point((int)(xentry.Location.X * dpi), (int)(xentry.Location.Y * dpi));
xentry.Size = new Size((int)(xentry.Width * dpi), (int)(xentry.Height * dpi));
可能需要更新的每个控件属性一个。在写这个问题的时候,我有了这个想法并开始了。然而,我意识到这将需要很多行代码,所以我想知道是否有一种内置的方法来实现这一点。这似乎是许多人都愿意选择的选项,而不是他们的应用程序在高dpi的屏幕上变得模糊或难以阅读

这是手动更正位置和大小的方式,还是有一种内置方式,通过实际缩放表单中的所有内容而不是缩放最终结果来缩放其他DPI设置的表单

编辑:从一些评论来看,似乎SetProcessDPIAware()本身就应该放大所有内容。但以我的经验来看,事实并非如此。以下是一些屏幕截图: 应用于100%刻度设置:

不带SetProcessDPIAware()的125%刻度设置应用程序:

使用SetProcessDPIAware()在125%刻度设置上应用:

我们通过创建WPF用户控件解决了在Chem4Word中缩放大于100%的高DPI屏幕渲染控件的问题,该控件位于ElementHost控件中,设置为填充表单

WinForm +-元素主机 +-WPFUserControl


查看您上传的图像,这正是使用WPF用户控件解决的问题。

您犯了其他类型的错误。当您将应用程序声明为dpiAware时,表单设计不会重新缩放。也许您在代码中而不是使用设计器创建了面板,并将其大小硬编码为500x500,在加载事件中而不是在构造函数中创建它。只需确保在构造函数中执行所有操作,这样无论DPI设置如何,所有控件的重新缩放都是一致的。@HansPassant实际上,当我将应用程序声明为dpiAware时,它不会被重新缩放。应该吗?我不使用设计器,在你的机器上不使用。它很可能在另一台具有不同DPI设置的机器上重新缩放。@Jimi有趣的是,这正是我使用的。从这个被接受的答案来看,你会认为这应该可以完成这项工作。但根据我的经验,它并没有这样做:它只是增加了文本的比例,没有其他的。我能问一下为什么这一点被否决了吗?答案可能不符合OP的喜好,但它肯定解决了他们在面板文本过载方面的问题。我可能会研究这个答案(我没有投票),但我想提前指出,我在面板文本过载方面没有问题。事实上,文本大小调整是需要的:我希望表单的其余部分也能调整大小。我很欣赏切换到WPF用户控件不是一件小事,但我们发现,支持高DPI屏幕而不是100%的缩放是值得的。WPF和windows窗体可以安全地在同一项目中使用。