OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2241|回复: 4

emwin 自定义控件重绘后,按钮上文本如何实现外部任意改写。

[复制链接]

31

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2013-9-23
在线时间
44 小时
发表于 2023-6-28 11:16:58 | 显示全部楼层 |阅读模式
1金钱
我现在使用ucos 3   emwin5.3   由于界面控件经典模式按钮不好看,采用换肤skin模式,但是一个问题,换肤后很多功能受到限制,如:背景颜色不能随意更改、图片背景很不方便。因此想到采用  自定义方式  重写按键,回调函数重写按键属性,下面是我写的按键重绘的回调函数。
static void _cbButton2(WM_MESSAGE * pMsg)  //--------------(6)
{
    WM_HWIN  hWin;
    GUI_RECT Rect;
    hWin  = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
            WM_GetClientRect(&Rect);
            if (BUTTON_IsPressed(hWin))                                     //按键按下显示
            {
                GUI_SetColor(GUI_DARKGRAY);
                GUI_FillRoundedRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1, 5);
                GUI_SetBkColor(GUI_DARKGRAY);
                GUI_SetColor(GUI_WHITE);
            }
            else                                                                 //按键未按下显示
            {
                GUI_SetColor(GUI_LIGHTBLUE);
                GUI_FillRoundedRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1, 30);
                GUI_SetBkColor(GUI_LIGHTBLUE);
                GUI_SetColor(GUI_WHITE);   
            }

            GUI_SetFont(&GUI_Font16_ASCII);                                                                     //设置字体属性
            GUI_DispStringInRect("LED1", &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);        //按钮上面显示文本
            break;

        default:
            BUTTON_Callback(pMsg);
    }
}


问题是:如何在窗体回调函数中,将按钮文本内容传入   回调函数,在按键上显示出来。现在是不能更改按钮上面的  智能显示“ LED”

   hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
   WM_SetHasTrans(hItem);
   WM_SetCallback(hItem,_cbButton2);
   BUTTON_SetText(hItem, "200");
   BUTTON_SetFont(hItem, GUI_FONT_32_1);


有什么办法 在回调函数   得到   传过来的  文本  “200”,再在按钮上显示。
或者有什么办法实现我的需求,包括  更改 按钮背景颜色。

1687922252588.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

446

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4133
金钱
4133
注册时间
2018-5-14
在线时间
902 小时
发表于 2023-6-28 12:31:25 | 显示全部楼层
给按钮添加附加内存,可以是自定义结构体,传入附加字节的大小
        { BUTTON_CreateIndirect,        "Button DM",                ID_BUTTON_RIGHT,                                                        335,        640,                120,        80,        0,                0x0,                sizeof(GUI_BITMAP) },

创建后初始化
        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_RIGHT);
给按钮设置附加内存里的内容
        BUTTON_SetUserData(hItem, &bmimage_nobutton, sizeof(GUI_BITMAP));
        WM_SetCallback(hItem, _cb_Button);
        WM_ShowWindow(hItem);
按钮自定义回调函数
static void _cb_Button(WM_MESSAGE* pMsg)
{
        int xsize;
        int ysize;
        GUI_BITMAP image;
        xsize = WM_GetWindowSizeX(pMsg->hWin);
        ysize = WM_GetWindowSizeY(pMsg->hWin);

        switch (pMsg->MsgId)
        {
        case WM_PAINT:
//这里获取到附加内存的内容,我这里是一张图片
                BUTTON_GetUserData(pMsg->hWin, &image, sizeof(GUI_BITMAP));
                if (BUTTON_IsPressed(pMsg->hWin))
                {
                        GUI_DrawBitmap(&image, (xsize - image.XSize) / 2, (ysize - image.YSize) / 2+5);
                }
                else
                {
                        GUI_DrawBitmap(&image, (xsize - image.XSize) / 2, (ysize - image.YSize) / 2);
                }
                break;
        default:
                BUTTON_Callback(pMsg);
        }
}


原理是附加内存后,emwin会多申请内存给这个控件,多余的内存可以通过 SetUserData和GetUserData获取(实质是memcpy)


回复

使用道具 举报

31

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2013-9-23
在线时间
44 小时
 楼主| 发表于 2023-6-28 14:14:10 | 显示全部楼层
言外之意是通过附加内存传值,是吧。
回复

使用道具 举报

2

主题

446

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4133
金钱
4133
注册时间
2018-5-14
在线时间
902 小时
发表于 2023-6-28 14:48:14 | 显示全部楼层
jztvlxp 发表于 2023-6-28 14:14
言外之意是通过附加内存传值,是吧。

对,然后提供一个方法函数去修改这个控件的附加内存内容
回复

使用道具 举报

31

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2013-9-23
在线时间
44 小时
 楼主| 发表于 2023-6-29 12:07:46 | 显示全部楼层
谢谢  大师  我按你的方法可以了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 04:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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