我正在学习如何使用 GDI/GDI+ 绘制 GUI,我发现了 这个http://msdn.microsoft.com/en-us/library/windows/desktop/dd756596(v=vs.85).aspx#step_2__declare_that_the_application_is_dpi-aware每个应用程序都会进行计算,以便正确显示它还是什么?
有人可以解释如何计算窗口上按钮、图像和所有控件的客户端坐标,以便它们在不同分辨率下具有相同的对齐方式吗?
提前致谢。
使用 GDI,您可以使用GetDeviceCaps
函数LOGPIXELSX
和LOGPIXELSY
来查找您的 DPI,并使用这些值来缩放您的尺寸:
HDC hdc = GetDC(hwnd);
int ppix = GetDeviceCaps(hdc, LOGPIXELSX);
int ppiy = GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(hdc);
// for a control that is 1.5 inches wide and 0.5 inches high.
int ctrl_width = int(1.5 * ppix + 0.5);
int ctrl_height = int(0.5 * ppiy + 0.5);
// for a button that conforms to Microsoft's UI guidelines of 75x23 @ 96dpi.
int btn_width = (75 * ppix + 48) / 96;
int btn_height = (23 * ppiy + 48) / 96;
GDI+ 使这变得相当简单:
Graphics g;
g.SetPageUnit(UnitInch);
// now you can specify draw coordinates in inches
// and it'll figure out DPI for you.
请注意,GDI+ 解决方案只会影响 GDI+ 绘制调用,而不影响 GDI 调用或控件坐标。
忽略 dpi 意识很快就开始变得痛苦。显示技术一直停留在 96 dpi 很长一段时间,已经 20 年了。Vista 的自动 dpi 缩放和高度可访问的“标尺”小程序改变了游戏规则。推动“视网膜”显示器的苹果是真正的推动力。下一个 Apple MacBook 有一个 2880 x 1800 的显示屏,典型的 1024x768 窗口将是这样的显示屏上的邮票。
使其自动化的工具很容易获得,基于 XAML 的类库(WPF、Silverlight、Metro)完全独立于分辨率。HTML 和 Winforms 的自动缩放非常好。但当然对 GDI 帮助不大。在 User32 中没有任何东西,牢牢地停留在像素领域。您当然可以编写代码,只是编写代码并不愉快。如果您出于遗留原因仍在对原始 API 进行编程,那么内置于 Vista 及更高版本中的自动缩放将很有吸引力。好吧,为了减少工作量,它看起来不会很有吸引力:)