2014-11-24 236 views
2

要在沒有模式集的情況下在SDL2中執行「假」全屏窗口,可以使用類似的方法創建無邊框,最大化窗口。SDL2切換SDL_WINDOW_RESIZABLE狀態爲假全屏

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都這樣做,我想避免modeset - 它需要更長的時間,這是很難使用Alt-Tab出來的,如果遊戲中的調試器遇到斷點,可以鎖定了整個系統。

+2

SDL_WINDOW_FULLSCREEN_DESKTOP不應該像SDL_WINDOW_FULLSCREEN那樣引起顯示模式的完全切換。他們的行爲是否等同於你?它適用於這種情況,您希望一個未填充的窗口填滿整個屏幕,並且您希望它以跨平臺的方式完成。 – 2014-12-04 20:31:47

+0

我做了SDL_WINDOW_FULLSCREEN_DESKTOP。它似乎沒有做一個顯示模式切換。但它鎖定在調試器中斷(在單屏系統上)。然而,將窗口設置爲完整的顯示大小具有相同的行爲。通過睡覺和喚醒筆記本電腦可以回到VS。 : - / – 2016-02-17 18:40:53

回答

3

這就是我想出來的 - 測試和工作在Windows上。

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 
}