【问题标题】:DPI-awareness is really needed?真的需要 DPI 意识吗?
【发布时间】:2012-06-19 10:38:28
【问题描述】:

我正在学习如何使用 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 是否每个应用程序都进行该计算,以便正确显示?

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

提前致谢。

【问题讨论】:

    标签: c++ windows window gdi+ gdi


    【解决方案1】:

    使用 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 调用或控件坐标。

    【讨论】:

    • 这是所有windows应用程序都使用的算法吗?
    • 好的,是的;)。不幸的是,其中很多都没有 DPI 感知。
    • 所有由 Visual C++ IDE 绘制控件的应用程序都有内置的吗?
    • 是的,在设计器中创建的对话框是 DPI 感知的,除了链接中的清单位之外,您不需要为它们做任何特殊的事情。
    • @VisaToHell,在 Windows Vista 及更高版本中,您必须小心此建议 - 当您询问时,Windows 会在 DPI 问题上对您撒谎,除非您声明您的应用程序支持 DPI。见msdn.microsoft.com/en-us/library/ms701681%28v=vs.85%29.aspx
    【解决方案2】:

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

    使其自动化的工具很容易获得,基于 XAML 的类库(WPF、Silverlight、Metro)完全独立于分辨率。 HTML 和 Winforms 可以很好地自动缩放。但当然对 GDI 帮助不大。在 User32 中没有任何东西,牢牢地停留在像素领域。您当然可以编写代码,只是编写代码并不愉快。如果您出于遗留原因仍在对原始 API 进行编程,那么内置于 Vista 及更高版本中的自动扩展将很有吸引力。好吧,为了减少工作量,它看起来不会很有吸引力:)

    【讨论】:

    • 感谢您的称赞,我确实努力发布非凡的答案:)
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2012-03-13
    • 2020-01-29
    • 2014-02-28
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多