[deploy] fix fullscreen mode bugs
This commit is contained in:
parent
1cef30e7f5
commit
5a3feb7e51
|
|
@ -109,8 +109,8 @@ MONITORINFOEXA GetMoniterInfoEx(HWND hwnd)
|
||||||
HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
|
HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
|
||||||
MONITORINFOEXA monitor_info;
|
MONITORINFOEXA monitor_info;
|
||||||
|
|
||||||
memset(&monitor_info, 0, sizeof(MONITORINFOEXA));
|
memset(&monitor_info, 0, sizeof(monitor_info));
|
||||||
monitor_info.cbSize = sizeof(MONITORINFOEXA);
|
monitor_info.cbSize = sizeof(monitor_info);
|
||||||
::GetMonitorInfoA(monitor, &monitor_info);
|
::GetMonitorInfoA(monitor, &monitor_info);
|
||||||
|
|
||||||
return monitor_info;
|
return monitor_info;
|
||||||
|
|
@ -141,19 +141,25 @@ void ChangeFullScreenResolution(uint32_t width, uint32_t height, const CHAR* dev
|
||||||
DEVMODEA mode;
|
DEVMODEA mode;
|
||||||
|
|
||||||
memset(&mode, 0, sizeof(mode));
|
memset(&mode, 0, sizeof(mode));
|
||||||
mode.dmSize = sizeof(DEVMODEA);
|
mode.dmSize = sizeof(mode);
|
||||||
mode.dmBitsPerPel = ::GetDeviceCaps(::GetDC(0), BITSPIXEL);
|
|
||||||
mode.dmPelsWidth = width;
|
mode.dmPelsWidth = width;
|
||||||
mode.dmPelsHeight = height;
|
mode.dmPelsHeight = height;
|
||||||
mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
|
mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
|
||||||
|
|
||||||
if (::ChangeDisplaySettingsExA(device_name, &mode, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL)
|
LONG ret = ::ChangeDisplaySettingsExA(device_name, &mode, NULL, CDS_FULLSCREEN, NULL);
|
||||||
KGE_ERROR("ChangeDisplaySettings failed");
|
if (ret != DISP_CHANGE_SUCCESSFUL)
|
||||||
|
{
|
||||||
|
KGE_ERROR("ChangeDisplaySettings failed with error code %d", ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RestoreResolution(const CHAR* device_name)
|
void RestoreResolution(const CHAR* device_name)
|
||||||
{
|
{
|
||||||
::ChangeDisplaySettingsExA(device_name, NULL, NULL, 0, NULL);
|
LONG ret = ::ChangeDisplaySettingsExA(device_name, NULL, NULL, 0, NULL);
|
||||||
|
if (ret != DISP_CHANGE_SUCCESSFUL)
|
||||||
|
{
|
||||||
|
KGE_ERROR("ChangeDisplaySettings failed with error code %d", ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
@ -337,14 +343,37 @@ void WindowWin32Impl::SetIcon(uint32_t icon_resource)
|
||||||
|
|
||||||
void WindowWin32Impl::Resize(uint32_t width, uint32_t height)
|
void WindowWin32Impl::Resize(uint32_t width, uint32_t height)
|
||||||
{
|
{
|
||||||
if (handle_ && !is_fullscreen_)
|
if (handle_)
|
||||||
{
|
{
|
||||||
RECT rc = { 0, 0, LONG(width), LONG(height) };
|
if (!is_fullscreen_)
|
||||||
::AdjustWindowRect(&rc, GetStyle(), false);
|
{
|
||||||
|
MONITORINFOEXA info = GetMoniterInfoEx(handle_);
|
||||||
|
|
||||||
width = rc.right - rc.left;
|
uint32_t screenw = uint32_t(info.rcWork.right - info.rcWork.left);
|
||||||
height = rc.bottom - rc.top;
|
uint32_t screenh = uint32_t(info.rcWork.bottom - info.rcWork.top);
|
||||||
::SetWindowPos(handle_, 0, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
|
|
||||||
|
RECT rc = { 0, 0, LONG(width), LONG(height) };
|
||||||
|
::AdjustWindowRect(&rc, GetStyle(), false);
|
||||||
|
|
||||||
|
width = rc.right - rc.left;
|
||||||
|
height = rc.bottom - rc.top;
|
||||||
|
|
||||||
|
int left = screenw > width ? ((screenw - width) / 2) : 0;
|
||||||
|
int top = screenh > height ? ((screenh - height) / 2) : 0;
|
||||||
|
|
||||||
|
::SetWindowPos(handle_, 0, left, top, width, height, SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// move window to (0, 0) before display switch
|
||||||
|
::SetWindowPos(handle_, HWND_TOPMOST, 0, 0, width, height, SWP_NOACTIVATE);
|
||||||
|
|
||||||
|
ChangeFullScreenResolution(width, height, device_name_.c_str());
|
||||||
|
|
||||||
|
MONITORINFOEXA info = GetMoniterInfoEx(handle_);
|
||||||
|
::SetWindowPos(handle_, HWND_TOPMOST, info.rcMonitor.top, info.rcMonitor.left, width, height,
|
||||||
|
SWP_NOACTIVATE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue