gnxiaowei 2020-03-17 08:15 采纳率: 0%
浏览 675

c++编程中使用GetSystemMetrics获得屏幕宽高度,窗口宽高度和分辨率有什么关系和不同?

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);
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-03-17 19:23
    关注

    SM_CXSCREEN,以像素为单位计算的屏幕尺寸。

    SM_CXFULLSCREEN = 最大化窗口的客户区宽度。

    当窗口边框有宽度的时候,SM_CXFULLSCREEN = SM_CXSCREEN - 两边边框宽度

    评论

报告相同问题?

悬赏问题

  • ¥15 能将阿里云上多个设备的信息能上传给小程序吗
  • ¥50 QT6.7 Camera预览窗口,camera分辨率设置
  • ¥15 车机是安卓4.4.3,车机没有gps,我想用外置蓝牙gps。所以在用安卓模拟位置服务时候,我下载的相关软件不显示在列表里
  • ¥15 matlab水位控制系统(详解)
  • ¥15 CST软件仿真,已知中心线方程构建图形
  • ¥15 supLink 用户定位
  • ¥15 materials studio中sorption模块得到的吸附量如何计算出绝对吸附量和自由气量
  • ¥15 odoo17生产成品入出库会计日记账设置及自动产生会计分录
  • ¥15 MCU控制20V PWM波输出的控制电路
  • ¥15 关于智能数据系统的问题