Windows 7-高DPI-RAD Studio XE7的SetProcessDPIAware问题?

时间:2018-10-30 21:50:28

标签: windows dpi highdpi c++builder-xe7 rad-studio

我正在使用Embarcadero RAD Studio C ++ Builder XE7在Windows 7系统上开发应用程序。我正在尝试使我的应用程序DPI之一。为此,我需要重现以下行为之一:

  • 停止所有类型的DPI感知,无论选择什么DPI,都使应用程序具有相同的大小
  • 允许Windows虚拟化应用程序(AFAIK,这是默认行为)
  • 通过在我的应用程序的每种形式上启用TForm Scaled属性,通知Windows该应用程序支持DPI,并允许应用程序调整其组件的大小。

使用清单文件,我可以在应用程序中完美再现这3种情况。

但是,我想在运行时从应用程序内部选择应用程序的行为方式。例如,我想使用如下命令行打开我的应用程序:

C:> MyApp.exe / DPIBehavior = [已忽略,已虚拟化,已缩放]

我注意到Windows SDK提供了一些实现此目的的功能。由于我仍在Windows 7上进行开发,因此我无法使用或测试SetProcessDPIAwareness()函数,因为在Windows 8.1之前不可用,因此我尝试使用SetProcessDPIAware()函数。

我注意到该功能可以很好地停止Windows虚拟化过程。但是,即使我的表单属性上的Scaled属性设置为true,我的表单也不再缩放。我在这里指定我编译了2个不同版本的应用程序,一个版本在主菜单上启用了Scaled属性,另一个版本不启用,但是两者都需要尽快调用SetProcessDPIAware()函数。

我在192 dpi下测试了这些应用程序版本。由于它们产生的结果完全相同,即大小完全相同的用户界面,因此我推断使用SetProcessDPIAware()函数时缩放无法正常工作。另一方面,当我使用清单文件而不是调用SetProcessDPIAware()函数运行完全相同的应用程序时,我得到了预期的结果:一个应用程序被缩放,另一个没有缩放。

有人可以向我解释如何在保持TForm缩放的同时使用SetProcessDPIAware()函数吗?还是XE7错误?

0 个答案:

没有答案