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:
1 parent
b9efc30d71
commit
8dc806e7e2
1 file changed
+25
-8
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user