fix(window): 标题栏按钮保持方角,仅按窗口圆角裁剪

上一版把 WIN11 关闭按钮红底做了内收 + 按钮圆角,不符合预期:
窗口是全圆角,但按钮本身应当是方角,唯一需要丢弃的是与窗口
右上圆角重合的那部分像素。

- WIN11 关闭按钮红底恢复整块矩形,仅用 _window_round_keep 丢弃窗口圆角外像素
- WIN7/WINXP 按钮底色同样改为方角(r=0),仍做窗口轮廓裁剪
- 按钮命中区域保持不变(仍是完整方角矩形)
This commit is contained in:
TermiNexus committed 2026-10-27 13:25:41 +08:00
1 parent 8dc806e7e2
commit 845633773b
1 file changed
+5 -4
+5 -4
View File
@@ -1053,7 +1053,8 @@ class DeskServer:
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 右上角红块溢出
# 标题栏按钮底色:按需做按钮圆角(r=0 即方角)+ 窗口圆角裁剪,
# 保证按钮本身是方的,只有与窗口圆角重合的角被丢弃。
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
@@ -1089,7 +1090,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._close_fill_row(s, bx, by, bw, bh, yy, base_col2, 3)
self._close_fill_row(s, bx, by, bw, bh, yy, base_col2, 0)
x_col = self.rgb(uint32(255), uint32(255), uint32(255))
else:
x_col = self.rgb(uint32(150), uint32(150), uint32(150))
@@ -1098,8 +1099,8 @@ class DeskServer:
bg: uint32 = self.rgb(uint32(200), uint32(50), uint32(50))
if pressed != 0: bg = self.rgb(uint32(140), uint32(25), uint32(25))
if style == STYLE_WIN11:
# 圆角样式:向内收 2px,按钮自身圆角 + 窗口右上角圆角双重裁剪
self._close_fill_row(s, bx + 2, by + 2, bw - 4, bh - 4, yy, bg, 3)
# 按钮本身保持方角;只丢弃窗口圆角轮廓之外的部分
self._close_fill_row(s, bx, by, bw, bh, yy, bg, 0)
else:
self.row_fill(bx, yy, bw, bg)
x_col = self.rgb(uint32(255), uint32(255), uint32(255))