硬汉嵌入式论坛

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

[emWin] 请问emWin设置皮肤色的回调函数是否能一个函数设置多个皮肤?

[复制链接]

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2018-12-5 22:48:36 | 显示全部楼层 |阅读模式
如题,比如设置按钮皮肤的回调函数如下:
  1. int BUTTON_DrawSkin(const WIDGET_ITEM_DRAW_INFO* pButtonSkinItem)
  2. {
  3.         const GUI_POINT aPoint[] = {{15, 20}, {30, 20},{30, 10}};
  4.         const GUI_POINT bPoint[] = {{15, 40}, {30, 40},{30, 50}};

  5.         switch (pButtonSkinItem->Cmd)
  6.         {
  7.         case WIDGET_ITEM_DRAW_BACKGROUND:
  8.                 {

  9.                         if (BUTTON_IsPressed(pButtonSkinItem->hWin) == 0)
  10.                         {
  11.                                 GUI_SetColor(SkinColor[ColorIndex].Color2);
  12.                                 GUI_AA_FillCircle(pButtonSkinItem->x1*0.5, pButtonSkinItem->y1*0.5, (pButtonSkinItem->x1 - pButtonSkinItem->x0)*0.5);
  13.                                 GUI_SetColor(SkinColor[ColorIndex].Color5);
  14.                                 GUI_FillRect(5, 20, 12, 40);
  15.                                 GUI_FillRect(15, 20, 30, 40);
  16.                                 GUI_FillPolygon(aPoint, 3, 0, 0);
  17.                                 GUI_FillPolygon(bPoint, 3, 0, 0);
  18.                                
  19.                                 GUI_SetColor(SkinColor[ColorIndex].Color5);
  20.                                 GUI_SetPenSize(3);
  21.                                 GUI_AA_DrawLine(37, 24, 50, 36);        //¡á
  22.                                 GUI_AA_DrawLine(50, 24, 37, 36);        //¡á
  23.                                
  24.                                 GUI_AA_DrawArc(25, 30, 14, 25, 320, 400);  //|
  25.                                 GUI_AA_DrawArc(25, 30, 22, 25, 320, 400);  //|
  26.                         }
  27.                         else
  28.                         {
  29.                                 GUI_SetColor(SkinColor[ColorIndex].Color3);
  30.                         }
  31.                         break;
  32.                 }

  33.         default:
  34.                 {
  35.   return BUTTON_DrawSkinFlex(pButtonSkinItem);
  36.                 }
  37.         }
  38.         return 0;
  39. }
复制代码
但是这个函数只能设置一种皮肤的款式。
所以想问一下:
是否可以只用一个BUTTON_DrawSkin的函数就设置多个不同按钮的不同皮肤(举个例子:按钮1的皮肤和按钮2的皮肤不同,它们的皮肤都可以在函数1中完成,函数1中有某种机制可以区分出按钮1和按钮2)
还是需要用多个设置按钮皮肤的函数才能实现多个按钮设置不同皮肤?(举个例子:按钮1的皮肤要用函数1单独设置,按钮2的皮肤要用函数2单独设置......)


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-12-6 00:50:25 | 显示全部楼层
通过句柄pButtonSkinItem->hWin识别不同按钮即可。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-12-8 21:27:19 | 显示全部楼层
非常感谢!通过尝试,现在终于可以把所有按钮的皮肤都写到一个函数里面了!整个代码都简洁了很多
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2018-12-10 10:25:37 | 显示全部楼层
Angel 发表于 2018-12-8 21:27
非常感谢!通过尝试,现在终于可以把所有按钮的皮肤都写到一个函数里面了!整个代码都简洁了很多

我突然很想问问 能分享下到底简洁了啥?
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-12-11 19:58:37 | 显示全部楼层
cz123123 发表于 2018-12-10 10:25
我突然很想问问 能分享下到底简洁了啥?

比如说,我一个界面里面有20个按钮,共有5种不同的按钮样式。(圆的按钮、方的按钮、长条状按钮。。。)
以前是一个按钮样式就要写一个函数来绘制,这样就要写5个函数,调用的时候函数太多容易弄混,感觉不太方便。
现在只要一个函数就能自动判断对应的按钮,然后用switch case调用对应的绘制代码。无论什么按钮重绘,都统一调用1个函数:BUTTON_SetSkin()就解决了,所以简洁了一点
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-12-11 20:03:01 | 显示全部楼层
Angel 发表于 2018-12-11 19:58
比如说,我一个界面里面有20个按钮,共有5种不同的按钮样式。(圆的按钮、方的按钮、长条状按钮。。。)
...

