Windows 显示器上的像素不是正方形吗?
我正在努力使我的应用程序对DPI敏感,因为缩放技术使用设备上下文中的X和Y逻辑像素Windows 显示器上的像素不是正方形吗?,windows,user-interface,dpi,Windows,User Interface,Dpi,我正在努力使我的应用程序对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(i
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(intx)
和ScaleY(inty)
函数吗?我可以只使用一个Scale(intpx)
函数吗?这样做会有负面影响吗
提前感谢您的帮助。理论上这是可能的,但我不知道最近有哪款显示器使用非方形像素。方形像素有很多优点,而且现有的软件都采用方形像素,所以主流显示器似乎不太可能采用非方形像素模式 在许多情况下,如果您确实有一个非方形像素的监视器,您可能会应用一个变换,使其显示为具有方形像素(例如,通过设置映射模式)
也就是说,打印机具有非方形设备单元是很常见的。其中许多在一个维度上的分辨率比在另一个维度上的分辨率高得多。某些驱动程序使调用者可以使用此解析。其他人会让它看起来像是正方形像素。如果您想重复使用代码进行打印,我建议您不要将水平缩放和垂直缩放混为一谈。LCD面板的硬件像素始终为正方形。使用CRT,您可以使用矩形正方形,就像在
4:3
监视器上使用320x200
或320x400
分辨率一样(实际使用了这些分辨率)。在LCD上,您可以使用显示器上的非本机分辨率获得矩形像素,5:4
显示器上的宽屏分辨率,反之亦然。有很多等离子显示器(大部分是电视),其内部分辨率为1024x768,但为16:9。谷歌“plasma 1024x768 16:9”为例“在电脑显示器上很难找到这个,但如果它很容易编程,那么支持这种情况就太酷了!”@克里斯:我怀疑1024x768宽屏显示器的硬件将在低水平上应用转换。在驱动程序级别,您将看到方形像素的幻觉,可能是通过使用16x9排列的1280x720虚拟屏幕,驱动程序下的硬件将对方形虚拟像素重新采样,以生成本机非方形像素。我怀疑您是否能够直接在WinAPI层处理非方形本机像素。