硬汉嵌入式论坛

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

[emWin] 如何实现多个BUTTON控件相互相应?

[复制链接]

14

主题

35

回帖

14

积分

初级会员

积分
14
发表于 2017-7-3 17:40:49 | 显示全部楼层 |阅读模式
参照教程,已做成按键效果如下

71.jpg     72.jpg

代码分享如下:

static int _DrawSkin_BUTTON_Menu(const WIDGET_ITEM_DRAW_INFO *pDrawItemInfo)
{
    char acBuffer[20];
    GUI_RECT Rect;

    switch (pDrawItemInfo->Cmd)
    {
        case WIDGET_ITEM_DRAW_BACKGROUND:
            GUI_SetColor(GUI_WHITE);
            GUI_AA_DrawRoundedRect(pDrawItemInfo->x0, pDrawItemInfo->y0, pDrawItemInfo->x1, pDrawItemInfo->y1, 0);

            if (BUTTON_IsPressed(pDrawItemInfo->hWin))
            {
                GUI_SetColor(0xD59B16);
                GUI_AA_FillRoundedRect(pDrawItemInfo->x0+1, pDrawItemInfo->y0, pDrawItemInfo->x1-1, pDrawItemInfo->y1, 0);

            }
            else
            {
                GUI_SetColor(0xD7D7D7);
                GUI_AA_FillRoundedRect(pDrawItemInfo->x0+1, pDrawItemInfo->y0, pDrawItemInfo->x1-1, pDrawItemInfo->y1, 0);
            }
            break;

        case WIDGET_ITEM_DRAW_TEXT:
            BUTTON_GetText(pDrawItemInfo->hWin, acBuffer, sizeof(acBuffer));
            Rect.x0 = pDrawItemInfo->x0;
            Rect.y0 = pDrawItemInfo->y0;
            Rect.x1 = pDrawItemInfo->x1;
            Rect.y1 = pDrawItemInfo->y1;

            GUI_SetFont(GUI_FONT_16B_ASCII);
            GUI_SetTextMode(GUI_TM_TRANS);
            if (BUTTON_IsPressed(pDrawItemInfo->hWin))
            {

                GUI_SetColor(GUI_WHITE);
                GUI_DispStringInRect(acBuffer, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);   
            }
            else
            {
                GUI_SetColor(GUI_BLACK);
                GUI_DispStringInRect(acBuffer, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);   
            }
            break;

        default:
            return BUTTON_DrawSkinFlex(pDrawItemInfo);
    }

    return 0;
}

但是,上图也仅仅是按下的效果,一松开又变回灰底黑字,想达到的效果是:
按下button1保持按下状态(蓝底白字),按下其他button(比如button2),则此时button2保持按下状态(蓝底白字),button1自动弹起(灰底黑字),如下所示效果:
73.jpg    74.jpg    75.jpg




因为涉及到不同按键之间的相互相应,不知如何实现? 或者是否应该选择其他控件(比如MENU,但这个自己构建皮肤函数不知如何下手。。)?
请赐教,谢谢!
回复

使用道具 举报

4

主题

23

回帖

35

积分

新手上路

积分
35
发表于 2017-7-3 19:27:51 | 显示全部楼层
把每个按钮的句柄设为全局,按下其中任何一个的按钮,在回调函数响应该按钮的按下消息里设置3个按钮的属性即可。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-7-4 09:07:49 | 显示全部楼层
我觉得把这三个按钮,通过你按钮自定义回调函数,用一个按钮来实现即可,进入按钮回调函数,获取当前的按下区域,设置相应效果即可。
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-7-4 09:47:18 | 显示全部楼层

回 just_do_it 的帖子

just_do_it:把每个按钮的句柄设为全局,按下其中任何一个的按钮,在回调函数响应该按钮的按下消息里设置3个按钮的属性即可。 (2017-07-03 19:27) 
按照你所说的方法,点击某个按钮时,回调函数只能够响应当前按钮给过来的信息,然后改变当下按钮的属性。如何做到其他按钮也能够收到信息作出相应呢?[s:120]
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-7-4 09:54:32 | 显示全部楼层

回 eric2013 的帖子

eric2013:我觉得把这三个按钮,通过你按钮自定义回调函数,用一个按钮来实现即可,进入按钮回调函数,获取当前的按下区域,设置相应效果即可。 (2017-07-04 09:07) 
1、这种方法看似可行哦,但是在回调函数里面如何使用BUTTON_IsPressed判断哪个区域被按下呢?
2、另外,在消息里面,不同按钮按下会打开不同的子窗口,是不是只能在按钮的回调函数里面调用子窗口打开函数呢?
谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-7-4 14:49:32 | 显示全部楼层

回 mumuha 的帖子

mumuha:1、这种方法看似可行哦,但是在回调函数里面如何使用BUTTON_IsPressed判断哪个区域被按下呢?
2、另外,在消息里面,不同按钮按下会打开不同的子窗口,是不是只能在按钮的回调函数里面调用子窗口打开函数呢?
谢谢 (2017-07-04 09:54) 
通过函数,获取当前点击的坐标位置,GUI_PID_GetState()
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-7-4 15:34:33 | 显示全部楼层

回 eric2013 的帖子

eric2013:通过函数,获取当前点击的坐标位置,GUI_PID_GetState() (2017-07-04 14:49) 
上述目标效果想通过外部按键来实现,GUI_PID_GetState()貌似只对指针输入有效是么?[s:128]
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-7-4 16:46:40 | 显示全部楼层

回 mumuha 的帖子

mumuha:上述目标效果想通过外部按键来实现,GUI_PID_GetState()貌似只对指针输入有效是么?[s:128] (2017-07-04 15:34)
外部按键给这个窗口发自定义消息。在回调消息里面将按键无效化,从而让按钮执行下重绘。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 13:17 , Processed in 1.656390 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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