fix bug: incorrect window size in fullscreen mode
This commit is contained in:
		
							parent
							
								
									ae247dd676
								
							
						
					
					
						commit
						f8cdbe4335
					
				|  | @ -133,7 +133,7 @@ public: | |||
|      * @brief 设置全屏模式 | ||||
|      * @param fullscreen 是否全屏 | ||||
|      */ | ||||
|     virtual void SetFullscreen(bool fullscreen) = 0; | ||||
|     virtual void SetFullscreenState(bool fullscreen) = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * \~chinese | ||||
|  |  | |||
|  | @ -55,7 +55,7 @@ public: | |||
| 
 | ||||
|     void Resize(uint32_t width, uint32_t height) override; | ||||
| 
 | ||||
|     void SetFullscreen(bool fullscreen) override; | ||||
|     void SetFullscreenState(bool fullscreen) override; | ||||
| 
 | ||||
|     void SetCursor(CursorType cursor) override; | ||||
| 
 | ||||
|  | @ -279,7 +279,7 @@ void WindowWin32Impl::Init(const String& title, uint32_t width, uint32_t height, | |||
| 
 | ||||
|     if (is_fullscreen_) | ||||
|     { | ||||
|         SetFullscreen(true); | ||||
|         SetFullscreenState(true); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -316,17 +316,15 @@ void WindowWin32Impl::Resize(uint32_t width, uint32_t height) | |||
|     KGE_ASSERT(handle_); | ||||
|     if (!is_fullscreen_) | ||||
|     { | ||||
|         MONITORINFOEXA info = GetMoniterInfoEx(handle_); | ||||
| 
 | ||||
|         uint32_t screenw = uint32_t(info.rcWork.right - info.rcWork.left); | ||||
|         uint32_t screenh = uint32_t(info.rcWork.bottom - info.rcWork.top); | ||||
| 
 | ||||
|         RECT rc = { 0, 0, LONG(width), LONG(height) }; | ||||
|         ::AdjustWindowRect(&rc, GetStyle(), false); | ||||
| 
 | ||||
|         width  = rc.right - rc.left; | ||||
|         height = rc.bottom - rc.top; | ||||
| 
 | ||||
|         MONITORINFOEXA info    = GetMoniterInfoEx(handle_); | ||||
|         uint32_t       screenw = uint32_t(info.rcWork.right - info.rcWork.left); | ||||
|         uint32_t       screenh = uint32_t(info.rcWork.bottom - info.rcWork.top); | ||||
|         int            left    = screenw > width ? ((screenw - width) / 2) : 0; | ||||
|         int            top     = screenh > height ? ((screenh - height) / 2) : 0; | ||||
| 
 | ||||
|  | @ -339,12 +337,19 @@ void WindowWin32Impl::Resize(uint32_t width, uint32_t height) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| void WindowWin32Impl::SetFullscreen(bool fullscreen) | ||||
| void WindowWin32Impl::SetFullscreenState(bool fullscreen) | ||||
| { | ||||
|     if (is_fullscreen_ != fullscreen) | ||||
|     { | ||||
|         is_fullscreen_ = fullscreen; | ||||
| 
 | ||||
|         // Adjust the rect of client area
 | ||||
|         RECT rc = { 0, 0, LONG(width_), LONG(height_) }; | ||||
|         ::AdjustWindowRect(&rc, GetStyle(), false); | ||||
| 
 | ||||
|         uint32_t width  = uint32_t(rc.right - rc.left); | ||||
|         uint32_t height = uint32_t(rc.bottom - rc.top); | ||||
| 
 | ||||
|         if (is_fullscreen_) | ||||
|         { | ||||
|             // Reset window style
 | ||||
|  | @ -352,17 +357,22 @@ void WindowWin32Impl::SetFullscreen(bool fullscreen) | |||
| 
 | ||||
|             // Top the window
 | ||||
|             MONITORINFOEXA info = GetMoniterInfoEx(handle_); | ||||
|             ::SetWindowPos(handle_, HWND_TOPMOST, info.rcMonitor.top, info.rcMonitor.left, width_, height_, | ||||
|             ::SetWindowPos(handle_, HWND_TOPMOST, info.rcMonitor.top, info.rcMonitor.left, width, height, | ||||
|                            SWP_NOACTIVATE); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             MONITORINFOEXA info    = GetMoniterInfoEx(handle_); | ||||
|             uint32_t       screenw = uint32_t(info.rcWork.right - info.rcWork.left); | ||||
|             uint32_t       screenh = uint32_t(info.rcWork.bottom - info.rcWork.top); | ||||
|             int            left    = screenw > width ? ((screenw - width) / 2) : 0; | ||||
|             int            top     = screenh > height ? ((screenh - height) / 2) : 0; | ||||
| 
 | ||||
|             // Reset window style
 | ||||
|             ::SetWindowLongPtrA(handle_, GWL_STYLE, GetStyle()); | ||||
| 
 | ||||
|             // Unpin the window
 | ||||
|             ::SetWindowPos(handle_, HWND_NOTOPMOST, 0, 0, 0, 0, | ||||
|                            SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE); | ||||
|             ::SetWindowPos(handle_, HWND_NOTOPMOST, left, top, width, height, SWP_DRAWFRAME | SWP_FRAMECHANGED); | ||||
|         } | ||||
| 
 | ||||
|         ::ShowWindow(handle_, SW_SHOWNORMAL); | ||||
|  |  | |||
|  | @ -120,6 +120,12 @@ void RendererImpl::MakeContextForWindow(WindowPtr window) | |||
|     KGE_THROW_IF_FAILED(hr, "Create render resources failed"); | ||||
| } | ||||
| 
 | ||||
| void RendererImpl::SetFullscreenState(bool fullscreen) | ||||
| { | ||||
|     KGE_ASSERT(d3d_res_); | ||||
|     d3d_res_->SetFullscreenState(fullscreen); | ||||
| } | ||||
| 
 | ||||
| void RendererImpl::Destroy() | ||||
| { | ||||
|     KGE_SYS_LOG("Destroying device resources"); | ||||
|  |  | |||
|  | @ -104,6 +104,8 @@ protected: | |||
| 
 | ||||
|     void MakeContextForWindow(WindowPtr window) override; | ||||
| 
 | ||||
|     void SetFullscreenState(bool fullscreen) override; | ||||
| 
 | ||||
|     void Destroy() override; | ||||
| 
 | ||||
| private: | ||||
|  |  | |||
|  | @ -49,6 +49,11 @@ void Renderer::HandleEvent(Event* evt) | |||
|         auto window_evt = dynamic_cast<WindowResizedEvent*>(evt); | ||||
|         Resize(window_evt->width, window_evt->height); | ||||
|     } | ||||
|     else if (evt->IsType<WindowFullscreenEvent>()) | ||||
|     { | ||||
|         auto window_evt = dynamic_cast<WindowFullscreenEvent*>(evt); | ||||
|         SetFullscreenState(window_evt->fullscreen); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Renderer::BeginDraw() | ||||
|  |  | |||
|  | @ -246,6 +246,8 @@ protected: | |||
| 
 | ||||
|     virtual void MakeContextForWindow(WindowPtr window) = 0; | ||||
| 
 | ||||
|     virtual void SetFullscreenState(bool fullscreen) = 0; | ||||
| 
 | ||||
|     virtual void Destroy() = 0; | ||||
| 
 | ||||
| protected: | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue