SDL2 переключает состояние SDL_WINDOW_RESIZABLE для поддельного полноэкранного режима

Чтобы сделать «поддельное» полноэкранное окно в SDL2 без набора режимов, вы можете создать развернутое окно без полей, используя что-то вроде этого.

int idx = SDL_GetWindowDisplayIndex(g_displayWindow);
SDL_Rect bounds;
SDL_GetDisplayBounds(idx, &bounds);
//SDL_SetWindowResizable(g_displayWindow, SDL_FALSE);
SDL_SetWindowBordered(g_displayWindow, SDL_FALSE);
SDL_SetWindowPosition(g_displayWindow, bounds.x, bounds.y);
SDL_SetWindowSize(g_displayWindow, bounds.w, bounds.h);

Для неизменяемых окон это работает отлично. В окнах, созданных с помощью SDL_WINDOW_RESIZABLE, есть раздражающая серая рамка по нижнему и правому краям экрана (на окнах). К сожалению, нет функции SDL_SetWindowResizable (начиная с SDL 2.0.4). Как мы можем избавиться от границы изменения размера без воссоздания окна?

И SDL_WINDOW_FULLSCREEN_DESKTOP, и SDL_WINDOW_FULLSCREEN выполняют набор модов, которого я хочу избежать — это занимает больше времени, труднее выйти из него с помощью Alt-Tab, и если игра достигает точки останова в отладчике, она может заблокировать всю систему.


person manylegged    schedule 24.11.2014    source источник
comment
SDL_WINDOW_FULLSCREEN_DESKTOP не должен вызывать полное переключение режима отображения, как это делает SDL_WINDOW_FULLSCREEN. Они ведут себя одинаково для вас? Он предназначен именно для таких ситуаций, когда вам нужно неукрашенное окно, которое заполняет весь экран, и вы хотите сделать это кроссплатформенным способом.   -  person Jonny D    schedule 04.12.2014
comment
Я сделал SDL_WINDOW_FULLSCREEN_DESKTOP. Кажется, он не переключает режим отображения. Но он блокируется при прерывании отладчика (в системе с одним экраном). Однако установка окна на полный размер дисплея имела такое же поведение. Можно вернуться к VS, заснув и разбудив ноутбук. :-/   -  person david van brink    schedule 17.02.2016
comment
Это никогда не должно блокировать систему, ctrl+alt+delete всегда может вывести вас, если сама программа не работает должным образом.   -  person Nicholas Pipitone    schedule 20.03.2020


Ответы (1)


Это то, что я придумал - проверено и работает на окнах.

void SDL_SetWindowResizable(SDL_Window *win, SDL_bool resizable)
{
    SDL_SysWMinfo info;
    SDL_VERSION(&info.version);
    SDL_GetWindowWMInfo(g_displayWindow, &info);

#if WIN32
    HWND hwnd = info.info.win.window;
    DWORD style = GetWindowLong(hwnd, GWL_STYLE);
    if (resizable)
        style |= WS_THICKFRAME;
    else
        style &= ~WS_THICKFRAME;
    SetWindowLong(hwnd, GWL_STYLE, style);
#endif
}
person manylegged    schedule 24.11.2014