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屏幕分辨率缩放之后也能全屏。

posted @ 2019-12-17 22:30  居家懒人  阅读(1358)  评论(0编辑  收藏  举报