On Mon, 24 Nov 2025 14:28:47 GMT, Michael Strauß <[email protected]> wrote:

> On Windows, the `Stage.width` and `Stage.height` correspond to the window 
> size as returned by `GetWindowRect`.
> 
> Up until Windows 10, the size of a window was identical to its visual 
> borders. However, since Windows 10 has introduced thin visual window borders, 
> the window manager adds an invisible border of a few pixels around the window 
> to make it easier to resize the window. Since `GetWindowRect` returns the 
> window size _including_ these invisible borders, the location and size of a 
> `Stage` isn't exactly what we'd expect.
> 
> For example, if we place a `Stage` at `setX(0)` and `setY(0)`, the window 
> appears with a small distance from the screen edge, and the window size 
> extends a few pixels beyond its visual borders (in the following images, the 
> screenshot size corresponds to the window size; note the invisible padding 
> around the edges):
> <img width="300" alt="window-size-1" 
> src="https://github.com/user-attachments/assets/76ea6861-885f-4bea-aeb7-e8e6464b7199";
>  />
> 
> What we actually want is to have the visual borders line up with the edges of 
> the screen, and have the window size correspond to the visual borders:
> <img width="295" alt="window-size-2" 
> src="https://github.com/user-attachments/assets/ca6bed73-e4e7-4df6-9491-d82792bb0866";
>  />
> 
> The implementation is quite simple: instead of `GetWindowRect`, we use 
> `DwmGetWindowAttribute(DWMA_EXTENDED_FRAME_BOUNDS)`. This gives us the bounds 
> of the visual window borders. If this function fails, we fall back to 
> `GetWindowRect` (now, I don't know why 
> `DwmGetWindowAttribute(DWMA_EXTENDED_FRAME_BOUNDS)` would ever fail... maybe 
> an old Windows version in a remote desktop scenario?).

I've added a comment to clarify that `m_minSize`, `m_maxSize`, and `m_insets` 
are specified with respect to the extended frame bounds.

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1982#issuecomment-3604540834

Reply via email to