Okay, the following worked without deleting/creating the windows.
I have no idea what I am doing but it at least proves the setwindowlong approach can work.
Thanks for the idea, skynet.
void GLApp::initFullScreen() {
mClientWidth = mOrigClientW; // = 800
mClientHeight = mOrigClientH; // = 600;
DEVMODE dmScreenSettings;
memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
dmScreenSettings.dmSize = sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = mOrigClientW;
dmScreenSettings.dmPelsHeight = mOrigClientH;
dmScreenSettings.dmBitsPerPel = 32;
dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
LONG dwExStyle = GetWindowLong(mhMainWnd, GWL_EXSTYLE);
LONG dwStyle = GetWindowLong(mhMainWnd, GWL_STYLE);
dwExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
dwStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
SetWindowLong(mhMainWnd,
GWL_EXSTYLE,
dwExStyle);
SetWindowLong(mhMainWnd,
GWL_STYLE,
dwStyle);
SetWindowPos(mhMainWnd,
0,
0, 0,
mOrigClientW, mOrigClientH,
SWP_NOZORDER | SWP_FRAMECHANGED);
}
void GLApp::closeFullScreen() {
ChangeDisplaySettings(NULL, 0);
ShowCursor(TRUE);
LONG dwExStyle = GetWindowLong(mhMainWnd, GWL_EXSTYLE);
LONG dwStyle = GetWindowLong(mhMainWnd, GWL_STYLE);
/* dwExStyle |= (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
dwStyle |= (WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
*/
dwExStyle |= WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle |= WS_OVERLAPPEDWINDOW;
SetWindowLong(mhMainWnd,
GWL_EXSTYLE,
dwExStyle);
SetWindowLong(mhMainWnd,
GWL_STYLE,
dwStyle);
SetWindowPos(mhMainWnd,
HWND_TOP,
0, 0,
mOrigClientW, mOrigClientH,
SWP_FRAMECHANGED);
}