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

时间:2011-08-08 14:42:36

标签: delphi windows-7 screen-resolution

在Windows 7的高DPI模式下尝试使用我的Delphi 2010应用程序更多用户我已经尝试了几种方法来重新检索PixelsPerInch并与96进行比较。唉,无论我尝试什么,我总是得到96.我的问题是:< / p>

  1. 获得自定义DPI模式的最佳做法是什么?
  2. 无论我的意思是什么,我都会得到一个常数96这意味着我错过了什么?
  3. 以下是我尝试的内容

    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

    请建议。

6 个答案:

答案 0 :(得分:9)

我认为您需要将您的应用程序标记为高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意识的详细信息,请here

您好像正在回归所谓的DPI Virtualization

答案 1 :(得分:4)

您的申请是DPI aware吗?如果没有,请声明。

修改

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

答案 2 :(得分:4)

您可以在

查看注册表值AppliedDPI
HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI

感谢Andreas Rejbrand。

答案 3 :(得分:2)

因为Delphi的IDE甚至没有提供一种方法来标记您的应用程序DPI感知,因为David已经向您展示了您需要创建自己的清单并向其添加内容,并且因为进入DPI Aware模式意味着您必须你自己处理了很多工作,你可能会发现它不值得。在大约100个没有结果的工作时间之后,我当然放弃了这一尝试。

如果您的应用使用了100%通用控件,并且您不介意重新处理所有其他应用程序直到它们正常工作,那么请继续使用。

在DPI虚拟化关闭后,即使是基于公共控件的控件(如Page控件)似乎也无法在高dpi环境中正常工作(至少它们的VCL包装器不起作用)。

简短版本:这些天最好的做法是在VCL应用程序中根本不用费心,除非你绝对必须,然后,你也可以留出时间重写和修复VCL和每个第三方控件中的每个控件,解决故障。

答案 4 :(得分:2)

请勿回复用户的 DPI 设置。

回复用户的字体偏好设置。

如果您只回复用户的DPI设置,那么如果用户使用比您在设计时使用的字体更大的字体,则表单不会变大,例如

  • 您使用8pt MS Sans Serif或Tahoma设计
  • 用户正在运行Windows Vista或Windows 7(9pt Segoe UI)
  • 你在我的电脑上运行(14pt Segoe UI)

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

  • 8pt Tahoma @ 96dpi:13px Windows 2000 / XP (你设计的是什么)
  • 8pt Tahoma @ 131dpi:15px(将您设计的表格缩放115%)
  • 9pt Segue UI @ 96dpi:15px Windows Vista / 7 (将您设计的表格缩放115%)
  • 9pt Segoe UI @ 131dp:16px 我的家用机器(将您的表格缩放123%)
  • 12pt Tahoma @ 96dpi:16px 我的工作机器(将您设计的表格缩放123%)

您希望关闭所有表单的Scaled属性;所以他们不会尝试响应dpi设置。您希望.NET WinForms等效于AutoScaleMode.Font


是的,一旦您已缴纳税款,并且可以处理不同的DPI设置,请使用清单声明您的应用程序 highDpi aware - 正如其他答案所示。

不要使用SetProcessDPIAware,因为DLLs that you depend on who already read the current DPI可能为时已晚:

  

注意如果DLL在初始化期间缓存dpi设置,则SetProcessDPIAware会受到可能的竞争条件的影响。因此,建议通过应用程序(.exe)清单而不是通过调用SetProcessDPIAware来设置dpi-aware。

答案 5 :(得分:0)

如果有人帮助, 我注意到Screen-&gt; PrimaryMonitor-&gt; PixelsPerInch会根据显示缩放而改变。