硬汉嵌入式论坛

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

[emWin] emWin 修改RADIO控件圆圈大小的办法,增加背景色调整04.09

[复制链接]

2

主题

72

回帖

83

积分

初级会员

积分
83
发表于 2020-4-6 17:30:03 | 显示全部楼层 |阅读模式
本帖最后由 tsetse 于 2020-4-9 10:16 编辑

emWin 的 Radio 控件用着总感有点鸡肋,使能了皮肤,就没办法修改背景色,不能直接设置,但是找到一种可用的背景填充方案;不使用皮肤,就不能修改控制圆圈的大小。不知道设计这个控件的大佬是怎么想的" />


回到正题,看到还是有人问怎么修改圆圈的大小,单独写一帖子吧。

emWin 5.32以后,默认开启皮肤的,如果没有开启,可使用以下语句

        GUI_Init();
        RADIO_SetDefaultSkin(RADIO_SKIN_FLEX); // 在GUI_Init 之后开启

开启皮肤后,如果都设置成统一的大小,可接着使用以下语句完成
        RADIO_SKINFLEX_PROPS radioProps;

        RADIO_GetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_UNPRESSED);
        radioProps.ButtonSize = 24;
        RADIO_SetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_UNPRESSED);

        RADIO_GetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_PRESSED);
        radioProps.ButtonSize = 24;
        RADIO_SetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_PRESSED);

如果是要单独设置不同的大小的话,就需要使用到回调函数了,可以每个控制使用单独的回调函数,也可以使用统一的函数通过 ID 来区分,测试代码如下

static void _cbRadioUser(WM_MESSAGE* pMsg)
{
        RADIO_SKINFLEX_PROPS radioProps;

        switch (pMsg->MsgId) {

        case WM_PRE_PAINT:
                RADIO_GetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_UNPRESSED);
                switch (WM_GetId(pMsg->hWin))
                {
                case GUI_ID_RADIO0: radioProps.ButtonSize += 2; break;
                case GUI_ID_RADIO1: radioProps.ButtonSize += 4; break;
                case GUI_ID_RADIO2: radioProps.ButtonSize += 8; break;
                case GUI_ID_RADIO3: radioProps.ButtonSize += 24; break;
                default:
                        break;
                }

                // 此过程还可以修改圈的颜色

                radioProps.aColorButton[0] = GUI_RED;                // 外圈色
                radioProps.aColorButton[1] = GUI_GREEN;                // 中圈色
                radioProps.aColorButton[2] = GUI_BLUE;                // 内圈色
                radioProps.aColorButton[3] = GUI_YELLOW;        // 内实心填充色

                RADIO_SetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_UNPRESSED);

                RADIO_GetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_PRESSED);
                switch (WM_GetId(pMsg->hWin))
                {
                case GUI_ID_RADIO0: radioProps.ButtonSize += 2; break;
                case GUI_ID_RADIO1: radioProps.ButtonSize += 4; break;
                case GUI_ID_RADIO2: radioProps.ButtonSize += 8; break;
                case GUI_ID_RADIO3: radioProps.ButtonSize += 24; break;
                default:
                        break;
                }

                radioProps.aColorButton[0] = GUI_RED;                // 外圈 Outer
                radioProps.aColorButton[1] = GUI_GREEN;                // 中圈 Middle
                radioProps.aColorButton[2] = GUI_YELLOW;        // 内圈 Inner
                radioProps.aColorButton[3] = GUI_BLUE;                // 内圈实心填充色
                RADIO_SetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_PRESSED);

               
                break;

        case WM_POST_PAINT:
                RADIO_GetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_UNPRESSED);
                switch (WM_GetId(pMsg->hWin))
                {
                case GUI_ID_RADIO0: radioProps.ButtonSize -= 2; break;
                case GUI_ID_RADIO1: radioProps.ButtonSize -= 4; break;
                case GUI_ID_RADIO2: radioProps.ButtonSize -= 8; break;
                case GUI_ID_RADIO3: radioProps.ButtonSize -= 24; break;
                default:
                        break;
                }
                RADIO_SetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_UNPRESSED);

                RADIO_GetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_PRESSED);
                switch (WM_GetId(pMsg->hWin))
                {
                case GUI_ID_RADIO0: radioProps.ButtonSize -= 2; break;
                case GUI_ID_RADIO1: radioProps.ButtonSize -= 4; break;
                case GUI_ID_RADIO2: radioProps.ButtonSize -= 8; break;
                case GUI_ID_RADIO3: radioProps.ButtonSize -= 24; break;
                default:
                        break;
                }
                RADIO_SetSkinFlexProps(&radioProps, RADIO_SKINFLEX_PI_PRESSED);
                break;


        case WM_PAINT:
                switch (WM_GetId(pMsg->hWin))
                {
                case GUI_ID_RADIO0: GUI_SetBkColor(GUI_GRAY_C8); break;
                case GUI_ID_RADIO1: GUI_SetBkColor(GUI_GRAY_AA); break;
                case GUI_ID_RADIO2: GUI_SetBkColor(GUI_GRAY_7C); break;
                case GUI_ID_RADIO3: GUI_SetBkColor(GUI_GRAY_55); break;
                default:
                        break;
                }
               
                GUI_Clear();// 用背景色填充显示区域
                RADIO_Callback(pMsg);//执行默认的控件绘制
                break;

        default:
                RADIO_Callback(pMsg);
                break;
        }
}




