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

2019-12-10 18:17发布

关键字: emwin, 自定义控件,卡片面板


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


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


---
- 卡片面板

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

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

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

batinfo-g.gif (182.73 KB, 下载次数: 0) 下载附件 2019-9-27 10:59 上传




---
- 代码实现

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


1. 结构体类型


  1. typedef struct {
  2.     int Check;
  3.     GUI_COLOR colorPressed;
  4.     GUI_COLOR colorUnPress;
  5.     GUI_FONT *iconFont;
  6.     char iconName[6];
  7.     char btnText[10];
  8.     int ch;
  9.     int sw;
  10.     int mode;
  11.     float batV;
  12.     int batI;
  13.     float power;
  14. } 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, 下载次数: 20) 2019-9-27 11:01 上传 点击文件名下载附件

(因为附件大小限制,本帖工程内不带字体文件,需要去第一个帖子里下载,点我的头像主题进去~)


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。