硬汉嵌入式论坛

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

[emWin] 突发奇想,用emWin进度条控件做个表盘控件,效果不错

[复制链接]

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2016-6-14 15:59:25 | 显示全部楼层 |阅读模式
前段时间有客户问起emWin有没有表盘控件?一时语塞,才发现emWin还真没有表盘控件,SEGGER怎么了?
这几天突发奇想,为什么不用Progbar进度条控件改成表盘控件来用,因为它们性质和功能完全一样,只要把背景改一改,画个指针就完事,APP函数完全通用!自己还给它起了个好听的名字:ProgbarMeter控件。步骤如下:
(1)准备个表盘背景图片

image001.png

(2)把绘制Progbar控件的函数改成自定义绘制函数,这样我们想把Progbar控件画成什么样都行,emWin已经不参与这个控件的绘制工作了
  1. hItem = WM_GetDialogItem(pMsg->hWin, ID_PROGBAR_0);//获取句柄
  2. PROGBAR_SetSkin(hItem, SKIN_progbarmeter3C);//将这个PROGBAR控件改成自定义绘制函数
复制代码
(3)编写自定义绘制函数
  1. //ProgbarMeter控件的自定义绘制函数
  2. static int SKIN_progbarmeter(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo, unsigned char C)
  3. {
  4.     WM_HWIN hWin;
  5.     int x0, y0;
  6.     WINDOW_BMP *winBMP;
  7.     switch (pDrawItemInfo->Cmd)
  8.     {
  9.     case WIDGET_ITEM_CREATE:
  10.     //case WIDGET_ITEM_DRAW_BACKGROUND:
  11.     case WIDGET_ITEM_DRAW_FRAME:
  12.     //case WIDGET_ITEM_DRAW_TEXT:
  13.         break;
  14.     default: return PROGBAR_DrawSkinFlex(pDrawItemInfo);//emWin默认控件绘制函数
  15.     case WIDGET_ITEM_DRAW_BACKGROUND:
  16.         hWin = (WM_GET_PARENT[C-2])(pDrawItemInfo->hWin);//位于第几层修改这里(WM_GetParent数=层数-2)
  17.         WM_GetUserData(hWin, &winBMP, sizeof(winBMP));//从用户数据区读出"页面图片结构体"指针
  18.         //获取此控件相对于主页面(比如:背景WM_HBKWIN->WINDOW)位置偏移坐标
  19.         x0 = WM_GetWindowOrgX(hWin) - WM_GetWindowOrgX(pDrawItemInfo->hWin);
  20.         y0 = WM_GetWindowOrgY(hWin) -WM_GetWindowOrgY(pDrawItemInfo->hWin);
  21.         PROGBARMETER_SetUserClip(pDrawItemInfo);//设置1个用户剪切区
  22.         if(((PROGBAR_SKINFLEX_INFO *)pDrawItemInfo->p)->Index == PROGBAR_SKINFLEX_L)
  23.             GUI_DrawBitmap(winBMP->normal, x0, y0);//从页面坐标显示图片,emWin会自己剪切出这个控件范围的图片
  24.         else if(((PROGBAR_SKINFLEX_INFO *)pDrawItemInfo->p)->Index == PROGBAR_SKINFLEX_R)
  25.             GUI_DrawBitmap(winBMP->normal, x0, y0);
  26.         else BUTTON_DrawSkinFlex(pDrawItemInfo);
  27.         WM_SetUserClipRect(0);
  28.         break;
  29.   case WIDGET_ITEM_DRAW_TEXT:
  30.             PROGBARMETER_DispNeedle(pDrawItemInfo, 150, -150, 0, 100);
  31.             return PROGBAR_DrawSkinFlex(pDrawItemInfo);
  32.     }
  33.     return 0;
  34. }
复制代码
(4)编写表盘指针绘制函数
  1. static const GUI_POINT _aNeedle[] = {{-3, 0}, {-2, -70}, {0, -80}, {2, -70}, {3, 0}};
  2. //ProgbarMeter控件指针绘制函数
  3. static void PROGBARMETER_DispNeedle(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo, short angleBEG, short angleEND, short valMIN, short valMAX)
  4. {
  5.     GUI_POINT aPoints[GUI_COUNTOF(_aNeedle)];
  6.     GUI_RECT r;
  7.     float Angle;
  8.     short Value; char i, Text[8], *p = (char *)((PROGBAR_SKINFLEX_INFO *)pDrawItemInfo->p)->pText;
  9.     for(i=0; i<7; i++){Text[i] = *p++; Text[i+1] = 0; if(*p == '%') break;}
  10.     Value = atoi(Text); if(Value<valMIN) Value = valMIN; if(Value>valMAX) Value = valMAX;
  11.     Angle = angleBEG - (abs(angleEND-angleBEG)/(valMAX-valMIN))*Value;
  12.     //PROGBAR_GetMinMax(pDrawItemInfo->hWin, &valMIN, &valMAX);//emwin v5.30
  13.     //Angle = angleBEG - (abs(angleEND-angleBEG)/(valMAX-valMIN))*PROGBAR_GetValue(pDrawItemInfo->hWin);//emwin v5.30
  14.     Angle *= 3.1415926f / 180;
  15.     GUI_SetColor(0x35bf5f);
  16.     GUI_RotatePolygon(aPoints, _aNeedle, GUI_COUNTOF(_aNeedle), Angle);
  17.     WM_GetWindowRectEx(pDrawItemInfo->hWin, &r);
  18.     GUI_FillPolygon(aPoints, GUI_COUNTOF(aPoints), (r.x1-r.x0)/2, (r.y1-r.y0)/2);
  19. }
