diff --git a/Apps/Explorer/desk_server.vp b/Apps/Explorer/desk_server.vp index 5546072..d0a6264 100644 --- a/Apps/Explorer/desk_server.vp +++ b/Apps/Explorer/desk_server.vp @@ -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)