fix(window): WIN11 关闭按钮 hover 红底按圆角裁剪

WIN11 窗口是圆角样式,关闭按钮又紧贴右上角;此前 hover/按下直接
row_fill 整块矩形,红色会盖住窗口圆角外的区域。

- 新增 _window_round_keep:按窗口自身的圆角轮廓判断像素是否可画
- 新增 _close_fill_row:同时按“按钮圆角 + 窗口圆角”双重裁剪
- WIN11 关闭按钮红底向内收 2px、圆角 3px;WIN7/WINXP 也走窗口轮廓裁剪
- 移除不再使用的 _round_fill_row
This commit is contained in:
TermiNexus committed 2026-10-27 13:21:34 +08:00
1 parent b9efc30d71
commit 8dc806e7e2
1 file changed
+25 -8
+25 -8
View File
@@ -1044,20 +1044,33 @@ class DeskServer:
if lx >= bw - r: return _is_in_corner(lx, lry, bw - r - 1, bh - r - 1, r)
return 1
# 关闭键底色圆角(WIN7/WINXP 的红色圆角块):整行只做一次 row_fill
def _round_fill_row(self, bx: int, by: int, bw: int, bh: int, yy: int, col: uint32, r: int):
# 窗口本身是否允许画在该像素(圆角样式会裁掉四角)
def _window_round_keep(self, s: desk.WinSlot*, x: int, y: int) -> int:
if s.style != STYLE_WIN11 and s.style != STYLE_WIN7 and s.style != STYLE_WINXP:
return 1
rx: int = x - s.ux
ry: int = y - s.uy
if rx < 0 or rx >= s.w or ry < 0 or ry >= s.h: return 0
return self._round_keep(rx, ry, s.w, s.h, WIN_RADIUS)
# 关闭键底色:按钮自身圆角 + 窗口圆角双重裁剪,避免 WIN11 右上角红块溢出
def _close_fill_row(self, s: desk.WinSlot*, bx: int, by: int, bw: int, bh: int, yy: int, col: uint32, r: int):
lry: int = yy - by
if lry < 0 or lry >= bh: return
lo: int = 0
while lo < bw and self._round_keep(lo, lry, bw, bh, r) == 0:
while lo < bw:
if self._round_keep(lo, lry, bw, bh, r) != 0 and self._window_round_keep(s, bx + lo, yy) != 0:
break
lo += 1
hi: int = bw
while hi > lo and self._round_keep(hi - 1, lry, bw, bh, r) == 0:
while hi > lo:
if self._round_keep(hi - 1, lry, bw, bh, r) != 0 and self._window_round_keep(s, bx + hi - 1, yy) != 0:
break
hi -= 1
if hi > lo:
self.row_fill(bx + lo, yy, hi - lo, col)
def _draw_close_row(self, bx: int, by: int, bw: int, bh: int, yy: int, style: int, hovered: int, pressed: int):
def _draw_close_row(self, s: desk.WinSlot*, bx: int, by: int, bw: int, bh: int, yy: int, style: int, hovered: int, pressed: int):
lry: int = yy - by
if lry < 0 or lry >= bh: return
cx: int = bx + bw / 2
@@ -1076,7 +1089,7 @@ class DeskServer:
base_col2: uint32 = self.rgb(uint32(200), uint32(50), uint32(50))
if hovered != 0: base_col2 = self.rgb(uint32(220), uint32(60), uint32(60))
if pressed != 0: base_col2 = self.rgb(uint32(140), uint32(25), uint32(25))
self._round_fill_row(bx, by, bw, bh, yy, base_col2, 3)
self._close_fill_row(s, bx, by, bw, bh, yy, base_col2, 3)
x_col = self.rgb(uint32(255), uint32(255), uint32(255))
else:
x_col = self.rgb(uint32(150), uint32(150), uint32(150))
@@ -1084,7 +1097,11 @@ class DeskServer:
if active != 0:
bg: uint32 = self.rgb(uint32(200), uint32(50), uint32(50))
if pressed != 0: bg = self.rgb(uint32(140), uint32(25), uint32(25))
self.row_fill(bx, yy, bw, bg)
if style == STYLE_WIN11:
# 圆角样式:向内收 2px,按钮自身圆角 + 窗口右上角圆角双重裁剪
self._close_fill_row(s, bx + 2, by + 2, bw - 4, bh - 4, yy, bg, 3)
else:
self.row_fill(bx, yy, bw, bg)
x_col = self.rgb(uint32(255), uint32(255), uint32(255))
i: int = yy - cy
if i >= 0 - d and i <= d:
@@ -1196,7 +1213,7 @@ class DeskServer:
yend: int = y1
if yend > by + bh: yend = by + bh
while yy < yend:
self._draw_close_row(close_x, by, bw, bh, yy, style,
self._draw_close_row(s, close_x, by, bw, bh, yy, style,
1 if hover_kind == 1 else 0, 1 if pressed_kind == 1 else 0)
self._draw_min_row(min_x, by, bw, bh, yy, style,
1 if hover_kind == 2 else 0, 1 if pressed_kind == 2 else 0)