复制代码
image003.png


emWin表盘控件效果演示.rar (252 KB, 下载次数: 168)
emWin表盘控件源码.rar (2.99 MB, 下载次数: 363)

评分

参与人数 1 +5 收起 理由
eric2013 + 5

查看全部评分

精美、便捷的emWin界面设计-GLCD
回复

使用道具 举报

219

主题

1110

回帖

1777

积分

至尊会员

More we do, more we can do.

积分
1777
发表于 2016-6-14 16:11:52 | 显示全部楼层
干得漂亮
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2016-6-14 16:15:48 | 显示全部楼层

回 emwin 的帖子

emwin:干得漂亮 (2016-06-14 16:11) 
[s:151]
精美、便捷的emWin界面设计-GLCD
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-6-15 00:29:04 | 显示全部楼层
感谢楼主分享[s:151]
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2016-6-15 10:51:34 | 显示全部楼层
[s:151]
回复

使用道具 举报

7

主题

61

回帖

82

积分

初级会员

积分
82
发表于 2016-6-15 14:56:00 | 显示全部楼层
不错 很好看
回复

使用道具 举报

7

主题

61

回帖

82

积分

初级会员

积分
82
发表于 2016-6-15 15:03:21 | 显示全部楼层
这个源文件打开后怎么编译呢?没有玩儿过,很想把他和这个程序稍微改一下
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2016-6-15 16:27:09 | 显示全部楼层

回 toutou205 的帖子

toutou205:这个源文件打开后怎么编译呢?没有玩儿过,很想把他和这个程序稍微改一下
 (2016-06-15 15:03) 
我用的是codeblocks开发环境,你可以看看这个入门教程http://www.neqee.com/content/?149.html
精美、便捷的emWin界面设计-GLCD
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2016-6-15 16:33:10 | 显示全部楼层

回 eric2013 的帖子

eric2013:感谢楼主分享[s:151]  (2016-06-15 00:29) 
[s:130] 想改个软键盘控件,硬汉兄有没有好的想法?
精美、便捷的emWin界面设计-GLCD
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-6-16 11:19:22 | 显示全部楼层

回 g_lcd 的帖子

g_lcd:[s:130] 想改个软键盘控件,硬汉兄有没有好的想法? (2016-06-15 16:33) 
汉字输入类的吗,封装一个类似手机界面的全拼或者9T的汉字输入法就挺好。
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2016-6-16 11:51:03 | 显示全部楼层
干得漂亮
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2016-6-16 11:51:08 | 显示全部楼层
干得漂亮
回复

使用道具 举报

7

主题

61

回帖

82

积分

初级会员

积分
82
发表于 2016-6-16 14:51:18 | 显示全部楼层

回 g_lcd 的帖子

g_lcd:我用的是codeblocks开发环境,你可以看看这个入门教程http://www.neqee.com/content/?149.html (2016-06-15 16:27) 
好的,谢谢
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2016-6-22 02:13:44 | 显示全部楼层

回 eric2013 的帖子

eric2013:汉字输入类的吗,封装一个类似手机界面的全拼或者9T的汉字输入法就挺好。 (2016-06-16 11:19) 
如果把输入法也集成进去就太累人了!只想做个控件而已,因为现在大家都是用几十个按键来实现软键盘的,这样耗RAM而且不好管理。已经搞的差不多了,改天发出来给大家看看[s:150]
精美、便捷的emWin界面设计-GLCD
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-6-22 10:00:43 | 显示全部楼层

回 g_lcd 的帖子

g_lcd:如果把输入法也集成进去就太累人了!只想做个控件而已,因为现在大家都是用几十个按键来实现软键盘的,这样耗RAM而且不好管理。已经搞的差不多了,改天发出来给大家看看[s:150] (2016-06-22 02:13) 
[s:142]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-17 08:53 , Processed in 0.053262 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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