【问题标题】:Delphi project no longer DPI-aware via resource DLLDelphi 项目不再通过资源 DLL 识别 DPI
【发布时间】:2020-09-10 15:50:40
【问题描述】:

我们有一个 DPI 感知的 Delphi 项目。除其他外,我们通过在可执行文件中包含清单来实现这一点。这一切都很好,项目可以根据 DPI 设置很好地缩放。

最近我们开始翻译我们的产品,为此我们使用了 Sisulizer。此工具已配置为生成资源 DLL。清单由 Sisulizer 复制到资源 DLL,但不翻译。所以翻译也很好:)

但是,翻译后的项目不再完全支持 DPI。 MessageBoxes(来自 Windows API)仍然支持 DPI,但项目的其余部分不再可扩展。未翻译的项目仍可识别 DPI。

【问题讨论】:

  • 清单是否还在 EXE 的资源中?还是从 EXE 中删除并移至 DLL?此外,请确保清单的资源 ID 在 EXE 的资源中为 1,在 DLL 的资源中为 2。
  • 加载程序不会激活 dll 中的清单。你必须这样做。
  • 谢谢,雷米!清单在 EXE 和 DLL 中。我尝试更改 DLL 中的资源 ID,但并没有改变行为。
  • @David:感谢您的评论!这确实可以解释很多。您对如何从 Delphi 实现这一点有任何指示吗?
  • 您使用激活上下文 API。 ActivateActCtx 和朋友们。对您有利的一件事是,当加载 DLL 时,加载的确实会在对 DllMain 的调用中激活与 DLL 清单关联的上下文,因此您可以使用GetCurrentActCtx 在此处捕获它。

标签: delphi highdpi resource-dll


【解决方案1】:

问题已解决。清单不是问题,它是 Sisulizer 项目中的一个选项:“表单缩放”设置为“禁用缩放”,这导致资源 DLL 中的 dfm 被更改(添加了“Scaled=False”)。将其更改为“忽略”即可解决问题。

从 GUI 更改语言(因此 Screen.FormCount > 0)时,缩放不会自动设置为正确的 DPI。或者换句话说:表单在其设计时状态下从资源 DLL 流式传输。我们通过在切换到另一种语言之前记录每种形式的比例因子来解决此问题。更改语言(并且所有表单都已翻译)后,我们将比例因子重新应用于表单,以便一切都按预期显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2012-08-15
    相关资源
    最近更新 更多