This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.


  Enumerating Display Settings
  Submitted by

In attempt to learn how to enumerate all display modes for my OpenGL project, I've created this litte program to do it. It tests all of the enumerated modes to the console. I hope this helps you get started with some display setup apps (not to h4x0rz, but mere mortals :))

Download Associated File: glmodes.cpp (3,714 bytes)

// Display_Settings
// by Teodor Tomic aka ch!ckuaua, February 9., 2003.
// This program enums and tests display settings for the current display 
// and prints them out to the console

#include <windows.h>
#include <stdio.h>
#include <string.h>

int main ( void ) { DEVMODE dm; // The structure needed to hold the settings data int i=0; // Index value that specifies the graphics mode for // which information is to be obtained. LONG result; // Holds the ChangeDisplaySettings() result

////////////////////////////////////////////////////////////////////////// // Takeout from the Win32 SDK: /* BOOL EnumDisplaySettings( LPCTSTR lpszDeviceName, // specifies the display device DWORD iModeNum, // specifies the graphics mode LPDEVMODE lpDevMode // points to structure to receive settings ); lpszDeviceName Windows 95: lpszDeviceName must be NULL.

iModeNum Graphics mode indexes start at zero. To obtain information for all of a display device's graphics modes, make a series of calls to EnumDisplaySettings, as follows: Set iModeNum to zero for the first call, and increment iModeNum by one for each subsequent call. Continue calling the function until the return value is FALSE.

When you call EnumDisplaySettings with iModeNum set to zero, the operating system initializes and caches information about the display device. When you call EnumDisplaySettings with iModeNum set to a non-zero value, the function returns the information that was cached the last time the function was called with iModeNum set to zero.

... lpDevMode The EnumDisplaySettings function sets values for the following five DEVMODE members:

dmBitsPerPel dmPelsWidth dmPelsHeight dmDisplayFlags dmDisplayFrequency */
i = 0; while ( EnumDisplaySettings(NULL,i++, &dm ) ) { ////////////////////////////////////////////////////////////////////////// // Print out some information // printf ( "%s v%d.%d > %dx%dx%d @ %dHz ... ", dm.dmDeviceName, // Device name LOBYTE(dm.dmDriverVersion), // Major driver version HIBYTE(dm.dmDriverVersion), // Minor driver version dm.dmPelsWidth, // X size dm.dmPelsHeight, // Y size dm.dmBitsPerPel, // Bpp dm.dmDisplayFrequency ); // Frequency ////////////////////////////////////////////////////////////////////////// // Test the display settings ////////////////////////////////////////////////////////////////////////// // Test if the enumered mode can be set and parse the result. // I think it's a good idea to do this when creating a window so you can // be sure of its success %) // result = ChangeDisplaySettings ( &dm, CDS_TEST ); switch ( result ) { case DISP_CHANGE_SUCCESSFUL: // Success printf ( "OK\n" ); break; case DISP_CHANGE_FAILED: // Failure printf ( "Failed\n" ); break;

case DISP_CHANGE_BADMODE: // Bad mode printf ( "Bad mode\n" ); break;

case DISP_CHANGE_BADFLAGS: // The flags are bad printf ( "Bad flags\n" ); break;

case DISP_CHANGE_RESTART: // Restart is required printf ( "Restart required\n" ); break; } }

////////////////////////////////////////////////////////////////////////// // For saving/loading display settings, I suggest saving the whole // DEVMODE structure to a file: // // if ( fwrite ( &dm, 1, sizeof(DEVMODE), f_out ) != sizeof(DEVMODE) ) // return FALSE; // Failed :( ////////////////////////////////////////////////////////////////////////// return 0; // %) }

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.


Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.