From d7af2cee1aaee2df7bb53af7b2bb61cabd568759 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Fri, 4 Sep 2026 07:30:24 +0800 Subject: [PATCH] Fix mode-page glyph clip, digit tracking, and nav separator. Match mode.png: widen card value slots, use ASCII advance spacing so 1364 is not cramped, and draw the section/nav divider line. Co-authored-by: Cursor --- UI/UI_global.c | 11 +++++-- UI/UI_global.h | 24 ++++++++------- device/LCD_ILI9341/Drv_ILI9341_Lcd_App.c | 38 +++++++++++++++++------- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/UI/UI_global.c b/UI/UI_global.c index 4ea4960..3f7756e 100644 --- a/UI/UI_global.c +++ b/UI/UI_global.c @@ -412,8 +412,10 @@ void Refresh_Transpose(const LEBEL_UI *UI, GUI_SWITCH * Group) clear_w = UI0902_CARD_VALUE_W; value_y = UI_CardTextDrawY(UI0902_CARD_VALUE_Y, UI0902_CARD_VALUE_H, UI0902_CARD_VALUE_LH, UI0902_CARD_VALUE_SIZE); - /* 清区高度不得侵入 KEY/BPM 行 */ - clear_h = (uint16_t)(UI0902_CARD_VALUE_SIZE + 1); + /* 清区高度保证主值完整;不得侵入 KEY/BPM 行 */ + clear_h = (uint16_t)(UI0902_CARD_VALUE_H + 1); + if (clear_h < (uint16_t)(UI0902_CARD_VALUE_SIZE + 1)) + clear_h = (uint16_t)(UI0902_CARD_VALUE_SIZE + 1); if (value_y + clear_h > UI0902_CARD_SUB_Y) clear_h = (uint16_t)(UI0902_CARD_SUB_Y - value_y); x1 = UI_CardTextBoxX1(cx, clear_w, clear_w); @@ -761,7 +763,10 @@ void Draw_Bottom_Bar(uint8_t sel, uint8_t first_back) uint8_t i; (void)first_back; - LCD_FillByColor(0, 275, 240, 320, UI0902_BG_COLOR); + LCD_FillByColor(0, 263, 240, 320, UI0902_BG_COLOR); + /* mode.png:段落钮与底栏之间横线分隔 */ + LCD_DrawLine(0, UI0902_SEP_LINE_Y, 239, UI0902_SEP_LINE_Y, UI0902_SEP_LINE_COLOR); + LCD_DrawLine(0, UI0902_SEP_LINE_Y + 1, 239, UI0902_SEP_LINE_Y + 1, UI0902_SEP_LINE_COLOR); if (sel == UI0902_NAV_UNIVERSAL) { icons[0] = gImage_Nav_Universal_Sel; ws[0] = 36; hs[0] = 28; } else { icons[0] = gImage_Nav_Universal_Not; ws[0] = 36; hs[0] = 28; } diff --git a/UI/UI_global.h b/UI/UI_global.h index 31fc7b3..bfe9c50 100644 --- a/UI/UI_global.h +++ b/UI/UI_global.h @@ -54,13 +54,13 @@ void CallUI_RestoreSelect(void); #define UI0902_FONT_NAV 9 /* ASCII 字宽(须与 Drv LCD_GetAsciiMetrics 一致) */ #define UI0902_ASCII_W(sz) \ - ((sz) == 8 ? 5 : \ - (sz) == 9 ? 7 : \ - (sz) == 11 ? 6 : \ - (sz) == 12 ? 7 : \ - (sz) == 13 || (sz) == 15 || (sz) == 16 ? 8 : ((sz) / 2)) + ((sz) == 8 ? 6 : \ + (sz) == 9 ? 8 : \ + (sz) == 11 ? 7 : \ + (sz) == 12 ? 8 : \ + (sz) == 13 || (sz) == 15 || (sz) == 16 ? 10 : ((sz) / 2 + 1)) -/* 移调卡文字(0902-04 实测绝对 Y) */ +/* 移调卡文字(主值加宽+下移 KEY,防 Cb/101 底/右裁切) */ #define UI0902_CARD_TEXT_CX_L (UI0902_MARGIN_X + UI0902_CARD_W / 2) /* 64 */ #define UI0902_CARD_TEXT_CX_R (UI0902_MARGIN_X + UI0902_CARD_W + UI0902_CARD_GAP + UI0902_CARD_W / 2) /* 176 */ @@ -72,15 +72,19 @@ void CallUI_RestoreSelect(void); #define UI0902_CARD_VALUE_SIZE UI0902_FONT_HERO /* 16 */ #define UI0902_CARD_VALUE_LH 16 -#define UI0902_CARD_VALUE_W 24 -#define UI0902_CARD_VALUE_H 16 -#define UI0902_CARD_VALUE_Y 70 +#define UI0902_CARD_VALUE_W 34 /* 3×10 字距步进,101 不贴边 */ +#define UI0902_CARD_VALUE_H 17 +#define UI0902_CARD_VALUE_Y 69 #define UI0902_CARD_SUB_SIZE UI0902_FONT_SUB /* 9 */ #define UI0902_CARD_SUB_LH 9 #define UI0902_CARD_SUB_W 28 #define UI0902_CARD_SUB_H 9 -#define UI0902_CARD_SUB_Y 89 +#define UI0902_CARD_SUB_Y 91 + +/* 段落钮与底栏分隔线(mode.png ≈ y274) */ +#define UI0902_SEP_LINE_Y 274 +#define UI0902_SEP_LINE_COLOR 0x0883 /* #09111C */ /* 兼容旧相对偏移宏(= 绝对Y - CARD_Y) */ #define UI0902_CARD_LABEL_DY (UI0902_CARD_LABEL_Y - UI0902_CARD_Y) diff --git a/device/LCD_ILI9341/Drv_ILI9341_Lcd_App.c b/device/LCD_ILI9341/Drv_ILI9341_Lcd_App.c index e336f7d..d8b4289 100644 --- a/device/LCD_ILI9341/Drv_ILI9341_Lcd_App.c +++ b/device/LCD_ILI9341/Drv_ILI9341_Lcd_App.c @@ -91,7 +91,7 @@ static uint16_t LCD_GetChsTableSize(uint8_t sizey) static uint8_t LCD_GetAsciiMetrics(uint8_t size, uint8_t *char_width, uint8_t *char_height) { - /* 字宽略大于 size/2,避免 WQY/Liberation 缩进窄格时右缘被裁 */ + /* 与点阵源一致的字形格宽(ShowChar 窗口必须匹配字库) */ *char_height = size; switch (size) { @@ -108,6 +108,17 @@ static uint8_t LCD_GetAsciiMetrics(uint8_t size, uint8_t *char_width, uint8_t *c } } +/* 显示步进:字形宽 + 字距,和弦数字等更舒展,避免右缘贴死 */ +static uint8_t LCD_GetAsciiAdvance(uint8_t size) +{ + uint8_t w, h; + if (!LCD_GetAsciiMetrics(size, &w, &h)) + return (uint8_t)(size / 2); + if (size >= 13) + return (uint8_t)(w + 2); /* 字距 +2,对齐 mode.png 舒展感 */ + return (uint8_t)(w + 1); +} + //r:0-31 g:0-63 b:0-31 uint16_t RGB(int r,int g,int b) { @@ -950,12 +961,14 @@ void LCD_DrawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t c void LCD_ShowString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode) { uint8_t cw, ch; + uint8_t adv; if (!LCD_GetAsciiMetrics(sizey, &cw, &ch)) return; + adv = LCD_GetAsciiAdvance(sizey); while(*p != '\0') { LCD_ShowChar(x, y, *p, fc, bc, sizey, mode); - x += cw; + x += adv; p++; } } @@ -1043,7 +1056,7 @@ static uint16_t LCD_GetMixedStringWidth(uint8_t *str, uint8_t sizey) { uint16_t width = 0; uint8_t xStepCn = sizey; - uint8_t xStepAscii = sizey / 2; + uint8_t xStepAscii = LCD_GetAsciiAdvance(sizey); while(*str != '\0') { @@ -1078,7 +1091,7 @@ uint16_t LCD_ShowMixedString(uint16_t x1, uint16_t x2, uint16_t y, uint8_t *str, { const char (*codeTab)[2] = NULL; uint8_t xStepCn = sizey; - uint8_t xStepAscii = sizey / 2; + uint8_t xStepAscii = LCD_GetAsciiAdvance(sizey); uint16_t draw_x; codeTab = LCD_GetChsTable(sizey); @@ -1151,11 +1164,12 @@ uint16_t LCD_ShowMixedString(uint16_t x1, uint16_t x2, uint16_t y, uint8_t *str, ******************************************************************************/ void LCD_ClearString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t bc, uint8_t sizey, uint8_t mode) { + uint8_t adv = LCD_GetAsciiAdvance(sizey); while (*p != '\0') { // 用背景色bc作为“前景色”,显示空格字符,覆盖原字符 LCD_ShowChar(x, y, ' ', bc, bc, sizey, mode); // 前景色=背景色=bc,相当于清除 - x += sizey / 2; // 与原显示函数x步长一致 + x += adv; p++; } } @@ -1357,9 +1371,11 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui uint8_t align, uint16_t fc, uint16_t bc, uint8_t mode, uint8_t size) { uint8_t CHAR_WIDTH, CHAR_HEIGHT; + uint8_t CHAR_ADV; if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT)) return 0; + CHAR_ADV = LCD_GetAsciiAdvance(size); uint16_t str_len = 0; uint16_t str_total_width; @@ -1372,8 +1388,8 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui str_len++; } - // 计算字符串总宽度 - str_total_width = str_len * CHAR_WIDTH; + // 计算字符串总宽度(含字距) + str_total_width = str_len * CHAR_ADV; // 根据对齐方式计算起始 X 坐标 switch (align) @@ -1399,7 +1415,7 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui while (*p != '\0') { LCD_ShowChar(curr_x, y, *p, fc, bc, CHAR_HEIGHT, mode); - curr_x += CHAR_WIDTH; + curr_x += CHAR_ADV; p++; } return curr_x; @@ -1541,9 +1557,11 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y, uint16_t color_top, uint16_t color_bottom, uint8_t size) { uint8_t CHAR_WIDTH, CHAR_HEIGHT; + uint8_t CHAR_ADV; if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT)) return 0; + CHAR_ADV = LCD_GetAsciiAdvance(size); uint16_t str_len = 0; uint16_t str_total_width; @@ -1553,7 +1571,7 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y, while (p[str_len] != '\0') str_len++; if (str_len == 0) return 0; - str_total_width = str_len * CHAR_WIDTH; + str_total_width = str_len * CHAR_ADV; switch (align) { @@ -1569,7 +1587,7 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y, break; } - // 1. 画垂直渐变背景 + // 1. 画垂直渐变背景(覆盖字形+字距) LCD_FillGradient(curr_x, y, curr_x + str_total_width, y + CHAR_HEIGHT, color_top, color_bottom); // 2. 叠加模式显示文字(mode=1)