搜索
bottom↓
回复: 12

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

[复制链接]

出0入8汤圆

发表于 2019-9-27 11:06:35 | 显示全部楼层 |阅读模式
关键字: emwin, 自定义控件,卡片面板


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


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


---
- 卡片面板

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

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

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




---
- APP截图

下面是部分APP截图


静态展示




动态展示






---
- 代码实现

##### 原理就是用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. }
复制代码





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


---
最后是工程源码:      

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入90汤圆

发表于 2019-9-27 11:31:58 | 显示全部楼层
做的不错,支持开源。

出0入0汤圆

发表于 2019-9-27 11:36:30 | 显示全部楼层
界面有点素,适合单色屏。

出0入0汤圆

发表于 2019-9-27 13:50:25 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2019-9-27 14:42:07 | 显示全部楼层
这个时候,没得美女背景图,怎么可以,快点找美工大神给你搞几个。

出0入0汤圆

发表于 2019-9-27 14:52:37 | 显示全部楼层
看起来不错,做UI是最难的活

出0入0汤圆

发表于 2019-9-27 14:59:08 | 显示全部楼层
。。。嗯,你以为我在玩游戏吗?
。。。嗯,难道不是吗???
。。。我在寻找UI素材灵感。

出500入109汤圆

发表于 2019-9-27 15:04:48 | 显示全部楼层
卖家秀与买家秀

出0入0汤圆

发表于 2019-9-27 15:24:02 | 显示全部楼层
不错的示例,支持一下

出0入8汤圆

 楼主| 发表于 2019-9-27 15:39:29 | 显示全部楼层
重庆酱油仔 发表于 2019-9-27 14:42
这个时候,没得美女背景图,怎么可以,快点找美工大神给你搞几个。

然而,我就是美工本人。。。

出0入0汤圆

发表于 2019-9-28 08:25:20 | 显示全部楼层
Jmhh247 发表于 2019-9-27 15:39
然而,我就是美工本人。。。

那该给你差评了,不说搞点泳装美女背景嘛,也得搞点自然风光啥。纯色板。。。

出0入8汤圆

 楼主| 发表于 2019-9-28 08:33:30 | 显示全部楼层
重庆酱油仔 发表于 2019-9-28 08:25
那该给你差评了,不说搞点泳装美女背景嘛,也得搞点自然风光啥。纯色板。。。 ...

好嘞,好嘞,竟无言以对。。。

出0入0汤圆

发表于 2020-10-22 22:08:48 | 显示全部楼层
这按钮是贴图吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 04:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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