ChangeDisplaySettings schlägt fehl
-
Folgender Code:
bool NLWindowWin32::createWindow( const NLWindowSettings& settings ) { m_settings = settings; WNDCLASSEX wc; memset(&wc, 0, sizeof(wc)); m_dwStyle = WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; // Different Style for Fullscreen if ( m_settings.fullscreen ) { m_dwStyle = WS_POPUP; } if ( m_settings.resizable && !m_settings.fullscreen ) { m_dwStyle = WS_OVERLAPPEDWINDOW; } // Fill WindowClass Structure with needed options wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)NLWindowWin32::sWinProc; wc.hInstance = m_hInstance; wc.hIcon = ::LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = getWindowClassName(); wc.hIconSm = ::LoadIcon(NULL, IDI_APPLICATION); // Register it if ( !::RegisterClassEx(&wc) ) { ::MessageBox(HWND_DESKTOP, L"RegisterClass() failed!", L"DXWindow", MB_ICONERROR|MB_OK); return false; } // Let Windows(tm) calculate the window size so our canvas is as big as we want it to have. if (m_settings.fullscreen == false ) { m_wnd_rect.left = 0; m_wnd_rect.right = static_cast<long>(settings.width); m_wnd_rect.bottom = static_cast<long>(settings.height); m_wnd_rect.top = 0; ::AdjustWindowRectEx(&m_wnd_rect, m_dwStyle, FALSE, WS_EX_APPWINDOW); m_real_window_height = (m_wnd_rect.right-m_wnd_rect.left); m_real_window_width = (m_wnd_rect.bottom-m_wnd_rect.top); } else { m_wnd_rect.left = 0; m_wnd_rect.right = static_cast<long>(settings.width); m_wnd_rect.bottom = static_cast<long>(settings.height); m_wnd_rect.top = 0; m_real_window_height = (m_wnd_rect.right-m_wnd_rect.left); m_real_window_width = (m_wnd_rect.bottom-m_wnd_rect.top); } // Create Window m_hwnd = ::CreateWindowEx(WS_EX_APPWINDOW, getWindowClassName(), L"", m_dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 50, 50, m_wnd_rect.right-m_wnd_rect.left, m_wnd_rect.bottom-m_wnd_rect.top, NULL, NULL, m_hInstance, NULL); // Window creation failed for some reason. if ( m_hwnd == NULL ) { ::MessageBox(HWND_DESKTOP, L"CreateWindowEx() failed!", L"NightLight2D", MB_ICONERROR|MB_OK); ::UnregisterClass(getWindowClassName(), m_hInstance); return false; } // Go fullscreen // TODO: This code fails. if ( m_settings.fullscreen ) { DEVMODE dmVideoMode; memset(&dmVideoMode,0,sizeof(dmVideoMode)); dmVideoMode.dmSize = sizeof(dmVideoMode); dmVideoMode.dmPelsWidth = static_cast<DWORD>(m_settings.width); dmVideoMode.dmPelsHeight = static_cast<DWORD>(m_settings.height); dmVideoMode.dmBitsPerPel = m_settings.bpp; dmVideoMode.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; int code = ::ChangeDisplaySettings(&dmVideoMode, CDS_FULLSCREEN); if ( code != DISP_CHANGE_SUCCESSFUL ) { std::basic_string<wchar_t> err = L"ChangeDisplaySettings() failed: "; switch(code) { case DISP_CHANGE_BADDUALVIEW: { err += L"DISP_CHANGE_BADDUALVIEW"; break; } case DISP_CHANGE_BADFLAGS: { err += L"DISP_CHANGE_BADFLAGS"; break; } case DISP_CHANGE_BADMODE: { err += L"DISP_CHANGE_BADMODE"; break; } case DISP_CHANGE_BADPARAM: { err += L"DISP_CHANGE_BADPARAM"; break; } case DISP_CHANGE_FAILED: { err += L"DISP_CHANGE_FAILED"; break; } case DISP_CHANGE_RESTART: { err += L"DISP_CHANGE_RESTART"; break; } } ::MessageBox(HWND_DESKTOP, err.c_str(), L"NightLight2D", MB_ICONERROR|MB_OK); ::UnregisterClass(getWindowClassName(), m_hInstance); ::DestroyWindow((HWND)m_hwnd); m_quitEvent(); return false; } } // Set the userpointer ::SetWindowLongPtr((HWND)m_hwnd, GWL_USERDATA, reinterpret_cast<long>(this)); //Set caption ::SetWindowTextA((HWND)m_hwnd, m_settings.caption.c_str()); // Show Window and bring to the foreground, so it is topmost for now. ::ShowWindow((HWND)m_hwnd, true); ::SetForegroundWindow((HWND)m_hwnd); // Set creation of the window to true m_wasCreated = true; return true; }Das schlägt mit allen Auflösungen fehl, die mein Monitor kann. Es wird das Flag DISP_CHANGE_BADMODE geworfen.
Nur wieso?
-
Scorcher24 schrieb:
Das schlägt mit allen Auflösungen fehl, die mein Monitor kann. Es wird das Flag DISP_CHANGE_BADMODE geworfen.
Nur wieso?Das gleiche Problem hatte ich auch mal. Es lag aber am ATI-Treiber. Verwendest du ebenfalls eine ATI-GraKa? Einige Treiber verlangen bei Bildschirmänderungen einen Neustart - dann wird ebenfalls DISP_CHANGE_BADMODE geworfen.
Und dann gibts es da noch den verflixt versteckten Parameter CDS_UPDATEREGISTRY ... aber lies mal selbst ...

-
Ja, hab eine ATI. Habs aber grade hinbekommen.
Wenn ich das Feld DM_BITSPERPEL weglasse, dann geht es :).