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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM