aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/win/Window.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-16 15:43:20 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-16 15:43:20 +0800
commit1ef4651c4002eb3a155bcd36fed1e5b6b63b1c80 (patch)
tree4c5158b3c0149c520cb25e7c89fbdc0f20bd72e5 /src/platform/gui/win/Window.cpp
parentc350346c41cb779413389f26c5c8f4e9bd2a8141 (diff)
downloadcru-1ef4651c4002eb3a155bcd36fed1e5b6b63b1c80.tar.gz
cru-1ef4651c4002eb3a155bcd36fed1e5b6b63b1c80.tar.bz2
cru-1ef4651c4002eb3a155bcd36fed1e5b6b63b1c80.zip
Fix some part of WinWindow.
Diffstat (limited to 'src/platform/gui/win/Window.cpp')
-rw-r--r--src/platform/gui/win/Window.cpp50
1 files changed, 36 insertions, 14 deletions
diff --git a/src/platform/gui/win/Window.cpp b/src/platform/gui/win/Window.cpp
index be834a25..95c840c3 100644
--- a/src/platform/gui/win/Window.cpp
+++ b/src/platform/gui/win/Window.cpp
@@ -21,7 +21,7 @@
namespace cru::platform::gui::win {
namespace {
inline int DipToPixel(const float dip, const float dpi) {
- return static_cast<int>(dip * dpi / 96.0f);
+ return static_cast<int>(std::ceil(dip * dpi / 96.0f));
}
inline float PixelToDip(const int pixel, const float dpi) {
@@ -72,7 +72,10 @@ WinNativeWindow::WinNativeWindow(WinUiApplication* application)
input_method_context_ = std::make_unique<WinInputMethodContext>(this);
}
-WinNativeWindow::~WinNativeWindow() { Close(); }
+WinNativeWindow::~WinNativeWindow() {
+ Close();
+ application_->UnregisterWindow(this);
+}
void WinNativeWindow::Close() {
if (hwnd_) ::DestroyWindow(hwnd_);
@@ -109,11 +112,17 @@ void WinNativeWindow::SetStyleFlag(WindowStyleFlag flag) {
}
}
-void WinNativeWindow::SetVisibility(WindowVisibilityType visibility) {
- if (visibility == visibility_) return;
- visibility_ = visibility;
+WindowVisibilityType WinNativeWindow::GetVisibility() {
+ if (!hwnd_) return WindowVisibilityType::Hide;
+ if (IsIconic(hwnd_)) return WindowVisibilityType::Minimize;
+ return IsWindowVisible(hwnd_) ? WindowVisibilityType::Show
+ : WindowVisibilityType::Hide;
+}
+
+void WinNativeWindow::SetVisibility(WindowVisibilityType visibility) {
if (!hwnd_) {
+ if (visibility == WindowVisibilityType::Hide) return;
RecreateWindow();
}
@@ -129,6 +138,9 @@ void WinNativeWindow::SetVisibility(WindowVisibilityType visibility) {
Size WinNativeWindow::GetClientSize() { return GetClientRect().GetSize(); }
void WinNativeWindow::SetClientSize(const Size& size) {
+ CRU_LOG_TAG_INFO("{} set client size to {}.",
+ static_cast<void*>(GetWindowHandle()), size);
+
client_rect_.SetSize(size);
if (hwnd_) {
@@ -144,14 +156,17 @@ void WinNativeWindow::SetClientSize(const Size& size) {
Rect WinNativeWindow::GetClientRect() { return client_rect_; }
void WinNativeWindow::SetClientRect(const Rect& rect) {
+ CRU_LOG_TAG_INFO("{} set client rect to {}.",
+ static_cast<void*>(GetWindowHandle()), rect);
+
client_rect_ = rect;
if (hwnd_) {
RECT r =
DipToPixel(CalcWindowRectFromClient(client_rect_, style_flag_, dpi_));
- if (!SetWindowPos(hwnd_, nullptr, 0, 0, r.right - r.left, r.bottom - r.top,
- SWP_NOZORDER | SWP_NOMOVE))
+ if (!SetWindowPos(hwnd_, nullptr, r.left, r.top, r.right - r.left,
+ r.bottom - r.top, SWP_NOZORDER))
throw Win32Error(::GetLastError(), "Failed to invoke SetWindowPos.");
}
}
@@ -170,6 +185,9 @@ Rect WinNativeWindow::GetWindowRect() {
}
void WinNativeWindow::SetWindowRect(const Rect& rect) {
+ CRU_LOG_TAG_INFO("{} set window rect to {}.",
+ static_cast<void*>(GetWindowHandle()), rect);
+
client_rect_ = CalcClientRectFromWindow(rect, style_flag_, dpi_);
if (hwnd_) {
@@ -406,10 +424,6 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
return true;
}
return false;
- case WM_CREATE:
- OnCreateInternal();
- *result = 0;
- return true;
case WM_MOVE:
OnMoveInternal(LOWORD(l_param), HIWORD(l_param));
*result = 0;
@@ -472,11 +486,14 @@ void WinNativeWindow::RecreateWindow() {
if (hwnd_ == nullptr)
throw Win32Error(::GetLastError(), "Failed to create window.");
+ OnCreateInternal();
+
auto dpi = ::GetDpiForWindow(hwnd_);
if (dpi == 0)
throw Win32Error(::GetLastError(), "Failed to get dpi of window.");
dpi_ = static_cast<float>(dpi);
- CRU_LOG_TAG_DEBUG("Dpi of window is {}.", dpi_);
+ CRU_LOG_TAG_DEBUG("Dpi of window {} is {}.",
+ static_cast<void*>(GetWindowHandle()), dpi_);
application_->RegisterWindow(this);
@@ -494,11 +511,16 @@ void WinNativeWindow::RecreateWindow() {
input_method_context_->DisableIME();
}
-void WinNativeWindow::OnCreateInternal() { create_event_.Raise(nullptr); }
+void WinNativeWindow::OnCreateInternal() {
+ CRU_LOG_TAG_DEBUG("A native window is created, hwnd {}.",
+ static_cast<void*>(GetWindowHandle()));
+ create_event_.Raise(nullptr);
+}
void WinNativeWindow::OnDestroyInternal() {
+ CRU_LOG_TAG_DEBUG("A native window is destroying, hwnd {}.",
+ static_cast<void*>(GetWindowHandle()));
destroy_event_.Raise(nullptr);
- application_->UnregisterWindow(this);
hwnd_ = nullptr;
if (application_->IsQuitOnAllWindowClosed() &&