况且我的界面里面还不仅仅只有Button控件,还有大量的其它控件,比如Checkbox、Knob、Radio、Spinbox等等,这些控件都要重新绘制皮肤,有的还不止一套皮肤。
现在我一个大类型的控件对应一个重绘皮肤的函数,就真的比较简洁了,而不是重绘皮肤的函数都一大堆
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2018-12-12 15:22:05 | 显示全部楼层
Angel 发表于 2018-12-11 20:03
况且我的界面里面还不仅仅只有Button控件,还有大量的其它控件,比如Checkbox、Knob、Radio、Spinbox等等 ...

大哥 分享下怎么区分长条 圆形 这些的啊 我也是几套皮肤
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-12-13 21:12:06 | 显示全部楼层
本帖最后由 Angel 于 2018-12-13 22:03 编辑

比如你有6个CheckBox,ID分别是分别是ID_CHECKBOX_A~ID_CHECKBOX_F,现在想让CHECKBOX_A~CHECKBOX_C为一组使用一种皮肤,CHECKBOX_D~CHECKBOX_F为一组使用另一种皮肤。
在保证它们的窗口ID是连续的情况下,就可以先在CheckBox回调函数初始化的地方使用以下代码设置自定义皮肤为函数CHECKBOX_DrawSkin:
  1. int i;
  2. for (i=ID_CHECKBOX_A; i<=ID_CHECKBOX_F; i++)
  3.                         {
  4.                                 hItem = WM_GetDialogItem(pMsg->hWin, i);
  5.                                 CHECKBOX_SetSkin(hItem, CHECKBOX_DrawSkin);
  6.                         }
复制代码


然后写入自定义皮肤的函数:

  1. int CHECKBOX_DrawSkin(const WIDGET_ITEM_DRAW_INFO* pCheckBoxSkinItem);

  2. int CHECKBOX_DrawSkin(const WIDGET_ITEM_DRAW_INFO* pCheckBoxSkinItem)
  3. {
  4.         int Id;
  5.         Id = WM_GetId(pCheckBoxSkinItem->hWin);
  6.         
  7.         switch (Id)
  8.         {
  9.         case ID_CHECKBOX_A:
  10.         case ID_CHECKBOX_B:
  11.         case ID_CHECKBOX_C:
  12.                 {
  13.                         switch (pCheckBoxSkinItem->Cmd)
  14.                         {
  15.                         case WIDGET_ITEM_DRAW_BUTTON:
  16.                                 {
  17.                                         if (CHECKBOX_IsChecked(pCheckBoxSkinItem->hWin) == 0)
  18.                                         {
  19.                                                 //在这里写入你想要绘制的图形代码(CheckBox_A~CheckBox_C没有打钩的图形)
  20.                                         }
  21.                                         else
  22.                                         {
  23.                                                 //在这里写入你想要绘制的图形代码(CheckBox_A~CheckBox_C打钩的图形)
  24.                                         }
  25.                                 }
  26.                                 break;
  27.                         }
  28.                         break;
  29.                 }

  30.          case ID_CHECKBOX_D:
  31.          case ID_CHECKBOX_E:
  32.          case ID_CHECKBOX_F:
  33.                 {
  34.                         switch (pCheckBoxSkinItem->Cmd)
  35.                         {
  36.                         case WIDGET_ITEM_DRAW_BUTTON:
  37.                                 {
  38.                                         if (CHECKBOX_IsChecked(pCheckBoxSkinItem->hWin) == 0)
  39.                                         {
  40.                                                 //在这里写入你想要绘制的图形代码(CheckBox_D~CheckBox_F没有打钩的图形)
  41.                                         }
  42.                                         else
  43.                                         {
  44.                                                 //在这里写入你想要绘制的图形代码(CheckBox_D~CheckBox_F打钩的图形)
  45.                                         }
  46.                                 }
  47.                                 break;
  48.                         }
  49.                         break;
  50.                 }
  51.                         
  52.         default:
  53.                 {
  54.                            //可以不写代码,也可以写入"return CHECKBOX_DrawSkinFlex(pCheckboxSkinItem);",写了的话CheckBox上面会多一个勾
  55.                 }
  56.         }
  57.         return 0;
  58. }
复制代码
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-12-13 21:27:09 | 显示全部楼层
cz123123 发表于 2018-12-12 15:22
大哥 分享下怎么区分长条 圆形 这些的啊 我也是几套皮肤

看我楼上回复,希望能帮到你
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2018-12-14 09:10:16 | 显示全部楼层
Angel 发表于 2018-12-13 21:27
看我楼上回复,希望能帮到你

这种只能在一个确定的且连续窗口用。。不然如果别的窗口ID刚好和这几个一样,又不是一样的控件,就没得玩。。不过还是谢谢。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 20:19 , Processed in 0.175089 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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