在SDL2中获取更新的屏幕分辨率

时间:2016-10-01 18:41:36

标签: sdl sdl-2

使用SDL2,我设法使用SDL_GetCurrentDisplayMode()SDL_GetDisplayBounds()很好地获取显示器的分辨率和位置,但是当我在外部更改分辨率时(在这种情况下使用Windows 7控制面板)或者显示器的相应位置并再次调用这两个功能我得到相同的旧值,而不是新的分辨率和位置。那是在我重新开始我的程序之前。

我认为SDL不会更新这些内容。如何在不重新启动程序的情况下获取更新值需要做什么?

1 个答案:

答案 0 :(得分:0)

AFAIK SDL无法获得更新的分辨率(如果我错了,请任何人纠正我。)

您可以采用的方法是使用您的操作系统API。在你的情况下,你说你正在使用Windows。因此,您可以继续使用Windows API来检索更新的解决方案信息。这显然无法移植到其他操作系统 - 因此您必须为要支持的每个操作系统执行此操作。

我在答案的底部添加了一个最小的示例,它显示了如何在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;
}