我正在尝试找出目标Windows计算机上的字体DPI大小,并修改我们的应用程序字体,使其看起来与目标计算机具有与开发计算机相同的dpi时的大小相同。 (所以更大的目标DPI意味着我们的字体会比开发时更小。)
我想知道下面的解决方案是否有任何问题,特别是LOGPIXELSX = 88是否正确。
背景
我调整表单上的所有控件和字体以匹配当前的Windows屏幕分辨率。但是,如果有人将其字体DPI设置得更高,我们需要考虑到这一点并使字体更小(因此它最终会在屏幕上显示正确的大小)。我们的字体已经很大了(特别是因为我们调整了屏幕res的大小)。来自较高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没有改变,它会给你零高度字体大小)
答案 0 :(得分:2)
这是编写DPI感知应用程序的good article from Microsoft。 (请注意,本文与发布到相关问题的文章不同。)
LOGPIXELSX是Windows系统调用的参数;它不是DPI值。
在VB6(IIRC)中,您可以在开发时使用TwipsPerPixel(X和Y)与运行时TwipsPerPixel(X和Y)的比率作为确定如何缩放的另一种方法。与DPI比率相同,但它利用了内置的VB属性。