• cocos creator发布win10全屏缩放问题


    当前2.2.1版本cocos creator发布的win32版本不是全屏的,

    https://forum.cocos.org/t/win-exe/80429

    https://blog.csdn.net/wudics/article/details/85346288

    按照以上两个好人的帖子可以解决visual studio发布问题(我也直接用的vs2017,没用2019)以及win32在写死的宽高下全屏问题,

    那如何让main.cpp里的
    AppDelegate app(xx,xx);
    两个参数不写死,而是获取真实的屏幕尺寸呢,找到了调用windows api的一个办法:
     int  cx = GetSystemMetrics(SM_CXSCREEN);
     int  cy = GetSystemMetrics(SM_CYSCREEN);

    但是发现程序启动之后,虽然窗口是全屏了,但是实际渲染区域却是在左下边部分,右侧和上侧有大量的黑色空白区域,

    后来用微信截图工具一截图发现宽高比上面拿到的cx,cy大许多,于是联想到是否跟分辨率大小或者缩放有关系,然后发现的重点,就是因为当前的win10在“显示设置”里更改了“缩放与布局”为“125%”,于是GetSystemMetrics()获取到的是缩放之后的分辨率,而不是物理宽度和高度,要另外想办法计算出显示器的原始尺寸:

    #include "main.h"
    #include "AppDelegate.h"
    
    USING_NS_CC;
    
    // uncomment below line, open debug console
    // #define USE_WIN32_CONSOLE
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                           HINSTANCE hPrevInstance,
                           LPTSTR    lpCmdLine,
                           int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
    #ifdef USE_WIN32_CONSOLE
        AllocConsole();
        freopen("CONIN$", "r", stdin);
        freopen("CONOUT$", "w", stdout);
        freopen("CONOUT$", "w", stderr);
    #endif
    
        // create the application instance
        //by jd, get the real screen size in windows
    
        //以下的cx,cy不通用,在设置了win10的屏幕缩放之后,下面2个参数是缩放之后的分辨率,不是原始的分辨率(物理宽度与高度)
        //int  cx = GetSystemMetrics(SM_CXSCREEN);
        //int  cy = GetSystemMetrics(SM_CYSCREEN);
    
        HWND hWnd = GetDesktopWindow();
        HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
    
        // 获取监视器逻辑宽度与高度
        MONITORINFOEX miex;
        miex.cbSize = sizeof(miex);
        GetMonitorInfo(hMonitor, &miex);
        int cxLogical = (miex.rcMonitor.right - miex.rcMonitor.left);
        int cyLogical = (miex.rcMonitor.bottom - miex.rcMonitor.top);
    
        // 获取监视器物理宽度与高度
        DEVMODE dm;
        dm.dmSize = sizeof(dm);
        dm.dmDriverExtra = 0;
        EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm);
        int cxPhysical = dm.dmPelsWidth;
        int cyPhysical = dm.dmPelsHeight;
    
        // 缩放比例计算  实际上使用任何一个即可
        //double horzScale = ((double)cxPhysical / (double)cxLogical);
        //double vertScale = ((double)cyPhysical / (double)cyLogical);
    
        AppDelegate app(cxPhysical, cyPhysical);
        app.start();
    
    #ifdef USE_WIN32_CONSOLE
        FreeConsole();
    #endif
    
        return 0;
    }

    上面代码里的horzScale或者vertScale去掉注释之后测试正好是我之前设置的“缩放与布局”的值:“125%。

    这样算是实现了win10屏幕分辨率缩放之后也能全屏。

  • 相关阅读:
    富人和穷人的区别(转)
    asp.net主题的几种应用
    asp.net主题的几种应用
    富人和穷人的区别(转)
    SQL SERVER中一些常见性能问题的总结
    SQL SERVER中一些常见性能问题的总结
    Bind和Eval的区别详解
    优酷去广告代码
    使用jquery框架导致js功能失效解决办法
    absolute定位问题
  • 原文地址:https://www.cnblogs.com/JD85/p/12057281.html
Copyright © 2020-2023  润新知