0

我正在使用 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 错误?

4

0 回答 0