硬汉嵌入式论坛

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

[emWin] 关于spinbox显示的几点分享

[复制链接]

8

主题

59

回帖

83

积分

初级会员

积分
83
发表于 2017-9-25 10:14:38 | 显示全部楼层 |阅读模式
限于水平有限,也是新手,最近搞了几天spinbox,发现这个控件显示效果有限,但是可以自己扩展很多,大神可以自动忽略。如果有同样和我一样新手,可以参考一下。
spinbox控件显示可以显示整数,而且,如果范围是2位数,实际显示了1位数,前面就会出现0自动补齐,实际上并不好看 0.jpg
我使用的是我使用笨方法,获得
    hItem = WM_GetDialogItem(pMsg->hWin, ID_SPINBOX_0);
        SPINBOX_SetRange(hItem,1,100);
        SPINBOX_SetValue(hItem, value);//设置控件实际只
        Dis_Spinbox(hItem, value);    //显示结果

void Dis_Spinbox(SPINBOX_Handle hObj,u16 value)//自己增加的函数,用来显示控件数值
{
        char buff[10]="";
      EDIT_Handle hEdit;
    hEdit = SPINBOX_GetEditHandle(hObj);//返回附加的 EDIT 控件的句柄
        sprintf(buff,"%d",value);
        EDIT_SetText(hEdit, buff);
}
我是通过获得 EDIT 控件来操作spinbox 的显示。
同样的,如果你想显示带小数点的,也可以这么显示操作。
不过需要注意的是,当你的数据发生修改,也要同步修改显示值,在默认的回调函数处理里WM_NOTIFY_PARENT消息里,也要更新。
    case ID_SPINBOX_0: // Notifications sent by 'S_spo2_l'
      switch(NCode) {
                             case WM_NOTIFICATION_VALUE_CHANGED:
                            hItem = WM_GetDialogItem(pMsg->hWin, ID_SPINBOX_0);            
                            Dis_Spinbox(hItem,SPINBOX_GetValue(hItem));
        break;
如果你想显示浮点类型,必须要将显示的数据变量乘以10倍,显示时再强转成浮点值显示,因为spinbox控件只会对内容加减1.
这种方法可以是万能的。

碰到最复杂的显示,是想通过spinbox显示校准值,显示效果从-1.0-+1.0,浮点,带正负号,还要通过实体按键修改。我是这么操作的。
初始化时:
    hItem = WM_GetDialogItem(pMsg->hWin, ID_SPINBOX_1);
        SPINBOX_SetRange(hItem,-10,10);//设置的范围必须是整数
        Dis_Signed_Temp(hItem, value);    //设置显示的值,value变量是想要显示的值的10倍。显示0.1就必须是1,带符号浮点型
        hEdit = SPINBOX_GetEditHandle(hItem);
        EDIT_SetFloatMode(hEdit,(float)value/10.0,-1,1,1,GUI_EDIT_SIGNED);//设置为文本浮点模式


void Dis_Signed_Temp(SPINBOX_Handle hObj,signed short   int value)
{
      EDIT_Handle hEdit;

        hEdit = SPINBOX_GetEditHandle(hObj);
        EDIT_SetFloatValue(hEdit,value/10.0);
}
对应的回调里也要增加
                            case WM_NOTIFICATION_VALUE_CHANGED:
                            hItem = WM_GetDialogItem(pMsg->hWin, ID_SPINBOX_1);
                            Dis_Signed_Temp(hItem,SPINBOX_GetValue(hItem));
                            break;
实际上 EDIT 控件自带Float类型,只要直接调用,不用使用sprintf也可以。

评分

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

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
发表于 2017-9-25 11:30:16 | 显示全部楼层
非常感谢楼主,分享精神可赞,置酷[s:151]
回复

使用道具 举报

56

主题

905

回帖

1073

积分

至尊会员

积分
1073
发表于 2018-2-26 20:25:22 | 显示全部楼层
mark
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2018-4-9 11:28:51 | 显示全部楼层
对我们新手很有帮助
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 14:34 , Processed in 0.295770 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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