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 :).


Anmelden zum Antworten