GetSystemMetrics可以获取各种系统的数据,但是有几个我弄不明白都代表什么,下面这段是一本编写游戏教程书上的代码,建立窗口的一节。
其中
1.为什么全屏幕设置的时候,要使系统分辨率等于屏幕宽高度,而不是屏幕宽高度等于系统分辨率?
2.GetSystemMetrics(SM_CXSCREEN) 和GetSystemMetrics(SM_CXFULLSCREEN) 有什么关系,这两个参数和分辨率有什么关系?
//////////////////////////////////////////////////////////////////////////////////
/*使用DEVMODE结构设置屏幕显示模式*/
DEVMODE DevMode;
ZeroMemory(&DevMode, sizeof(DevMode));
DevMode.dmSize = sizeof(DevMode);
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DevMode);//用当前屏幕显示模式设置填充DEVMODE
BOOL bDisplayChange = FALSE;
//如果屏幕显示位数与屏幕不同
if (DevMode.dmBitsPerPel != (unsigned long)m_nColorbit)
{
DevMode.dmBitsPerPel = m_nColorbit;
bDisplayChange = TRUE;
}
//如果全屏幕状态下的屏幕尺寸与窗口不同;或者屏幕尺寸小于窗口,都需要重设显示模式
int s = GetSystemMetrics(SM_CXSCREEN);
if ((m_bFullScreen && m_nWidth != GetSystemMetrics(SM_CXSCREEN)) || m_nWidth > GetSystemMetrics(SM_CXSCREEN))
{
DevMode.dmPelsWidth = m_nWidth;
DevMode.dmPelsHeight = m_nHeight;
bDisplayChange = TRUE;
}
//如果模式发生改变
if (bDisplayChange)
{
LONG result = ChangeDisplaySettings(&DevMode, 0);//动态修改屏幕显示
if (result == DISP_CHANGE_SUCCESSFUL)
ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN);
else
{
ChangeDisplaySettings(NULL, 0);
return FALSE;
}
}
if (m_bFullScreen)
{
nPosX = nPosY = 0;
dwWinStyle = WS_POPUP;
nWndWidth = m_nWidth;
nWndHeight = m_nHeight;
}
else
{
nWndWidth = m_nWidth + GetSystemMetrics(SM_CXFIXEDFRAME) * 2;
nWndHeight = m_nHeight + GetSystemMetrics(SM_CXFIXEDFRAME) * 10;
nPosX = (GetSystemMetrics(SM_CXSCREEN) - nWndWidth) / 2;
nPosY = (GetSystemMetrics(SM_CYSCREEN) - nWndHeight) / 2;
dwWinStyle = WS_OVERLAPPEDWINDOW;
}
///////////////////////////////////////////////////////////////////////////////////////////
//创建窗口
hWnd = CreateWindowEx(NULL, //扩展风格,一般为NULL
m_szWindowClass, //注册窗口类名
m_szTitle, //设置窗口标题
dwWinStyle, //窗口风格
nPosX, nPosY, //窗口x,y左边
nWndWidth, nWndHeight, //窗口宽度,高度
NULL, NULL, //父窗口,菜单句柄
m_hInstance, //程序实例句柄
NULL); //LPVOID lpParam
if (!hWnd)
return FALSE;
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);