[deploy] fix fullscreen mode bugs

This commit is contained in:
Nomango 2020-04-14 17:52:38 +08:00
parent 1cef30e7f5
commit 5a3feb7e51
1 changed files with 43 additions and 14 deletions

View File

@ -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);
}
} }
} }