硬汉嵌入式论坛

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

[emWin] [原创开源]emwin自定义控件1--卡片面板

[复制链接]

2

主题

58

回帖

74

积分

初级会员

积分
74
发表于 2019-9-25 20:42:43 | 显示全部楼层 |阅读模式
关键字: emwin, 自定义控件,卡片面板


这是一个用emwin写的主页面导航+侧边导航的通用程序框架,emwin仿真环境用的是codeblocks(16或17都可)。

本篇主要介绍了一种卡片式的自定义控件。(由于只是程序框架,所以并不涉及界面美化,我知道丑,所以先说出来~)


---
- 卡片面板

卡片面板是我自己起的名字,不知道此类控件是否有准确的叫法。

在横屏设备中,卡片面板有着大量的应用,通常用来展示同类信息。

下面的截图来自最近沉迷的手游《QQ飞车》。(飞车一局2分钟左右,比王者玩起来轻松太多了,当然我主要是为看它的GUI设计~)

fcar-k.jpg


---
- APP截图

下面是部分APP截图


静态展示

batinfo-s.png


动态展示

batinfo-d.gif


---
- 代码实现

##### 原理就是用emwin系统的皮肤设置函数+按钮私有数据。这相当于一种自定义控件实现的简单方法,通过不同的函数+数据结构就能实现不同功能的控件。


1. 结构体类型


  1. <div>
  2. </div>typedef struct {
  3.     int Check;
  4.     GUI_COLOR colorPressed;
  5.     GUI_COLOR colorUnPress;
  6.     GUI_FONT *iconFont;
  7.     char iconName[6];
  8.     char btnText[10];
  9.     int ch;
  10.     int sw;
  11.     int mode;
  12.     float batV;
  13.     int batI;
  14.     float power;
  15. } BATINFO_USER_SKIN;

复制代码



2. 结构体定义


  1. static BATINFO_USER_SKIN BatInfoData[] = {
  2.     {ZL_BTN_CHKMODE_NO, GUI_DARKCYAN, GUI_DARKMAGENTA, &awefont24, "\uf0f6", "stm8", 1, 1, ZL_BATINFO_MODE_CC, 12.305, 2000},
  3.     {ZL_BTN_CHKMODE_NO, GUI_DARKCYAN, GUI_DARKMAGENTA, &awefont24, "\uf030", "stm32", 2, 1, ZL_BATINFO_MODE_ST, 10.8, 1500},
  4.     {ZL_BTN_CHKMODE_NO, GUI_DARKCYAN, GUI_DARKMAGENTA, &awefont24, "\uf008", "mcu", 3, 0, ZL_BATINFO_MODE_CV},
  5.     {ZL_BTN_CHKMODE_NO, GUI_DARKCYAN, GUI_DARKMAGENTA, &awefont24, "\uf226", "linux", 4, 1, ZL_BATINFO_MODE_DC, 12.0, 1800},
  6.     {ZL_BTN_CHKMODE_NO, GUI_DARKCYAN, GUI_DARKMAGENTA, &awefont24, "\uf144", "audio", 5},
  7. };
复制代码




