How would I change the Desktop Resolution?
Does anybody know how to change the Desktop resolution from within a program? I need to change it from 32 bits of color to 16 bits of color (or even 8 bits of color).
You could utilize the DEVMODE structure (WIN).
DEVMODE dm;
ZeroMemory(&dm, sizeof(DEVMODE));
dm.dmSize =sizeof(dm);
dm.dmPelsWidth = WindowWidth;
dm.dmPelsHeight = WindowHeight;
dm.dmBitsPerPel = 16; /*<-16 bits per pixel*/
dm.dmFlags = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if(ChangeDisplaySettings(&dm, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
<t>/*Failed to change display mode
}
and to revert the mode after the app has completed...
ChangeDisplaySettings(NULL, 0);
DEVMODE dm;
ZeroMemory(&dm, sizeof(DEVMODE));
dm.dmSize =sizeof(dm);
dm.dmPelsWidth = WindowWidth;
dm.dmPelsHeight = WindowHeight;
dm.dmBitsPerPel = 16; /*<-16 bits per pixel*/
dm.dmFlags = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if(ChangeDisplaySettings(&dm, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
<t>/*Failed to change display mode
}
and to revert the mode after the app has completed...
ChangeDisplaySettings(NULL, 0);
This does beg the question: Why?
If I had an app that changed the desktop settings every time it ran, it'd only get to run once before it was uninstalled.
If I had an app that changed the desktop settings every time it ran, it'd only get to run once before it was uninstalled.
Quote:Original post by mateo
Does anybody know how to change the Desktop resolution from within a program? I need to change it from 32 bits of color to 16 bits of color (or even 8 bits of color).
I remember I wanted to know this as well when I began programming, but a much better method is to use a graphics API, like DirectX or OpenGL. It will require some time to get into, but if you start with the very basic applications (for instance from http://www.codesampler.com) you will soon get into it. If you have any specific questions about the tutorials there, feel free to ask here.
If you use a "normal" fullscreen Windows application with changed desktop resolution/bit deepth, you will mess up the layout of the icons on the users desktop for instance, and that is quite annoying.
Quote:Original post by EnselicNot if you do it properly [wink]
If you use a "normal" fullscreen Windows application with changed desktop resolution/bit deepth, you will mess up the layout of the icons on the users desktop for instance, and that is quite annoying.
My Pong Clone goes into a fullscreen mode, using Windows GDI, and it doesn't mess with the desktop icons when you exit.
Although, I think it might be broken just now. Hrm...
Thanks to everyone for your help, But I'm having no luck yet. Forgot to mention that I'm using Windows XP-SP2 and DirectX9. Any other suggestions?
Evil Steve:
I'm writing a directdraw library, and one of the features is directdraw windowed mode. So I need a way to change the desktop display properties so that the graphics are drawn correctly no matter what resolution is used for the directdraw application. And as you have stated, a way to change it back.
Enselic:
I don't think the Icons will get messed up. I've used the Gen's Sega Genesis emulator and am very sure it changes my desktop resolution from 32-bit to 16-bit, and it does it with no side effects when restoring the original 32-bit desktop resolution.
Evil Steve: Exactly!
Evil Steve:
I'm writing a directdraw library, and one of the features is directdraw windowed mode. So I need a way to change the desktop display properties so that the graphics are drawn correctly no matter what resolution is used for the directdraw application. And as you have stated, a way to change it back.
Enselic:
I don't think the Icons will get messed up. I've used the Gen's Sega Genesis emulator and am very sure it changes my desktop resolution from 32-bit to 16-bit, and it does it with no side effects when restoring the original 32-bit desktop resolution.
Evil Steve: Exactly!
You should probably make your code work around the screen resolution (for at least common resolutions), not change the screen resolution to work around your code. It'd be crazy annoying if a application just changed the resolution on you in windowed mode.
If you were worried about bits per pixel stuff, these links might help (I haven't read em though, they just looked helpful!)
http://www.gamedev.net/reference/articles/article538.asp
http://www.geocities.com/foetsch/locking/locking.htm
If you were worried about bits per pixel stuff, these links might help (I haven't read em though, they just looked helpful!)
http://www.gamedev.net/reference/articles/article538.asp
http://www.geocities.com/foetsch/locking/locking.htm
Well I'm learning OpenGL and I thought this might help, it's from a simple OpenGL example.
Near the top you should notice the width height and bits variables. Hope this helps :)
John
// the main windows entry pointint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ WNDCLASSEX windowClass; // window class HWND hwnd; // window handle MSG msg; // message bool done; // flag saying when our app is complete DWORD dwExstyle; // Window Extended style DWORD dwstyle; // Window style RECT windowRect; // temp var's int width = 800; int height = 600; int bits = 32; //fullScreen = TRUE; windowRect.left=(long)0; // Set Left Value To 0 windowRect.right=(long)width; // Set Right Value To Requested Width windowRect.top=(long)0; // Set Top Value To 0 windowRect.bottom=(long)height; // Set Bottom Value To Requested Height // fill out the window class structure windowClass.cbSize = sizeof(WNDCLASSEX); windowClass.style = CS_HREDRAW | CS_VREDRAW; windowClass.lpfnWndProc = WndProc; windowClass.cbClsExtra = 0; windowClass.cbWndExtra = 0; windowClass.hInstance = hInstance; windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // default icon windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // default arrow windowClass.hbrBackground = NULL; // don't need background windowClass.lpszMenuName = NULL; // no menu windowClass.lpszClassName = "MyClass"; windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // windows logo small icon // register the windows class if (!RegisterClassEx(&windowClass)) return 0; if (fullScreen) // fullscreen? { DEVMODE dmScreenSettings; // device mode memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); dmScreenSettings.dmSize = sizeof(dmScreenSettings); dmScreenSettings.dmPelsWidth = width; // screen width dmScreenSettings.dmPelsHeight = height; // screen height dmScreenSettings.dmBitsPerPel = bits; // bits per pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { // setting display mode failed, switch to windowed MessageBox(NULL, "Display mode failed", NULL, MB_OK); fullScreen=FALSE; } } if (fullScreen) // Are We Still In Fullscreen Mode? { dwExstyle=WS_EX_APPWINDOW; // Window Extended style dwstyle=WS_POPUP; // Windows style ShowCursor(FALSE); // Hide Mouse Pointer } else { dwExstyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended style dwstyle=WS_OVERLAPPEDWINDOW; // Windows style } AdjustWindowRectEx(&windowRect, dwstyle, FALSE, dwExstyle); // Adjust Window To True Requested Size // class registered, so now create our window hwnd = CreateWindowEx(NULL, // extended style "MyClass", // class name "OpenGL Robot", // app name dwstyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, // x,y coordinate windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, // width, height NULL, // handle to parent NULL, // handle to menu hInstance, // application instance NULL); // no extra params // check if window creation failed (hwnd would equal NULL) if (!hwnd) return 0; ShowWindow(hwnd, SW_SHOW); // display the window UpdateWindow(hwnd); // update the window done = false; // intialize the loop condition variable // main message loop while (!done) { PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE); if (msg.message == WM_QUIT) // do we receive a WM_QUIT message? { done = true; // if so, time to quit the application } else { Render(); TranslateMessage(&msg); // translate and dispatch to event queue DispatchMessage(&msg); } } if (fullScreen) { ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop ShowCursor(TRUE); // Show Mouse Pointer } return msg.wParam;}
Near the top you should notice the width height and bits variables. Hope this helps :)
John
Quote:Original post by Evil Steve
Not if you do it properly [wink]
My Pong Clone goes into a fullscreen mode, using Windows GDI, and it doesn't mess with the desktop icons when you exit.
Quote:Original post by mateo
I don't think the Icons will get messed up. I've used the Gen's Sega Genesis emulator and am very sure it changes my desktop resolution from 32-bit to 16-bit, and it does it with no side effects when restoring the original 32-bit desktop resolution.
Before we go on here, I think I should define 'mess up' :^)
Consider a desktop resolution at 1024x768 with the Recycle Bin at the bottom-right. Now run a game that changes the desktop1 resolution to 800x600. The Recycle bin will be moved to the bottom right of the 800x600 screen to remain reachable. However, when the game resets the resolution to 1024x768, the Recycle Bin remains where it is, i.e. it is moved from where it was before the game was started. That's what I call a 'mess up'.
I haven't experienced the problem in a while though, so it might be fixed, but I doubt it has, since when I manually set the res to 800x600, and then press 'No' in the 'Do you see this?'-dialog causing it to reset to 1024x768, it messes up the icons.
1mateo: the Gen's Sega Genesis emulator probably doesn't change the desktop resolution when it is in fullscreen, it probably rather controls the GPU directly by using some graphics API.
Quote:I haven't experienced the problem in a while though, so it might be fixed, but I doubt it has, since when I manually set the res to 800x600, and then press 'No' in the 'Do you see this?'-dialog causing it to reset to 1024x768, it messes up the icons.
AFAIK (I'm not certain though) no erroneuos placing of the desktop icons will occur if they are not drawn while the lower resolution is set. I might be totally wrong, but I think that is the usual behaviour nowadays.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement