硬汉嵌入式论坛

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

[emWin] [原创开源]emWin导航界面支持Awesome图标字体

  [复制链接]

2

主题

58

回帖

74

积分

初级会员

积分
74
发表于 2019-9-2 12:08:17 | 显示全部楼层 |阅读模式
本帖最后由 Jmhh247 于 2019-9-2 12:14 编辑

关键字: emwin, awesome图标字体


最近整理电脑资料,发现角落很多代码,不如整理一下分享出来,还能发挥点余热。

这是一个用emwin写的导航界面,emwin仿真环境用的是codeblocks。

##### 程序本身没什么技术含量,唯一值得分享的亮点是awesome图标字体在emwin中的应用。

本坛首发,也是第一次在这里发帖。在这里要特别感谢安富莱给力的史诗级emwin教程。


部分APP运行截图
---
加载页
open-ttf.png

启动页
by.png

导航页
main-page.png

图中的导航按钮使用的就是awesome图标。


---
#### awesome图标字体简介

awesome图标字体,是一套开源免费的矢量图标,最新版是4.7.0,一共有675个图标。awesome图标字体提供多种格式,可以用到多种开发场合,web开发应该是主流。

awesome图标字体中文官网在这:- [FontAwesome中文网](http://www.fontawesome.com.cn/)

官网截图

---
font-awesome.png
font-unicode.png
---
#### emwin使用awesome字体

awesome图标字体有提供ttf格式,而emwin是支持ttf格式的,所以emwin可以直接使用。

emwin使用图标的常规方法,无非就是2D绘图,直接贴图等。

awesome图标字体ttf格式大小只有162KB,不到200KB就有675个矢量图标,显然是很适合嵌入式的,使用方法也简单的多。
font-size.png
所以在一些场合中使用awesome图标字体优势非常大。

- 简单使用示例

创建字体后,直接当成普通字体来显示即可:

  1. GUI_SetFont(&Font48);

  2. GUI_DispStringInRect("\uf085", &rect, GUI_TA_HCENTER | GUI_TA_TOP);
复制代码


上面的“f085”是从索引页查出图标对应的unicode。我把图标的索引页生成了一个PDF文档,后面会给出该文档。


- 进阶使用示例

就是本次导航按钮使用图标字体的实现方法,原理就是用emwin系统的皮肤设置函数+按钮私有数据。

1. 在emwin创建awesome图标字体;


  1. ttf_init();

  2. // 篇幅限制,只列出部分,具体看工程源码
  3.     /* 创建6种字体 */
  4.     GUI_TTF_CreateFontAA(&awefont16, &awefont_Cs0);
  5.     GUI_TTF_CreateFontAA(&awefont24, &awefont_Cs1);
  6.     GUI_TTF_CreateFontAA(&awefont32, &awefont_Cs2);
  7.     GUI_TTF_CreateFontAA(&awefont48, &awefont_Cs3);
  8.     GUI_TTF_CreateFontAA(&awefont72, &awefont_Cs4);
  9.     GUI_TTF_CreateFontAA(&awefont120, &awefont_Cs5);
复制代码

---
2. 增加按钮的私有数据,这里是记录图标字体等信息
  1. // 按钮私有数据,记录图标
  2. // ok
  3. static BTN_USER_SKIN BtnSkinData[] = {
  4.     {GUI_DARKCYAN, GUI_DARKMAGENTA, &awefont48, "\uf0f6"},
  5.     {GUI_DARKCYAN, GUI_DARKGRAY, &awefont48, "\uf030"},
  6.     {GUI_DARKCYAN, GUI_DARKGREEN, &awefont48, "\uf008"},
  7.     {GUI_DARKCYAN, GUI_DARKRED, &awefont48, "\uf226"},
  8.     {GUI_DARKCYAN, GUI_ORANGE, &awefont48, "\uf144"},
  9.     {GUI_DARKCYAN, GUI_GRAY_9A, &awefont48, "\uf2b5"},
  10. };

  11. // ok
  12. static BTN_USER_SKIN *pBtnUser[GUI_COUNTOF(BtnSkinData)];
复制代码

然后一定记得给按钮设置私有数据的字节数:
bytes.png
---
3. 使用系统函数设置皮肤即可

  1.     for (int i = 0; i < GUI_COUNTOF(BtnSkinData); i++) {

  2.         hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + i);

  3.         BUTTON_SetFont(hItem, &Font16);

  4.         // 设置皮肤函数
  5.         BUTTON_SetSkin(hItem, button_drawskin_awefont);

  6.         pBtnUser = &BtnSkinData;

  7.         // 设置私有数据
  8.         BUTTON_SetUserData(hItem, &pBtnUser, sizeof(pBtnUser));
  9.     }
复制代码


---

4. 最后是自定义皮肤函数的实现,核心代码

  1. /* 按钮绘制图标字体皮肤 ok*/
  2. int button_drawskin_awefont(const WIDGET_ITEM_DRAW_INFO* pItem)
  3. {
  4.     BTN_USER_SKIN *pUsr;
  5.     GUI_RECT rect;
  6.     char acBuf[20];


  7.     switch (pItem->Cmd)
  8.     {
  9.     case WIDGET_ITEM_DRAW_TEXT:

  10.             BUTTON_GetText(pItem->hWin, acBuf, sizeof(acBuf));

  11.             rect.x0 = pItem->x0;
  12.             rect.x1 = pItem->x1;
  13.             rect.y0 = pItem->y0;
  14.             rect.y1 = pItem->y1;


  15.             GUI_SetFont(BUTTON_GetFont(pItem->hWin));
  16.             GUI_SetTextMode(GUI_TM_TRANS);
  17.             GUI_SetColor(GUI_WHITE);

  18.             rect.y1 -= rect.y1 / 6;
  19.             GUI_DispStringInRect(acBuf, &rect, GUI_TA_HCENTER | GUI_TA_BOTTOM);


  20.         break;

  21.     case WIDGET_ITEM_DRAW_BACKGROUND:

  22.             BUTTON_GetUserData(pItem->hWin, &pUsr, sizeof(pUsr));

  23.             if (BUTTON_IsPressed(pItem->hWin))
  24.             {
  25.                 GUI_SetColor(pUsr->colorPressed);
  26.             }
  27.             else
  28.             {
  29.                 GUI_SetColor(pUsr->colorUnPress);
  30.             }

  31.             GUI_AA_FillRoundedRect(pItem->x0, pItem->y0, pItem->x1, pItem->y1, 0);


  32.             rect.x0 = pItem->x0;
  33.             rect.x1 = pItem->x1;
  34.             rect.y0 = pItem->y0;
  35.             rect.y1 = pItem->y1;



  36.             // 图形字体
  37.             GUI_SetColor(GUI_WHITE);
  38.             GUI_SetTextMode(GUI_TM_TRANS);


  39.             rect.y0 += rect.y1 / 6;

  40.             if (pUsr->iconFont) {
  41.                 GUI_SetFont(pUsr->iconFont);
  42.                 GUI_DispStringInRect(pUsr->iconName, &rect, GUI_TA_HCENTER);

  43.             }


  44.         break;

  45.     default:
  46.         {
  47.             return BUTTON_DrawSkinFlex(pItem);
  48.         }
  49.     }
  50.     return 0;
  51. }
复制代码


---
最后,相关资料:

1. CB工程源码                  emwin-uidemo5-cbprj.zip (16.38 MB, 下载次数: 710)
2. 官方下载图标字体包    font-awesome-4.7.0.zip (654.11 KB, 下载次数: 6056)   

3. 可执行demo                可执行demo.zip (474.78 KB, 下载次数: 138)
4. 索引手册PDF                图形字体图标字体矢量版 – Font Awesome 中文网.pdf (230.83 KB, 下载次数: 144)





评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-9-2 12:24:03 | 显示全部楼层
非常感谢楼主这么详细的介绍
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2019-9-2 13:07:59 | 显示全部楼层
这个字体效果不错
代码不规范,亲人两行泪!
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
 楼主| 发表于 2019-9-2 14:07:26 | 显示全部楼层
eric2013 发表于 2019-9-2 12:24
非常感谢楼主这么详细的介绍

哇,多谢硬汉精华认证!
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2019-9-2 15:21:57 | 显示全部楼层
应用到单片机上大概需要多少内存呢
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2019-9-2 16:18:29 | 显示全部楼层
我编译源文件没通过。。。sim_config 找不到。。发现没添加库,,添加进去又报错。。不知道是啥情况。。。。
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
 楼主| 发表于 2019-9-2 19:45:49 | 显示全部楼层
cz123123 发表于 2019-9-2 16:18
我编译源文件没通过。。。sim_config 找不到。。发现没添加库,,添加进去又报错。。不知道是啥情况。。。 ...

报的什么错?你的codeblocks用哪个版本(其实,只要codeblocks原来是正常的,哪个版本都无谓)

我的三台电脑下载测试都没问题的。
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2019-9-3 09:18:49 | 显示全部楼层
Jmhh247 发表于 2019-9-2 19:45
报的什么错?你的codeblocks用哪个版本(其实,只要codeblocks原来是正常的,哪个版本都无谓)

我的三 ...

13.12版本
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
 楼主| 发表于 2019-9-3 12:32:59 | 显示全部楼层

遇见大佬了啊,从我开始用codeblocks开始已经是16.01版本了,从来就没听过13.12,我收回之前版本都无谓的那句话。。。

建议换16.01或者17.12版本,这两个版本我都测试过,直接打开工程不需要任何配置。

优先推荐16.01吧,直接装直接用。  17.12版本安装后第一次用,可能需要手动配置一些才能调试。


回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
 楼主| 发表于 2019-9-3 12:35:34 | 显示全部楼层
akatsuki_lim 发表于 2019-9-2 15:21
应用到单片机上大概需要多少内存呢

字体文件只有162KB,这个动态内存少不了,其它内存都是你的程序实现了。

回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-9-3 14:32:50 | 显示全部楼层
其实Windows也有提供图标字体,不过现在好像很少有人用啊
回复

使用道具 举报

1

主题

28

回帖

31

积分

新手上路

积分
31
发表于 2021-4-9 14:11:48 | 显示全部楼层
怎么将msyh.ttf微软雅黑字体换成其他的呢,哪里可制作或下载?
回复

使用道具 举报

1

主题

28

回帖

31

积分

新手上路

积分
31
发表于 2021-4-9 14:21:36 | 显示全部楼层
我从windows字体里拷出来的宋体没法显示,雅黑和ADOBE的宋体倒能显示
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2021-6-5 18:02:39 | 显示全部楼层
很强这两天看qt,新接触的名词,来坛子里一搜就有了,后面得在单片机上试试
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 05:12 , Processed in 0.347491 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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