Nanashi-softプログラマ専用Windows gcc SDL


◇Windowsでgcc+SDL -ウィンドウ表示をちゃんとする-

現在の画面に合わせてウィンドウ表示を行わないと、画面からはみ出たり、色がグチャッとなったりします
ちゃんと調べてから SDL_SetVideoModeを行いましょう

とは言え、SDLにはウィンドウを制御する為の APIが用意されていません
そこで、Windows APIを用いて外から制御を行ってみます

○現在の画面状況を取得する

・画面サイズを取得する
表示しているディスプレイのサイズです

  HDC hDC= GetDC(GetDesktopWindow());
  int w= GetDeviceCaps(hDC, HORZRES);
  int h= GetDeviceCaps(hDC, VERTRES);
  ReleaseDC(GetDesktopWindow(),hDC);
  printf("w=%d,h=%d\n",w,h);

デスクトップのハンドルを取得して、デバイス情報を取得します
……って、WinAPIの説明は他でいくらでもされているので不要ですね(^^;

・デスクトップサイズを取得する
タスクバーを除いたサイズです

  RECT rect;
  SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
  printf("left=%d,top=%d,right=%d,bottom=%d\n",rect.left,rect.top,rect.right,rect.bottom);

タスクバーの位置は、上下左右のどこにでも置けます
leftが 0で無ければ左に、topが 0で無ければ上に、
rightが画面サイズよりも小さければ右に、bottomが画面サイズよりも小さければ下に、
あると言うことがわかるので、それを見てウィンドウの出し方を制御します
SDLではウィンドウ位置までは制御できないようなので、やりたければそれも WinAPIで行う事になるでしょう

これらウィンドウズ用 API関数を使用した場合は、ヘッダーが必要です
#include <windows.h>
ビルド時のオプションは触る必要は無いようです

○現在の画面色を取得する

パソコンは普通32bitか16bitで画面表示が行われています
この違いを把握しておく事は非常に重要で、適当にやると色がおかしくなるパソコンが出てきます

・画面色を取得する
これはSDLで行う事ができます

  const SDL_VideoInfo *vinfo;
  vinfo= SDL_GetVideoInfo();
  int bits= vinfo->vfmt->BitsPerPixel;
  printf("BitsPerPixel=%d\n", bits);

この値が32bitの場合は 32、16bitの場合は 16になります

○ウィンドウ表示する

これらのデータからウィンドウ表示を行います
例えば720p表示を行う場合

  #define cSystemWidth  1280
  #define cSystemHeight 720

  if (cSystemWidth < w || cSystemHeight < h){
    //現在の画面では表示しきれないので終了する
    SDL_Quit();
    return -1;
  }

  //色深度を合わせて実画面サーフェスを生成
  SDL_Surface *screen= SDL_SetVideoMode(1280,720,bits,SDL_SWSURFACE);
  if(screen == NULL){
    SDL_Quit();
    return -1;
  }

  //SDLにウィンドウ位置を調整する機能が見当たらないので、調整したい時はWinApiを使う
  //例えばアクティブウィンドウのハンドルを取得して左上隅に移動する例
  HWND hWnd= GetActiveWindow();
  SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE);

実際には画面からハミ出ても表示できるので、とりあえずそのまま動かしておいた方がいい
それでもいいという人は遊ぶので(*'-')
縮小表示できれば尚親切でしょう


TOPプログラマ専用Windows gcc SDL