Win32: Improve error reporting when changing resolution

Nicolas Hake 2012-08-28 00:00:29 +02:00
parent 6a9ebd4717
commit faf0006a6f
4 changed files with 43 additions and 3 deletions

View File

@ -542,6 +542,11 @@ IDS_ERR_CONFREAD=Einstellungen konnten nicht gelesen werden: %s
IDS_ERR_CONFSAVE=Einstellungen konnten nicht gespeichert werden: %s
IDS_ERR_DDRAW=Fehler bei Direct3d oder OpenGL.
IDS_ERR_DELOLDTITLE=Fehler beim Löschen des alten Titels aus Datei "%s": %s
IDS_ERR_DISP_CHANGE_BADFLAGS=Eine ungültige Kombination von Flags wurde an ChangeDisplaySettingsEx übergeben.
IDS_ERR_DISP_CHANGE_BADMODE=Der Modus wird nicht unterstützt.
IDS_ERR_DISP_CHANGE_BADPARAM=Ein ungültiger Parameter wurde an ChangeDisplaySettingsEx übergeben.
IDS_ERR_DISP_CHANGE_FAILED=Der Grafiktreiber konnte den gewünschten Modus nicht anwenden.
IDS_ERR_DISP_CHANGE_RESTART=Der Computer muss zum Anwenden des gewünschten Modus neu gestartet werden.
IDS_ERR_ERRORADDINGNEWTITLEFORFIL=Fehler beim Setzen des Titels in Datei \"%s\": %s
IDS_ERR_ERRORLOADINGROUNDRESULTS=Fehler beim Laden der Spielergebnisse.
IDS_ERR_ERRORSAVINGROUNDRESULTS=Fehler beim Speichern der Spielergebnisse.

View File

@ -541,6 +541,11 @@ IDS_ERR_CONFREAD=Could not read configuration: %s
IDS_ERR_CONFSAVE=Could not save configuration: %s
IDS_ERR_DDRAW=Direct3d or OpenGL failure.
IDS_ERR_DELOLDTITLE=Error deleting old title from file "%s": %s
IDS_ERR_DISP_CHANGE_BADFLAGS=An invalid set of flags was passed to ChangeDisplaySettingsEx.
IDS_ERR_DISP_CHANGE_BADMODE=The graphics mode is not supported.
IDS_ERR_DISP_CHANGE_BADPARAM=An invalid parameter was passed to ChangeDisplaySettingsEx.
IDS_ERR_DISP_CHANGE_FAILED=The graphics driver failed the specified graphics mode.
IDS_ERR_DISP_CHANGE_RESTART=The computer must be restarted for the graphics mode to work.
IDS_ERR_ERRORADDINGNEWTITLEFORFIL=Error adding new title for file \"%s\": %s
IDS_ERR_ERRORLOADINGROUNDRESULTS=Error loading round results.
IDS_ERR_ERRORSAVINGROUNDRESULTS=Error saving round results.

View File

@ -141,6 +141,8 @@ private:
HINSTANCE hInstance;
HANDLE hMainThread; // handle to main thread that initialized the app
void SetLastErrorFromOS();
public:
void SetInstance(HINSTANCE hInst) { hInstance = hInst; }
HINSTANCE GetInstance() const { return hInstance; }

View File

@ -757,6 +757,15 @@ bool C4AbstractApp::FlushMessages()
return MessageProc.Execute(0);
}
void C4AbstractApp::SetLastErrorFromOS()
{
LPWSTR buffer = 0;
DWORD rv = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
0, ::GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&buffer), 0, 0);
sLastError.Take(StdStrBuf(buffer));
LocalFree(buffer);
}
int GLMonitorInfoEnumCount;
static BOOL CALLBACK GLMonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
@ -779,7 +788,11 @@ bool C4AbstractApp::GetIndexedDisplayMode(int32_t iIndex, int32_t *piXRes, int32
if (iMonitor)
Mon.Format("\\\\.\\Display%d", iMonitor+1);
// check if indexed mode exists
if (!EnumDisplaySettingsW(Mon.GetWideChar(), iIndex, &dmode)) return false;
if (!EnumDisplaySettingsW(Mon.GetWideChar(), iIndex, &dmode))
{
SetLastErrorFromOS();
return false;
}
// mode exists; return it
if (piXRes) *piXRes = dmode.dmPelsWidth;
if (piYRes) *piYRes = dmode.dmPelsHeight;
@ -832,7 +845,10 @@ bool C4AbstractApp::SetVideoMode(unsigned int iXRes, unsigned int iYRes, unsigne
// Get current display settings
if (!EnumDisplaySettingsW(Mon.GetWideChar(), ENUM_CURRENT_SETTINGS, &dmode))
{
SetLastErrorFromOS();
return false;
}
int orientation = dmode.dmDisplayOrientation;
// enumerate modes
int i=0;
@ -858,10 +874,22 @@ bool C4AbstractApp::SetVideoMode(unsigned int iXRes, unsigned int iYRes, unsigne
dspMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if (iRefreshRate != 0)
dspMode.dmFields |= DM_DISPLAYFREQUENCY;
if (ChangeDisplaySettingsExW(iMonitor ? Mon.GetWideChar() : NULL, &dspMode, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL)
DWORD rv = ChangeDisplaySettingsExW(iMonitor ? Mon.GetWideChar() : NULL, &dspMode, NULL, CDS_FULLSCREEN, NULL);
if (rv != DISP_CHANGE_SUCCESSFUL)
{
switch (rv)
{
return false;
#define CDSE_ERROR(error) case error: sLastError = LoadResStr("IDS_ERR_" #error); break
CDSE_ERROR(DISP_CHANGE_BADFLAGS);
CDSE_ERROR(DISP_CHANGE_BADMODE);
CDSE_ERROR(DISP_CHANGE_BADPARAM);
CDSE_ERROR(DISP_CHANGE_RESTART);
CDSE_ERROR(DISP_CHANGE_FAILED);
#undef CDSE_ERROR
default: sLastError = LoadResStr("IDS_ERR_FAILURE"); break;
}
return false;
}
SetWindowLong(pWindow->hWindow, GWL_STYLE,
GetWindowLong(pWindow->hWindow, GWL_STYLE) & ~ (WS_CAPTION|WS_THICKFRAME|WS_BORDER));