【问题标题】:Detecting wide screen aspect ratio检测宽屏幕纵横比
【发布时间】:2014-03-27 05:56:37
【问题描述】:

此代码试图为用户监视器大小计算出最佳窗口大小。为此,我试图检测用户监视器的纵横比。

我使用的这种方法适用于 4:3、16:9、16:10 分辨率,但它对于 21:9 分辨率失败(进入默认情况),因为2560 * 21 != 1920 * 9。如何正确检测宽屏幕纵横比的纵横比?

dm.wdm.h是当前分辨率的宽高

if( dm.h * 4 == dm.w * 3 ) { // 4:3
    screen_width = 1024;
    screen_height = 768;
} else if( dm.h * 16 == dm.w * 9 ) { // 16:9
    screen_width = 1366;
    screen_height = 768;
} else if( dm.h * 16 == dm.w * 10 ) { // 16:10
    screen_width = 1440;
    screen_height = 900;
} else if( dm.h * 21 == dm.w * 9 ) { // 21:9
    screen_width = 1920;
    screen_height = 720;
} else {
    Printf( "Unknown aspect ratio. Defaulting to 1024x768\n" );
    screen_width = 1024;
    screen_height = 768;
}

【问题讨论】:

  • 确实知道还有更多可能的解决方案吗?例如 1280x800 怎么样?还是非常常见的 1920x1080?还是(不幸的是不常见的)1920x1200?或者更高分辨率的现代 27 或 30(或更大)英寸显示器怎么样?
  • 你的意思是这些分辨率不会被正确检测到吗?
  • 您不应该使用纵横比来检测分辨率。相反,每个操作系统已经具有获取实际分辨率的功能,以及所有支持的分辨率。如果你真的想要宽高比,一旦你有了分辨率就很容易计算出来。
  • 对于 Windows,您可能想了解EnumDisplaySettings
  • 我没有尝试使用纵横比来检测分辨率。我正在尝试检测纵横比,以便为我的窗口选择最佳尺寸。我只想支持几种不同的窗口大小,这样我的游戏中的 2d 图形就不会在我不支持的分辨率下被拉伸。

标签: c aspect-ratio


【解决方案1】:

当前分辨率的宽度和高度不会告诉您有关显示器纵横比的任何信息。例如,3 台不同尺寸的显示器(例如 4:3、16:10 和 16:12)都可以使用 1024*768。

要获得实际的纵横比,您需要来自显示器本身的信息。大多数显示器都支持称为 EDID(扩展显示标识数据)的内容,其中包括显示器的活动显示区域宽度和高度(以毫米为单位)。

当然,您不希望从原始 EDID 数据本身中提取此信息 - 您需要提供最初从 EDID 获得的信息的 API 和/或库。我不知道您使用的是哪个操作系统;但如果有可用的库和/或 API,也不会感到惊讶。如果像多台显示器这样的事情会让您的事情变得复杂,也不要感到惊讶(例如,我使用了 2 台不同尺寸的显示器)。

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 2018-05-01
    • 2018-08-09
    • 2013-02-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多