Jump to content
Sign in to follow this  
  • entries
    94
  • comments
    127
  • views
    83576

EnumResolutions (Windows)

Sign in to follow this  
Seriema

269 views

[edit:] updated source 8/8-05

So friendly EDI from Etheral Darkness Interactive (a.k.a. Edi Did It) asked me if I could make an enumerator for resolutions, since on my little lappy I get repeated resolutions (like 4 "different" 800x600 where two is 16bpp and two is 32bpp) and we were both curious on why since repeated resolutions are filtered.

After playing around with CreateFile/WriteFile for an hour, I gave up and returned to good old std::ofstream for outputing the data. And after another hour I gave up on trying to find out why I have two 16bpp and two 32bpp - and no they don't have different refresh rates, the refresh rate and display flags are the same for those. This data wouldn't be used anyway...

So basicly, I had these requirements:

  • Find the resolutions, in the form: Width, Height, Bits per pixel.

  • Sort them in a user expected way.


To solve the first requirement I used EnumDisplaySettings as EDI had suggested.
To solve the second requirement I used a std::set of resolution structs, providing my own compare by overloading operator <. Note: I chose not to make it a member so i could construct it using a initialization list. Saves number of keys I have to press to write the code and makes the struct a simple variable holder :P

Well I did it, might as well share =)
Sharing is love


#define VC_EXTRALEAN
#include
#include
#include
#include
#include
#include

struct Resolution
{
int width, height, bpp;
};

std::ostream& operator << ( std::ostream& out, const Resolution& res )
{
const char tab = 'x';
out << res.width << tab << res.height << tab << res.bpp;
return out;
}

bool operator < ( const Resolution& lhs, const Resolution& rhs )
{
if( lhs.width < rhs.width )
return true;
else
if( lhs.width == rhs.width )
return lhs.bpp < rhs.bpp;

return false;
}


typedef std::set ResolutionHolder;


ResolutionHolder FindResolutions()
{
DEVMODE devmode;
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
DWORD modeNum = 0;

ResolutionHolder result;

while( EnumDisplaySettings( NULL, modeNum++, &devmode ) != 0 )
{
Resolution res = { devmode.dmPelsWidth, devmode.dmPelsHeight, devmode.dmBitsPerPel };
result.insert( res );
}

return result;
}


int APIENTRY WinMain(HINSTANCE /*hInstance*/,
HINSTANCE /*hPrevInstance*/,
LPTSTR /*lpCmdLine*/,
int /*nCmdShow*/)
{
ResolutionHolder resolutions = FindResolutions();
/* Here you have 'resolutions' full of sorted resolutions! =D */

// output for your pleasure
std::ofstream file("resolutions.txt");
const char* tab = " ";
file << "Width" << tab << "Height" << tab << "BPP" << std::endl;
std::copy( resolutions.begin(), resolutions.end(), std::ostream_iterator(file, "\n") );

return 0;
}

Sign in to follow this  


4 Comments


Recommended Comments

Quote:

DigitalDelusion
Did you check if the duplicates reference the same device? Im suspecting that they don't. Just a hunch.


Actually no, I saw this in MSDN so:

Quote:

EnumDisplaySettings
...
lpszDeviceName
[in] Pointer to a null-terminated string that specifies the display device about whose graphics mode the function will obtain information.
This parameter is either NULL or a DISPLAY_DEVICE.DeviceName returned from EnumDisplayDevices. A NULL value specifies the current display device on the computer on which the calling thread is running.


So I thought, NULL will give me the current display device which was exactly what I wanted. But then again, I didn't check if this was somehow incorrect because it would explain why I have multiple resolutions!

Quote:

DigitalDelusion
oh, btw, you do realize that you print:
Quote:

Width Width BPP

as file header :p


Yes, it's a feature!

Share this comment


Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!