2014-02-25 66 views
0

此代码尝试为用户显示器尺寸计算出最佳窗口大小。要做到这一点,我试图检测用户监视器的长宽比。检测宽屏幕宽高比

这种方法,我使用的作品适当4:3,16:9,16:10分辨率,但它失败(进入默认的情况下)21:因为2560 * 21 != 1920 * 9 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; 
} 
+2

你*知道还有更多可能的解决方案吗?例如1280x800如何?或者非常常见的1920x1080?或者(不幸的是)1920x1200?或者现代27或30(或更大)英寸显示器的分辨率更高? –

+0

您的意思是说这些解决方案不会被正确检测到吗? –

+1

您不应该使用宽高比来检测分辨率。相反,每个操作系统都具有获取实际分辨率的功能,以及所有支持的分辨率。如果你真的想要高宽比,一旦你有了分辨率就很容易计算。 –

回答

0

的宽度和高度的当前分辨率的高度告诉你一无所知监视器纵横比。例如,3个不同尺寸的显示器(例如4:3,16:10和16:12)都可以使用1024 * 768。

要获得实际的宽高比,您需要显示器本身的信息。大多数显示器都支持称为EDID(扩展显示标识数据)的东西,其中包括显示器的有效显示区宽度和高度(以毫米为单位)。

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