硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1935|回复: 4
收起左侧

请教下,有什么方法可以实现动态显示透明字符啊 ?

[复制链接]

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2018-1-24 09:03:15 | 显示全部楼层 |阅读模式
请教下,有什么方法可以实现动态显示透明字符啊 ?

具体效果显示如下:







33333.png
33334.png
33333.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2018-1-24 09:53:22 | 显示全部楼层
设置字体的背景色跟你显示位置的背景色一样即可。emWin的话,更简单,设置文本模式。
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2018-1-24 10:11:07 | 显示全部楼层
eric2013 发表于 2018-1-24 09:53
设置字体的背景色跟你显示位置的背景色一样即可。emWin的话,更简单,设置文本模式。

如果是播放视频的话,背景色不好控制啊 ????

如果是固定的背景色的话,你的这个方法就可以,如果是动态背景色就不好实现啦 ???
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2018-1-24 10:21:01 | 显示全部楼层
也没问题,修改下你的文本显示API,可以参考我们F429的裸机API,可以设置透明,也就是不绘制字体背景色,仅绘制前景色。
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: LCD_DispStrEx
  4. *        功能说明: 在LCD指定坐标(左上角)显示一个字符串。 增强型函数。支持左\中\右对齐,支持定长清屏。
  5. *        形    参:
  6. *                _usX : X坐标
  7. *                _usY : Y坐标
  8. *                _ptr  : 字符串指针
  9. *                _tFont : 字体结构体,包含颜色、背景色(支持透明)、字体代码、文字间距等参数。可以指定RA8875字库显示汉字
  10. *                _Width : 字符串显示区域的宽度. 0 表示不处理留白区域,此时_Align无效
  11. *                _Align :字符串在显示区域的对齐方式,
  12. *                                ALIGN_LEFT = 0,
  13. *                                ALIGN_CENTER = 1,
  14. *                                ALIGN_RIGHT = 2
  15. *        返 回 值: 无
  16. *********************************************************************************************************
  17. */
  18. void LCD_DispStrEx(uint16_t _usX, uint16_t _usY, char *_ptr, FONT_T *_tFont, uint16_t _Width,
  19.         uint8_t _Align)
  20. {
  21.         uint32_t i;
  22.         uint8_t code1;
  23.         uint8_t code2;
  24.         uint8_t buf[32 * 32 / 8];        /* 最大支持24点阵汉字 */
  25.         uint8_t width;
  26.         uint16_t m;
  27.         uint8_t font_width = 0;
  28.         uint8_t font_height = 0;
  29.         uint16_t x, y;
  30.         uint16_t offset;
  31.         uint16_t str_width;        /* 字符串实际宽度  */

  32.         switch (_tFont->FontCode)
  33.         {
  34.                 case FC_ST_12:                /* 12点阵 */
  35.                         font_height = 12;
  36.                         font_width = 12;
  37.                         break;
  38.                
  39.                 case FC_ST_16:
  40.                         font_height = 16;
  41.                         font_width = 16;
  42.                         break;

  43.                 case FC_ST_24:
  44.                         font_height = 24;
  45.                         font_width = 24;
  46.                         break;
  47.                                                
  48.                 case FC_ST_32:       
  49.                         font_height = 32;
  50.                         font_width = 32;
  51.                         break;                                       
  52.         }
  53.        
  54.         str_width = LCD_GetStrWidth(_ptr, _tFont);        /* 计算字符串实际宽度(RA8875内部ASCII点阵宽度为变长 */
  55.         offset = 0;
  56.         if (_Width > str_width)
  57.         {
  58.                 if (_Align == ALIGN_RIGHT)        /* 右对齐 */
  59.                 {
  60.                         offset = _Width - str_width;
  61.                 }
  62.                 else if (_Align == ALIGN_CENTER)        /* 左对齐 */
  63.                 {
  64.                         offset = (_Width - str_width) / 2;
  65.                 }
  66.                 else        /* 左对齐 ALIGN_LEFT */
  67.                 {
  68.                         ;
  69.                 }
  70.         }

  71.         /* 左侧填背景色, 中间对齐和右边对齐  */
  72.         if (offset > 0)
  73.         {
  74.                 LCD_Fill_Rect(_usX, _usY, LCD_GetFontHeight(_tFont), offset,  _tFont->BackColor);
  75.                 _usX += offset;
  76.         }
  77.        
  78.         /* 右侧填背景色 */
  79.         if (_Width > str_width)
  80.         {
  81.                 LCD_Fill_Rect(_usX + str_width, _usY, LCD_GetFontHeight(_tFont), _Width - str_width - offset,  _tFont->BackColor);
  82.         }
  83.        
  84.         /* 使用CPU内部字库. 点阵信息由CPU读取 */
  85.         {
  86.                 /* 开始循环处理字符 */
  87.                 while (*_ptr != 0)
  88.                 {
  89.                         code1 = *_ptr;        /* 读取字符串数据, 该数据可能是ascii代码,也可能汉字代码的高字节 */
  90.                         if (code1 < 0x80)
  91.                         {
  92.                                 /* 将ascii字符点阵复制到buf */
  93.                                 //memcpy(buf, &pAscDot[code1 * (font_bytes / 2)], (font_bytes / 2));
  94.                                 _LCD_ReadAsciiDot(code1, _tFont->FontCode, buf);        /* 读取ASCII字符点阵 */
  95.                                 width = font_width / 2;
  96.                         }
  97.                         else
  98.                         {
  99.                                 code2 = *++_ptr;
  100.                                 if (code2 == 0)
  101.                                 {
  102.                                         break;
  103.                                 }
  104.                                 /* 读1个汉字的点阵 */
  105.                                 _LCD_ReadHZDot(code1, code2, _tFont->FontCode, buf);
  106.                                 width = font_width;
  107.                         }
  108.        
  109.                         y = _usY;
  110.                         /* 开始刷LCD */
  111.                         for (m = 0; m < font_height; m++)        /* 字符高度 */
  112.                         {
  113.                                 x = _usX;
  114.                                 for (i = 0; i < width; i++)        /* 字符宽度 */
  115.                                 {
  116.                                         if ((buf[m * ((2 * width) / font_width) + i / 8] & (0x80 >> (i % 8 ))) != 0x00)
  117.                                         {
  118.                                                 LCD_PutPixel(x, y, _tFont->FrontColor);        /* 设置像素颜色为文字色 */
  119.                                         }
  120.                                         else
  121.                                         {
  122.                                                 if (_tFont->BackColor != CL_MASK)        /* 透明色 */
  123.                                                 {
  124.                                                         LCD_PutPixel(x, y, _tFont->BackColor);        /* 设置像素颜色为文字背景色 */
  125.                                                 }
  126.                                         }
  127.        
  128.                                         x++;
  129.                                 }
  130.                                 y++;
  131.                         }
  132.        
  133.                         if (_tFont->Space > 0)
  134.                         {
  135.                                 /* 如果文字底色按_tFont->usBackColor,并且字间距大于点阵的宽度,那么需要在文字之间填充(暂时未实现) */
  136.                         }
  137.                         _usX += width + _tFont->Space;        /* 列地址递增 */
  138.                         _ptr++;                        /* 指向下一个字符 */
  139.                 }
  140.         }
复制代码



回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2018-1-24 10:36:05 | 显示全部楼层
eric2013 发表于 2018-1-24 10:21
也没问题,修改下你的文本显示API,可以参考我们F429的裸机API,可以设置透明,也就是不绘制字体背景色,仅 ...

好的,我参考参考一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 05:25 , Processed in 0.040272 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表