在代码中区分平移模式和普通屏幕模式 - Windows

10

我正在编写一个全屏3D游戏,并创建了一个菜单,用户可以在该菜单中选择与其硬件容量相匹配的屏幕分辨率。

我使用EnumDisplaySettingsExA枚举所有可用的屏幕模式,像这样:

std::vector<DEVMODEA> modes;
DEVMODEA modeInfo;
int modeNum = -1;
while (EnumDisplaySettingsExA(0, ++modeNum, &modeInfo, 0)) {
    if (modeInfo.dmBitsPerPel < 16) continue;
    modes.push_back( modeInfo );
}

问题是,我同时获取到了panning-modes!我无法区分哪个是哪个;比如我的ATI笔记本电脑有一个最大的正常模式为1280x800,但也包含了一个1024x600的panning-mode!

有人知道区分这两者的方法吗?这样我就可以从菜单中排除panning-modes了。


2
顺便提一下,DEVMODEA结构体中的dmPanningWidth和Height字段是无用的,它们总是返回0。 - Bill Kotsias
什么是平移模式?当EnumDisplaySettingsEx返回1024x600时,这意味着Windows用户可以将视频显示设置更改为该分辨率,并且显示器可能也支持该分辨率。 - Chris O
2
@Chris:这指的是显示器不支持的分辨率,通常是因为它太大了,但由于显卡仅在屏幕上显示桌面的一部分,所以它被模拟出来;将鼠标移到屏幕边缘将"平移"它以显示桌面的其他部分。 - BlueRaja - Danny Pflughoeft
很不幸,我不知道有什么方法可以查询显卡是否支持此功能,或者查询哪些分辨率被平移(这取决于显卡和显示器……) - 我感觉你正在寻找特定供应商的代码。除了 ATI 之外,还有其他公司支持此功能吗? - BlueRaja - Danny Pflughoeft
4
“…正常模式为1280x800,但还包含一个1024x600的平移模式…” -- 那么,平移模式的分辨率难道不比正常最大分辨率更高吗? - Martin Ba
显示剩余5条评论
1个回答

1

@Martin:我猜测楼主只是把分辨率放错了位置。

这个链接是你要找的内容吗?

看起来这是在Windows中获取屏幕像素尺寸的正确方法。


@Bill Kotsias - 这个函数使用底层的Windows监视器函数,如EnumDisplayMonitors、GetMonitorInfo或MonitorForWindow,但我不确定它是否对您有帮助。 - Simon Mourier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接