void MainTask(void)
{
        WM_HWIN hItem;

        GUI_Init();

        WM_SetCreateFlags(WM_CF_MEMDEV);

        GUI_SetColor(GUI_BLACK);
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();

        GUI_SetFont(GUI_FONT_32_ASCII);
        GUI_DispStringHCenterAt("Hello World!", LCD_GetXSize() / 2, 16);


        hItem = RADIO_CreateEx(16, 64, 180, 48, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_RADIO0, 2, 24);
        RADIO_SetFont(hItem, GUI_FONT_20_ASCII);
        RADIO_SetText(hItem, "TEST1.1", 0);
        RADIO_SetText(hItem, "TEST1.2", 1);
        RADIO_SetTextColor(hItem, GUI_RED);
        WM_SetCallback(hItem, _cbRadioUser);

        hItem = RADIO_CreateEx(16, 120, 180, 64, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_RADIO1, 2, 32);
        RADIO_SetFont(hItem, GUI_FONT_24_ASCII);
        RADIO_SetText(hItem, "TEST2.1", 0);
        RADIO_SetText(hItem, "TEST2.2", 1);
        WM_SetCallback(hItem, _cbRadioUser);

        hItem = RADIO_CreateEx(16, 192, 180, 64, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_RADIO2, 2, 32);
        RADIO_SetFont(hItem, GUI_FONT_32_ASCII);
        RADIO_SetText(hItem, "TEST3.1", 0);
        RADIO_SetText(hItem, "TEST3.2", 1);
        RADIO_SetTextColor(hItem, GUI_BLUE);
        WM_SetCallback(hItem, _cbRadioUser);

        hItem = RADIO_CreateEx(240, 108, 180, 128, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_RADIO3, 2, 64);
        RADIO_SetFont(hItem, GUI_FONT_32_ASCII);
        RADIO_SetText(hItem, "TEST4.1", 0);
        RADIO_SetText(hItem, "TEST4.2", 1);
        RADIO_SetTextColor(hItem, GUI_LIGHTGREEN);
        WM_SetCallback(hItem, _cbRadioUser);

        while (1) {

                GUI_Delay(50);
        }
}



radio.png

RADIO1.png

RADIO2.png

MainTask.c (4.18 KB, 下载次数: 11)











评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2020-4-6 21:53:41 | 显示全部楼层
您这是把自己的问题给解决了是吧。。。厉害厉害
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2020-4-7 08:25:23 | 显示全部楼层
非常感谢楼主分享。
回复

使用道具 举报

2

主题

72

回帖

83

积分

初级会员

积分
83
 楼主| 发表于 2020-4-7 09:01:12 | 显示全部楼层
myxiaonia 发表于 2020-4-6 21:53
您这是把自己的问题给解决了是吧。。。厉害厉害

看到另外一个坛友在之前的每个帖子下问了一遍,硬汉只说了皮肤色修改,可能他也没看明白。

之前自己也遇到过这个问题,当把字体放大的时候,圆圈还是那个尺寸,看着就别扭,后来怎么发现的已经记不清了,必也是参考了别人的提示,但是没有看到详细解决方案的办法的帖子,所以把它写出来了
回复

使用道具 举报

2

主题

72

回帖

83

积分

初级会员

积分
83
 楼主| 发表于 2020-4-7 09:02:39 | 显示全部楼层
eric2013 发表于 2020-4-7 08:25
非常感谢楼主分享。

从这里学到了很多,有机会也要分享一下
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2020-4-7 11:22:35 | 显示全部楼层
学习了,感谢楼主分享。
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2020-4-7 11:25:39 | 显示全部楼层
学习了,感谢楼主分享,还有就是使用Radio控件,会出现字体下沉,这个有办法解决吗?
回复

使用道具 举报

2

主题

72

回帖

83

积分

初级会员

积分
83
 楼主| 发表于 2020-4-7 13:59:45 | 显示全部楼层
wode112233 发表于 2020-4-7 11:25
学习了,感谢楼主分享,还有就是使用Radio控件,会出现字体下沉,这个有办法解决吗?

字体下沉指的是什么样的显示效果?没有遇到过字体的显示问题,除了首行会被削顶
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2020-4-7 19:36:24 | 显示全部楼层
tsetse 发表于 2020-4-7 13:59
字体下沉指的是什么样的显示效果?没有遇到过字体的显示问题,除了首行会被削顶

图片中这样的效果,字体下沉
QQ截图20200407193157.png
回复

使用道具 举报

2

主题

72

回帖

83

积分

初级会员

积分
83
 楼主| 发表于 2020-4-7 20:55:25 | 显示全部楼层
wode112233 发表于 2020-4-7 19:36
图片中这样的效果,字体下沉

选中非第一行,看看虚线框的位置

另外,用了哪个版本的库?你的字体文件在 电脑模拟器上是不是也是这种效果?
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2020-4-21 19:07:00 | 显示全部楼层
tsetse 发表于 2020-4-7 20:55
选中非第一行,看看虚线框的位置

另外,用了哪个版本的库?你的字体文件在 电脑模拟器上是不是也是这 ...

用的V5.32版本的库
QQ截图20200421190506.bmp
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-5-3 10:26:10 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 03:40 , Processed in 0.195594 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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