2016-10-01 10 views
2

С SDL2 мне удается получить разрешения и позиции моих дисплеев очень хорошо, используя SDL_GetCurrentDisplayMode() и SDL_GetDisplayBounds(), однако, когда я изменяю разрешение снаружи (в данном случае с панелью управления Windows 7) или соответствующее положение дисплеев и вызовите эти две функции снова, я получаю те же старые значения, а не новые разрешения и позиции. Это до тех пор, пока я, конечно, не перезапущу свою программу.Получите обновленное разрешение экрана в SDL2

Я полагаю, что SDL не обновляет их. Что мне нужно сделать, чтобы обновить значения без перезапуска программы?

ответ

0

AFAIK невозможно с помощью SDL получить обновленные разрешения (кто-нибудь, пожалуйста, исправьте меня, если я ошибаюсь).

Способ, которым вы могли бы приблизиться к этому, использует API вашей ОС. В вашем случае вы говорили, что используете Windows. Поэтому вы можете использовать API Windows для получения обновленной информации о разрешении. Это явно не переносимо для других ОС - так что вам нужно будет сделать это для каждой ОС, которую вы хотите поддерживать.

В нижней части моего ответа я привел минимальный пример, который показывает, как вы можете получить разрешение основного дисплея в C++. Если вы хотите более тщательно обрабатывать несколько мониторов и их относительные позиции и т. Д., Вы должны взглянуть на this question.

#include "wtypes.h" 
#include <SDL.h> 
#include <iostream> 
using namespace std; 

void GetDesktopResolution(int& w, int& h) 
{ 
    RECT r; 
    GetWindowRect(GetDesktopWindow(), &r); 
    w = r.right; 
    h = r.bottom; 
} 


int main(int argc, char *argv[]) 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    SDL_Window* window = SDL_CreateWindow("SDL", 0, 0, 640, 480, SDL_WINDOW_RESIZABLE); 

    bool running = true; 
    while(running) { 
     SDL_Event game_event; 
     if(SDL_PollEvent(&game_event)) { 
     switch(game_event.type) { 
      case SDL_QUIT: 
       running = false; 
       break; 
     } 
     } 

     SDL_DisplayMode current; 
     SDL_GetCurrentDisplayMode(0, &current); 
     cout << "SDL" << current.w << "," << current.h << '\n'; 

     int w, h; 
     GetDesktopResolution(w, h); 
     cout << "winapi" << w << "," << h << '\n'; 
    } 

    SDL_DestroyWindow(window); 
    SDL_Quit(); 

    return 0; 
}