3. 卡片面板实现代码

  1. // 卡片面板控件 ok
  2. int button_drawskin_batinfo(const WIDGET_ITEM_DRAW_INFO* pItem)
  3. {
  4.     BATINFO_USER_SKIN *pUsr;
  5.     GUI_RECT rect;
  6.     char acBuf[20];

  7.     int xSize;
  8.     int ySize;
  9.     int strXsizeLen;
  10.     int xPos;



  11.     switch (pItem->Cmd)
  12.     {
  13.     case WIDGET_ITEM_DRAW_TEXT:

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

  15.             rect.x0 = pItem->x0;
  16.             rect.x1 = pItem->x1;
  17.             rect.y0 = pItem->y0;
  18.             rect.y1 = pItem->y1;


  19.             GUI_SetFont(BUTTON_GetFont(pItem->hWin));
  20.             GUI_SetTextMode(GUI_TM_TRANS);
  21.             GUI_SetColor(GUI_LIGHTGREEN);

  22.             rect.y0 = rect.y1 / 12;


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


  24.             GUI_DispStringAt("CH", 3, rect.y0);
  25.             GUI_DispDecAt(pUsr->ch, 15 + 8, rect.y0, 2);


  26.             if (pUsr->sw == 1) {

  27.                 strXsizeLen = GUI_GetStringDistX("ON");

  28.                 GUI_SetColor(GUI_WHITE);
  29.                 GUI_AA_FillRoundedRect(63-2, rect.y0-2, 63+strXsizeLen+2, rect.y0+16, 2);
  30.                 GUI_SetColor(GUI_RED);

  31.                 GUI_DispStringAt("ON", 63, rect.y0);

  32.                 //
  33.                 GUI_SetColor(GUI_LIGHTGREEN);

  34.                 if (pUsr->mode == ZL_BATINFO_MODE_CC) {
  35.                     GUI_DispStringAt("CC", 58 + 40, rect.y0);
  36.                 }
  37.                 else if (pUsr->mode == ZL_BATINFO_MODE_CV) {
  38.                     GUI_DispStringAt("CV", 58 + 40, rect.y0);
  39.                 }
  40.                 else if (pUsr->mode == ZL_BATINFO_MODE_DC) {
  41.                     GUI_DispStringAt("DC", 58 + 40, rect.y0);
  42.                 }
  43.                 else if (pUsr->mode == ZL_BATINFO_MODE_ST) {
  44.                     GUI_DispStringAt("ST", 58 + 40, rect.y0);
  45.                 }


  46.                 // vol
  47.                 strXsizeLen = 0;

  48.                 sprintf(acBuf, "%.3f", pUsr->batV);
  49.                 GUI_SetFont(GUI_FONT_24B_ASCII);

  50.                 strXsizeLen += GUI_GetStringDistX(acBuf);

  51.                 GUI_SetFont(GUI_FONT_16B_ASCII);

  52.                 strXsizeLen += GUI_GetStringDistX("V");

  53.                 xPos = (WM_GetWindowSizeX(pItem->hWin) - strXsizeLen) / 2;

  54.                 GUI_GotoXY(xPos, rect.y0 + 60);
  55.                 GUI_SetFont(GUI_FONT_24B_ASCII);
  56.                 GUI_DispString(acBuf);

  57.                 GUI_GotoY(rect.y0 + 60 + (5));
  58.                 GUI_SetFont(GUI_FONT_16B_ASCII);
  59.                 GUI_DispString("V");



  60.                 // i
  61.                 strXsizeLen = 0;

  62.                 sprintf(acBuf, "%d", pUsr->batI);
  63.                 GUI_SetFont(GUI_FONT_24B_ASCII);

  64.                 strXsizeLen += GUI_GetStringDistX(acBuf);

  65.                 GUI_SetFont(GUI_FONT_16B_ASCII);

  66.                 strXsizeLen += GUI_GetStringDistX("mA");

  67.                 xPos = (WM_GetWindowSizeX(pItem->hWin) - strXsizeLen) / 2;

  68.                 GUI_GotoXY(xPos, rect.y0 + 60 + 25);
  69.                 GUI_SetFont(GUI_FONT_24B_ASCII);
  70.                 GUI_DispString(acBuf);

  71.                 GUI_GotoY(rect.y0 + 60 + + 25 + (5));
  72.                 GUI_SetFont(GUI_FONT_16B_ASCII);
  73.                 GUI_DispString("mA");

  74. //                GUI_DispDecAt(pUsr->power, 8 + 50, rect.y0 + 60 + 50, 4);
  75. //                GUI_DispString("mAh");

  76.             }
  77.             else {

  78.                 strXsizeLen = GUI_GetStringDistX("OFF");

  79.                 GUI_SetColor(GUI_WHITE);
  80.                 GUI_AA_FillRoundedRect(63-2, rect.y0-2, 63+strXsizeLen+2, rect.y0+16, 2);
  81.                 GUI_SetColor(GUI_RED);

  82.                 GUI_DispStringAt("OFF", 63, rect.y0);
  83.             }
  84.         break;

  85.     case WIDGET_ITEM_DRAW_BACKGROUND:

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

  87.             if (BUTTON_IsPressed(pItem->hWin))
  88.             {

  89.                 if (pUsr->sw == 1) {
  90.                     GUI_SetColor(pUsr->colorPressed);
  91.                 }
  92.                 else {
  93.                     GUI_SetColor(pUsr->colorPressed);
  94.                 }

  95.             }
  96.             else
  97.             {
  98.                 if (pUsr->sw == 1) {
  99.                     GUI_SetColor(pUsr->colorUnPress);
  100.                 }
  101.                 else {
  102.                     GUI_SetColor(pUsr->colorPressed);
  103.                 }
  104.             }

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

  106.             rect.x0 = pItem->x0;
  107.             rect.x1 = pItem->x1;
  108.             rect.y0 = pItem->y0;
  109.             rect.y1 = pItem->y1;




  110.             rect.y0 = rect.y1 / 5;


  111.             GUI_SetColor(GUI_GRAY_E7);

  112.             GUI_DrawHLine(rect.y0, rect.x0, rect.x1);


  113.             GUI_SetPenSize(2);
  114.             GUI_AA_DrawLine(pItem->x0 + 35, pItem->y0 + 1, pItem->x0 + 20 + 30, rect.y0 -1);


  115.             if (pUsr->Check == ZL_BTN_CHKMODE_UP){

  116.                 GUI_SetPenSize(5);
  117.                 GUI_SetColor(GUI_WHITE);
  118.                 GUI_DrawLine(pItem->x0, pItem->y0, pItem->x1, pItem->y0);
  119.             }

  120.             if (pUsr->Check == ZL_BTN_CHKMODE_DOWN){

  121.                 GUI_SetPenSize(5);
  122.                 GUI_SetColor(GUI_WHITE);
  123.                 GUI_DrawLine(pItem->x0, pItem->y1, pItem->x1, pItem->y1);
  124.             }

  125.             if (pUsr->Check == ZL_BTN_CHKMODE_LEFT){

  126.                 GUI_SetPenSize(5);
  127.                 GUI_SetColor(GUI_WHITE);
  128.                 GUI_DrawLine(pItem->x0, pItem->y0, pItem->x0, pItem->y1);
  129.             }

  130.             if (pUsr->Check == ZL_BTN_CHKMODE_RIGHT){

  131.                 GUI_SetPenSize(5);
  132.                 GUI_SetColor(GUI_WHITE);
  133.                 GUI_DrawLine(pItem->x1, pItem->y0, pItem->x1, pItem->y1);
  134.             }

  135.         break;

  136.     default:
  137.         {
  138.             return BUTTON_DrawSkinFlex(pItem);
  139.         }
  140.     }
  141.     return 0;
  142. }
