硬汉嵌入式论坛

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

[客户分享] V5开发板出厂程序的图标是通过B2C小软件转换,然后调用函数LCD_DrawIcon32显示

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-8-4 12:58:34 | 显示全部楼层 |阅读模式
1、出厂程序:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=1285

2、小软件B2C.exe
Bin2C.exe (86 KB, 下载次数: 64)

3、所有图标文件:
48x48像素(32位带Alpha).zip (160.16 KB, 下载次数: 49)
QQ截图20180804125748.png


4、显示是调用的如下函数,使用方法看出厂程序即可:
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: LCD_DrawIcon32
  4. *        功能说明: 在LCD上绘制一个图标, 带有透明信息的位图(32位, RGBA). 图标下带文字
  5. *        形    参: _pIcon : 图标结构
  6. *                          _tFont : 字体属性
  7. *                          _ucFocusMode : 焦点模式。0 表示正常图标  1表示选中的图标
  8. *        返 回 值: 无
  9. *********************************************************************************************************
  10. */
  11. void LCD_DrawIcon32(const ICON_T *_tIcon, FONT_T *_tFont, uint8_t _ucFocusMode)
  12. {
  13.         const uint8_t *p;
  14.         uint16_t usOldRGB, usNewRGB;
  15.         int16_t x, y;                /* 用于记录窗口内的相对坐标 */
  16.         uint8_t R1,G1,B1,A;        /* 新像素色彩分量 */
  17.         uint8_t R0,G0,B0;        /* 旧像素色彩分量 */

  18.         p = (const uint8_t *)_tIcon->pBmp;
  19.         p += 54;                /* 直接指向图像数据区 */

  20.         /* 按照BMP位图次序,从左至右,从上至下扫描 */
  21.         for (y = _tIcon->Height - 1; y >= 0; y--)
  22.         {
  23.                 for (x = 0; x < _tIcon->Width; x++)
  24.                 {
  25.                         B1 = *p++;
  26.                         G1 = *p++;
  27.                         R1 = *p++;
  28.                         A = *p++;        /* Alpha 值(透明度),0-255, 0表示透明,1表示不透明, 中间值表示透明度 */

  29.                         if (A == 0x00)        /* 需要透明,显示背景 */
  30.                         {
  31.                                 ;        /* 不用刷新背景 */
  32.                         }
  33.                         else if (A == 0xFF)        /* 完全不透明, 显示新像素 */
  34.                         {
  35.                                 usNewRGB = RGB(R1, G1, B1);
  36.                                 if (_ucFocusMode == 1)
  37.                                 {
  38.                                         usNewRGB = LCD_Blend565(usNewRGB, CL_YELLOW, 10);
  39.                                 }
  40.                                 LCD_PutPixel(x + _tIcon->Left, y + _tIcon->Top, usNewRGB);
  41.                         }
  42.                         else         /* 半透明 */
  43.                         {
  44.                                 /* 计算公式: 实际显示颜色 = 前景颜色 * Alpha / 255 + 背景颜色 * (255-Alpha) / 255 */
  45.                                 usOldRGB = LCD_GetPixel(x + _tIcon->Left, y + _tIcon->Top);
  46.                                
  47.                                 //usOldRGB = 0xFFFF;
  48.                                 R0 = RGB565_R(usOldRGB);
  49.                                 G0 = RGB565_G(usOldRGB);
  50.                                 B0 = RGB565_B(usOldRGB);

  51.                                 R1 = (R1 * A) / 255 + R0 * (255 - A) / 255;
  52.                                 G1 = (G1 * A) / 255 + G0 * (255 - A) / 255;
  53.                                 B1 = (B1 * A) / 255 + B0 * (255 - A) / 255;
  54.                                 usNewRGB = RGB(R1, G1, B1);
  55.                                 if (_ucFocusMode == 1)
  56.                                 {
  57.                                         usNewRGB = LCD_Blend565(usNewRGB, CL_YELLOW, 10);
  58.                                 }
  59.                                 LCD_PutPixel(x + _tIcon->Left, y + _tIcon->Top, usNewRGB);
  60.                                
  61.                                 LCD_PutPixel(x + _tIcon->Left, y + _tIcon->Top, usNewRGB);
  62.                         }
  63.                 }
  64.         }

  65.         /* 绘制图标下的文字 */
  66.         {
  67.                 uint16_t len;
  68.                 uint16_t width;

  69.                 len = strlen(_tIcon->Text);

  70.                 if  (len == 0)
  71.                 {
  72.                         return;        /* 如果图标文本长度为0,则不显示 */
  73.                 }

  74.                 /* 计算文本的总宽度 */
  75.                 if (_tFont->FontCode == FC_ST_12)                /* 12点阵 */
  76.                 {
  77.                         width = 6 * (len + _tFont->Space);
  78.                 }
  79.                 else        /* FC_ST_16 */
  80.                 {
  81.                         width = 8 * (len + _tFont->Space);
  82.                 }


  83.                 /* 水平居中 */
  84.                 x = (_tIcon->Left + _tIcon->Width / 2) - width / 2;
  85.                 y = _tIcon->Top + _tIcon->Height + 2;
  86.                 LCD_DispStr(x, y, (char *)_tIcon->Text, _tFont);
  87.         }
  88. }
复制代码
回复

使用道具 举报

335

主题

2038

回帖

3048

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3048
发表于 2018-8-6 11:34:03 | 显示全部楼层
透明图片也可以用官方的 BmpCVT转换,可识别png的,转换的时候可选压缩模式,节省code空间。。
使用GUI_DrawBitmap()可正常显示。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2018-8-6 17:37:50 | 显示全部楼层
caicaptain2 发表于 2018-8-6 11:34
透明图片也可以用官方的 BmpCVT转换,可识别png的,转换的时候可选压缩模式,节省code空间。。
使用GUI_Dr ...



V5的出厂程序是裸机实现的,没有用emWn,所以专门搞的一个显示图标方式。
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-4-18 14:47:52 | 显示全部楼层
eric2013 发表于 2018-8-6 17:37
V5的出厂程序是裸机实现的,没有用emWn,所以专门搞的一个显示图标方式。

类似这种图标在哪里下载呢?项目正在使用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2019-4-18 14:50:43 | 显示全部楼层
sanit 发表于 2019-4-18 14:47
类似这种图标在哪里下载呢?项目正在使用

专业的界面图标下载网站,支持图标检索,再次献给为制作图标而头疼的人
http://www.armbbs.cn/forum.php?m ... 7316&fromuid=58
(出处: 安富莱电子论坛)
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-4-18 14:53:13 | 显示全部楼层
eric2013 发表于 2019-4-18 14:50
专业的界面图标下载网站,支持图标检索,再次献给为制作图标而头疼的人
http://www.armbbs.cn/forum. ...

多谢!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 04:10 , Processed in 0.172523 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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