フルスクリーンとウインドウモードの切り替え

GLUT のゲームモードを使用するとフルスクリーンで起動できました。
しかし、ゲームモードを使用するとウインドウモードにする事はできません。
一般的なゲームアプリではフルスクリーンとウインドウモードを何度も切り替え
できるのが普通です。
では具体的にどうするのかというと、GLUT にはそのような機能はありませんので
WindowsAPI を使って実装します。
今回のプログラムはスペースキーを押すとフルスクリーンとウインドウモードを交互に
切り替えます。

 

ファイル
main.cpp

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <GL/freeglut/freeglut.h>

#define WIDTH 640
#define HEIGHT 480
bool Change=false;//切り替えフラグ

void display(void)
{
 glClear(GL_COLOR_BUFFER_BIT);
 glutSwapBuffers();
}
void fullscreen(){
 int nMode = 0;
 DEVMODE devMode;
 HWND hWnd;
 hWnd = GetActiveWindow();
 if(Change){
  glClearColor( 1.0f, 1.0f, 0.0f, 1.0f );
  while( EnumDisplaySettings( NULL, nMode++, &devMode )){
   //640×480をサポートしているか
   if( devMode.dmPelsWidth  != WIDTH || devMode.dmPelsHeight != HEIGHT)continue;
   //32ビットカラーをサポートしているか
   if( devMode.dmBitsPerPel != 32 )continue;
   //テストして切り替えれるなら
   if( ChangeDisplaySettings( &devMode, CDS_TEST ) == DISP_CHANGE_SUCCESSFUL )break;
  }
  ChangeDisplaySettings( &devMode, CDS_FULLSCREEN );
  glutFullScreen();
 }else{
  glClearColor( 0.0f, 1.0f, 0.0f, 1.0f );
  ChangeDisplaySettings(NULL, 0);
  glutPositionWindow(100,100);
  glutReshapeWindow(WIDTH,HEIGHT);
 }
}
void key(unsigned char key , int x , int y) {
 if(key == ' '){//スペースキーでウインドウモードを切り替え
  if(Change == false){Change = true;}else{Change = false;}
  fullscreen();
 }
}
void idle(void)
{
 glutPostRedisplay();
}
int main(int argc, char *argv[])
{
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("スペースキーでフルスクリーンとウインドウモード切替");
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 glutKeyboardFunc(key);
 glClearColor( 0.0f, 1.0f, 0.0f, 1.0f );
 glutMainLoop();
 return 0;
}

 

 

 

 

 

 

 

最終更新:2014年12月21日 18:32
添付ファイル