在 Delphi 中获取自定义DPI百分比

7xllpg7q  于 2022-11-04  发布在  其他
关注(0)|答案(7)|浏览(387)

尝试我的 Delphi 2010应用程序更用户友好地在高DPI模式在Windows 7我一直在尝试几种方法来检索PixelsPerInch和比较96.唉,无论我尝试了什么,我总是得到96.我的问题是:
1.获得自定义DPI模式的最佳实践是什么?
1.事实上,我得到了一个常数96,无论我是什么百分比是意味着我错过了什么?
这是我尝试过的

dpiX := Form1.PixelsPerInch

dpiX := Screen.PixelsPerInch

最后:

D2DFactoryOptions.DebugLevel := D2D1_DEBUG_LEVEL_NONE;
pD2DFactoryOptions := @D2DFactoryOptions;
if D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    IID_ID2D1Factory,
    PD2DFactoryOptions,
    D2DFactory
    ) <> S_OK then exit;
D2DFactory.GetDesktopDpi(dpiX, dpiY)

猜猜看?没错dpiX在100%、125%和150%时都是常数96
请多多指教。

swvgeqrz

swvgeqrz1#

我认为您需要通过在应用程序清单中包含以下内容来将应用程序标记为高DPI感知:

<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    <dpiAware>true</dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

此处提供了有关声明DPI感知的详细信息。
看起来您目前正在退回到所谓的DPI虚拟化。

wqsoz72f

wqsoz72f2#

您可以在以下位置查看注册表值AppliedDPI

HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI

感谢安德烈亚斯·雷布兰德。

cfh9epnr

cfh9epnr3#

您的应用程序是否支持DPI?如果不支持,请声明支持DPI。

编辑:

如果您真的只想 * 检测 * 当前设置,但不想为整个应用程序启用DPI感知,则最好的方法可能是编写一个小的(dpi感知)应用程序,其唯一的工作是进行此检测。运行它并将结果传输到您的主应用程序。或者提供一个启动程序,检测并运行主应用程序,并将设置作为命令行参数。当然,只有在没有其他API或“秘密”调用的情况下,您的应用程序才能确定设置,即使在运行虚拟化DPI时也是如此。

qzlgjiam

qzlgjiam4#

因为 Delphi 的IDE甚至没有提供一种方法来标记你的应用程序DPI感知,就像大卫向你展示的那样,你需要制作你自己的清单并向它添加东西,并且因为进入DPI感知模式意味着你将不得不自己处理大量的工作,你可能会发现这根本不值得。在大约100个毫无结果的工作小时之后,我当然放弃了这种尝试。
如果你的应用程序使用了100%的通用控件,并且你不介意重新使用所有其他控件,直到它们对你来说很好,那么就去做吧。
一旦DPI虚拟化被关闭,即使是基于公共控件的控件(如Page控件)在高dpi环境中似乎也不能很好地工作(至少它们的VCL Package 器不能工作)。
简短版本:现在的最佳实践是,除非绝对必要,否则不要在VCL应用程序中费心,然后,您还可以留出时间重写和修复VCL中的每个控件和每个第三方控件,以解决故障。

mv1qrgav

mv1qrgav5#

不响应用户的DPI设置。
响应用户的字体首选项。
如果您只回应使用者的DPI设定,则当使用者使用比您在设计阶段使用的字型更大的字型时,您的表单不会变大,例如

  • 您使用8磅MS Sans Serif或Tahoma字体设计
  • 使用者执行的是Windows Vista或Windows 7(9 pt Segoe使用者界面)
  • 您在我的计算机上执行(14 pt Segoe使用者界面)

通过响应字体大小(以像素为单位),您将免费获得高DPI支持(而且您是一名优秀的开发人员!):

  • 8磅新细宋体@96dpi:13pxWindows 2000/XP(您在设计时所使用的)
  • 8磅宋体,131 dpi:15px(将设计的窗体缩放115%)
  • 9磅连续用户界面@96dpi:15pxWindows Vista/7(将您设计的外形放大115%)
  • 9磅的Segoe用户界面@131dp:16px * 我的家用计算机 *(将表单缩放123%)
  • 12磅新细宋体@96dpi:16px * 我的工作机器 *(将设计的表单缩放123%)

您希望关闭窗体的所有Scaled属性;因此它们不会尝试响应dpi设置。您需要. NETWinForms的AutoScaleMode.Font等效项。
是的,一旦您缴纳了税款,并且可以处理不同的DPI设置,就可以使用清单声明您的应用程序 *highDpi感知 *-正如其他答案所给出的那样。

不要使用SetProcessDPIAware,因为它可能对DLLs that you depend on who already read the current DPI来说太晚了:
注意如果DLL在初始化过程中缓存dpi设置,SetProcessDPIAware可能会出现争用情况。因此,建议通过应用程序(.exe)清单设置dpi感知,而不是通过调用SetProcessDPIAware。

tv6aics1

tv6aics16#

我开始修复这个 Delphi 程序,它在Windows 10中有DPI问题,在Windows 7 Virtual Magnifying Glass中很好,在这里登陆并排除故障后,我结束了节省了大量的时间,只需右键单击exe的属性并摆弄兼容性设置,有一个“更改高DPI设置”按钮,在对话框的底部打开“覆盖高DPI缩放”,应用程序现在工作正常。
所以,如果只是个人使用或w/e,这将是一个少得多的头痛!

f5emj3cl

f5emj3cl7#

万一它对某人有帮助,我已经注意到Screen-〉PrimaryMonitor-〉PixelsPerinch确实会根据显示缩放比例而变化。

相关问题