复制代码





控制篇幅,只列出部分代码。


---
最后是工程源码:      emwin-uidemo7-cbprj.zip (6.27 MB, 下载次数: 114)


评分

参与人数 2金币 +60 收起 理由
ewrest + 10
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
 楼主| 发表于 2019-9-25 20:45:20 | 显示全部楼层
为了节约服务器空间和上传时间,本帖工程内不带字体文件。

需要到前的帖子 [STemWin] [原创开源]emWin导航界面支持Awesome图标字体 下载,复制到本帖工程内。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117619
QQ
发表于 2019-9-26 00:19:13 | 显示全部楼层
非常感谢楼主分享。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2019-9-26 09:38:39 | 显示全部楼层
赞! 简洁,美观,有效!
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2019-9-26 11:22:57 | 显示全部楼层
之前也想过做这个。。楼主这个是不能滑动的。。我想做的是那个可以滑动的。。
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
 楼主| 发表于 2019-9-26 11:44:06 | 显示全部楼层
cz123123 发表于 2019-9-26 11:22
之前也想过做这个。。楼主这个是不能滑动的。。我想做的是那个可以滑动的。。

是的,这个不支持。

emWin系统原生支持滑动,只要把它做长点,再稍加处理。。。

具体还是看需求。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-18 22:17 , Processed in 0.041903 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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