真的需要DPI意识吗?

时间:2012-06-16 19:04:35

标签: c++ windows window gdi+ gdi

我正在学习如何用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 每个应用程序是否都进行了这样的计算,以便正确显示或者显示什么?

有人可以解释如何计算窗口上按钮,图像和所有控件的客户端坐标,以便它们在不同分辨率下具有相同的对齐方式吗?

提前致谢。

2 个答案:

答案 0 :(得分:3)

使用GDI,您可以使用GetDeviceCaps功能与LOGPIXELSXLOGPIXELSY来查找您的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调用或控件坐标。

答案 1 :(得分:2)

忽略dpi意识很快就开始变得痛苦。显示技术在很长一段时间内已经停留在96 dpi,已经20年了。 Vista具有自动dpi缩放功能和高度可访问的“标尺”小程序,它改变了游戏规则。苹果推出“视网膜”显示器是真正的推动力。下一台Apple MacBook有一个2880 x 1800显示器,你典型的1024x768窗口将成为这样一个显示器上的邮票。

使其自动化的工具随时可用,基于XAML的类库(WPF,Silverlight,Metro)完全独立于分辨率。 HTML和Winforms自动缩放。但当然对GDI没什么帮助。在User32中没有任何一个,牢牢地卡在像素区域。你当然可以编写代码,编写代码并不愉快。如果由于遗留原因仍然在编写原始API,那么Vista内置的自动扩展功能将具有吸引力。那么,为了减少努力,它看起来不会很有吸引力:))