Выбрать главу

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, –1.0f, 1.0f);

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, –1.0f, 1.0f);

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, –1.0f, –1.0f);

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, –1.0f, –1.0f);

  // Right Face

  glNormal3f( 1.0f, 0.0f, 0.0f);

  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, –1.0f, –1.0f);

  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, –1.0f);

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, –1.0f, 1.0f);

  // Left Face

  glNormal3f(-1.0f, 0.0f, 0.0f);

  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, –1.0f, –1.0f);

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, –1.0f, 1.0f);

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, –1.0f);

 glEnd();

 xrot+=0.3f;

 yrot+=0.2f;

 zrot+=0.4f;

}

The KillGLWindow() code has a few changes. You'll notice the code to switch from fullscreen mode back to your desktop is now at the top of KillGLWindow(). If the user ran the program in fullscreen mode, the first thing we do when we kill the window is try to switch back to the desktop resolution. If the quick way fails to work, we reset the screen using the information stored in DMsaved. This should restore us to our orignal desktop settings.

GLvoid KillGLWindow(GLvoid) // Properly Kill The Window

{

 if (fullscreen) // Are We In Fullscreen Mode?

 {

  if (!ChangeDisplaySettings(NULL, CDS_TEST)) { // If The Shortcut Doesn't Work

   ChangeDisplaySettings(NULL, CDS_RESET); // Do It Anyway (To Get The Values Out Of The Registry)

   ChangeDisplaySettings(&DMsaved, CDS_RESET); // Change Resolution To The Saved Settings

  } else // Not Fullscreen

  {

   ChangeDisplaySettings(NULL,CDS_RESET); // Do Nothing

  }

  ShowCursor(TRUE); // Show Mouse Pointer

 }

 if (hRC) // Do We Have A Rendering Context?

 {

  if (!wglMakeCurrent(NULL, NULL)) // Are We Able To Release The DC And RC Contexts?

  {

   MessageBox(NULL, "Release Of DC And RC Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  }

  if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?

  {

   MessageBox(NULL, "Release Rendering Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  }

  hRC=NULL; // Set RC To NULL

 }

 if (hDC && !ReleaseDC(hWnd,hDC)) // Are We Able To Release The DC

 {

  MessageBox(NULL, "Release Device Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  hDC=NULL; // Set DC To NULL

 }

 if (hWnd && !DestroyWindow(hWnd)) // Are We Able To Destroy The Window?

 {

  MessageBox(NULL, "Could Not Release hWnd.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  hWnd=NULL; // Set hWnd To NULL

 }

 if (!UnregisterClass("OpenGL", hInstance)) // Are We Able To Unregister Class

 {

  MessageBox(NULL, "Could Not Unregister Class.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  hInstance=NULL; // Set hInstance To NULL

 }

}

I've made some changes in CreateGLWindow. The changes will hopefully elimintate alot of the problems people are having when they switch to and from from fullscreen mode. I've included the first part of CreateGLWindow() so you can easily follow through the code.

BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) {

 GLuint PixelFormat; // Holds The Results After Searching For A Match

 WNDCLASS wc; // Windows Class Structure

 DWORD dwExStyle; // Window Extended Style

 DWORD dwStyle; // Window Style

 fullscreen=fullscreenflag; // Set The Global Fullscreen Flag

 hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window

 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window.

 wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages

 wc.cbClsExtra = 0; // No Extra Window Data

 wc.cbWndExtra = 0; // No Extra Window Data

 wc.hInstance = hInstance; // Set The Instance

 wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Load The Default Icon

 wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer

 wc.hbrBackground = NULL; // No Background Required For GL

 wc.lpszMenuName = NULL; // We Don't Want A Menu

 wc.lpszClassName = "OpenGL"; // Set The Class Name

The big change here is that we now save the current desktop resolution, bit depth, etc. before we switch to fullscreen mode. That way when we exit the program, we can set everything back exactly how it was. The first line below copies the display settings into the DMsaved Device Mode structure. Nothing else has changed, just one new line of code.

 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DMsaved); // Save The Current Display State (NEW)

 if (fullscreen) // Attempt Fullscreen Mode?

 {

  DEVMODE dmScreenSettings; // Device Mode

  memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared

  dmScreenSettings.dmSize = sizeof(dmScreenSettings); // Size Of The Devmode Structure

  dmScreenSettings.dmPelsWidth = width; // Selected Screen Width

  dmScreenSettings.dmPelsHeight = height; // Selected Screen Height

  dmScreenSettings.dmBitsPerPel = bits; // Selected Bits Per Pixel

  dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

  // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.

  if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) {

   // If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode.

   if (MessageBox(NULL, "The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?", "NeHe GL", MB_YESNO|MB_ICONEXCLAMATION) == IDYES) {

   fullscreen=FALSE; // Windowed Mode Selected. Fullscreen = FALSE

  } else {

   // Pop Up A Message Box Letting User Know The Program Is Closing.

   MessageBox(NULL, "Program Will Now Close.", "ERROR", MB_OK|MB_ICONSTOP);

   return FALSE; // Return FALSE

  }

 }

}

WinMain() starts out the same as always. Ask the user if they want fullscreen or not, then start the loop.