如何禁用通过COM公开的WPF HwndSource的DPI缩放?

时间:2015-10-19 03:08:28

标签: c# .net wpf delphi

我的公司有一个庞大的遗留Delphi应用程序,我们正在尝试逐步迁移到.Net框架。我们已经决定使用WPF实现新的GUI元素并通过COM公开它们。我相信这是相当标准的,因为我在网上看到了很多关于人们做这件事的材料。

到目前为止,我们的概念/演示样本证明相当不错。我们通过COM互操作库公开各种“创建元素X”方法,它返回新创建的HwndSource包装器的Hwnd。然后,我们调用SetParent将新控件放在Delphi应用程序中所需的位置。

现在唯一的问题似乎是,当DPI设置设置为96dpi以外的任何其他设置时,传统的Delphi和新的WPF GUI元素都难以共存。

我们从未在Delphi应用程序中处理过高DPI,因此建议客户使用Windows(非XP)扩展来扩大高DPI监视器上的应用程序。

然而,这似乎与新的WPF元素发生冲突,因为它们似乎已经在增加的DPI设置下呈现,然后再次被炸毁(可能?我不是100%确定问题所在通过Windows扩展整个应用程序。

我现在要尝试的是禁用这些WPF元素的自动缩放,将它们带入Delphi应用程序,就像监视器设置为96dpi一样。然后我们让窗口缩放使它们恢复到所需的DPI。

1 个答案:

答案 0 :(得分:0)

DPI意识是按流程进行的。如果你真的想以这种方式解决问题,那些WPF元素需要告诉Windows它们不支持DPI。 Here's how it's done in the API.这可能不是一个好方法。 Here's how someone else says you can do it for WPF.

更强大的解决方案是properly handle DPI in your Delphi application