Windows窗体和高DPI屏幕

时间:2017-05-29 12:56:44

标签: c# vsto outlook-addin high-resolution

我有一个名为TMO(http://gotmo.co.uk)的Outlook Add In,其中有一个Windows窗体,单击Outlook工具栏中的“帮助”按钮即可打开该窗体。问题是,当我在Surface Pro Pro等高DPI屏幕上使用TMO时,表格呈现非常复杂(见截图)。但是在其他笔记本电脑上,表单呈现正确。

事实上,如果我在Surface Pro上运行测试应用程序,我从中加载相同的表单,它会正确呈现。请参阅随附的屏幕截图。

从我的阅读到目前为止,Windows Forms需要特殊处理才能在高DPI屏幕上正确呈现。但我无法弄清楚需要编写哪些代码来执行此操作。我的两个具体问题是

  1. 当从Outlook内部与STand Alone一起启动时,同样的表单在高DPI屏幕上呈现不同的差异。
  2. 在高DPI屏幕上处理Windows FOrms渲染需要编写(通用)代码。
  3. Distorted

    Correct

3 个答案:

答案 0 :(得分:1)

在app.config中启用每个监视器的DPI感知

<System.Windows.Forms.ApplicationConfigurationSection>
   <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection> 

参考 - https://msdn.microsoft.com/en-us/library/mt799789(v=vs.110).aspx

答案 1 :(得分:1)

基于用户界面正在其下运行的线程或进程的DPI感知模式,应用程序用户界面的行为可能有所不同。 Outlook可能以“系统” DPI感知模式运行,而在Outlook进程之外运行时,您的应用程序可能以其他模式运行。我不清楚您的代码是在Outlook进程中运行还是由Outlook进程启动,但我怀疑您正在处理意外的DPI感知模式更改。

在两种不同的情况下,我将使用sys-internals确定您的UI运行的模式。

如果您验证以“系统” DPI感知模式运行的UI代码,则可能会成功,这样一来,当代码在不同的上下文中运行时,不会感到惊讶/迷惑...如果发生了这种情况。

在我看来,WinForms代码假设它应该在系统DPI上运行,或者以某种方式与Outlook使用的DPI不同。

答案 2 :(得分:1)

我最终通过稍微重新设计表单来解决了问题,以便它们可以在所有屏幕上正确呈现。另外以下帮助

  1. 将各个控件分组到容器中,例如组框和面板。
  2. 在每个父容器中正确使用控件的Anchor属性,以便它们在其父容器中缩放。
  3. 将父窗体的AutoScaleMode设置为Dpi,将AutoSizeMode设置为GrowAndShrink

我能够跨表格重复执行上述3个步骤,并可靠地对其进行更改,使其可以在“高DPI”和常规屏幕上正常工作