1

我试图找出目标 Windows 机器上的字体 DPI 大小并修改我们应用程序的字体,使其看起来与目标机器与开发机器具有相同 dpi 时的大小相同。(因此,较大的目标 DPI 意味着我们会使字体比开发时更小)。

我想知道下面的解决方案是否有任何问题,特别是 LOGPIXELSX=88 是否正确。

背景

我调整表单上所有控件和字体的大小以匹配当前的 Windows 屏幕分辨率。但是,如果有人将他们的字体 DPI 设置得更高,我们需要考虑这一点并使字体更小(因此它最终在屏幕上是正确的尺寸)。我们的字体已经很大了(尤其是我们用屏幕分辨率调整了它们的大小)。来自较高 DPI 的额外大小使文本过大。

到目前为止我的解决方案据 我所知,如果我们使用 GetDeviceCaps 如下,然后获取 CurrentFontDPI 并执行此操作:(由于新的屏幕分辨率而忽略字体大小修改):

NewFontSize=CurrentFontSize * (DevelopmentDPI/CurrentFontDPI)

 Function CurrentFontDPI
  Dim hwnd, hDC, logPix, r As Long
  Dim  LOGPIXELSX=88
  hwnd = GetDesktopWindow()
  hDC = GetDC(hwnd)
  logPix = GetDeviceCaps(hDC,LOGPIXELSX )
  r = ReleaseDC(hwnd, hDC)
  CurrentFontDPI= logPix

结束函数

仅供参考,上面的代码是“相关的 SO 问题][1] 中更大例程的一部分。我遗漏了其余代码 b/c,它似乎至少有一个错误(它有 NewFont=OldFont * (NewDPI- OldDPI)如果 DPI 没有改变,它会给你零高度字体)

[1]:http ://www.BungalowSoftware.com 测试

4

1 回答 1

2

这是来自 Microsoft的一篇关于编写 DPI 感知应用程序的好文章。(请注意,这篇文章与发布到您的相关问题的文章不同。)

LOGPIXELSX 是 Windows 系统调用的参数;它不是 DPI 值。

在 VB6 (IIRC) 中,您可以使用开发时的 TwipsPerPixel(X 和 Y)与运行时的 TwipsPerPixel(X 和 Y)的比率作为确定如何缩放的另一种方法。与您的 DPI 比率相同,但它利用了内置的 VB 属性。

于 2009-03-14T05:01:20.247 回答