10

我正在使用此 MSDN 指南使我的应用程序 DPI 敏感,其中缩放技术使用来自设备上下文的 X 和 Y 逻辑像素。

int _dpiX = 96, _pdiY = 96;   
HDC hdc = GetDC(NULL);
if (hdc)
{
    _dpiX = GetDeviceCaps(hdc, LOGPIXELSX);
    _dpiY = GetDeviceCaps(hdc, LOGPIXELSY);
    ReleaseDC(NULL, hdc);
}

然后你可以使用缩放 X 和 Y 坐标

int ScaleX(int x) { return MulDiv(x, _dpiX, 96); }
int ScaleY(int y) { return MulDiv(y, _dpiY, 96); }

有没有一种情况GetDeviceCaps(hdc, LOGPIXELSX)GetDeviceCaps(hdc, LOGPIXELSY)为监视器返回不同的数字。我真正关心的唯一设备是显示器,所以我需要单独的ScaleX(int x)ScaleY(int y)功能吗?我可以只使用一个Scale(int px)功能吗?这样做会有坏处吗?

在此先感谢您的帮助。

4

2 回答 2

10

这在理论上是可能的,但我不知道最近有任何使用非方形像素的显示器。方形像素有很多优点,现有的软件也有很多假设方形像素,主流显示器似乎不太可能出现非方形像素模式。

在许多情况下,如果您确实有一个非方形像素的显示器,您可能可以应用变换使其看起来好像有方形像素(例如,通过设置映射模式)。

也就是说,打印机通常具有非方形设备单元。它们中的许多在一个维度上比在另一个维度上具有更高的分辨率。一些驱动程序使调用者可以使用此分辨率。其他人会让它看起来好像有方形像素。如果您想重新使用您的代码进行打印,我建议您不要将水平和垂直缩放混为一谈。

于 2012-05-04T16:20:53.253 回答
3

LCD 面板的硬件像素始终为正方形。使用 CRT,您可以有矩形正方形,例如在显示器上使用320x200320x400分辨率4:3(这些分辨率是实际使用的)。在 LCD 上,您可以通过在显示器上使用非原生分辨率来获得矩形像素 - 在显示器上使用宽屏分辨率,5:4反之亦然。

于 2013-10-09T09:58:44.023 回答