OpenEdv-开源电子网

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

UCGUI中如何让EDIT不断更新数据?

[复制链接]

11

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-3-15
在线时间
0 小时
发表于 2014-4-30 21:35:40 | 显示全部楼层 |阅读模式
static void _cbCallback4(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {        case WM_PAINT:
                        break;
        case WM_INIT_DIALOG:
            InitDialog4(pMsg);
            break;
                case WM_TIMER:        
                    EDIT_SetDecMode(WM_GetDialogItem(hWin,GUI_ID_EDIT3),100,0,65536,2,0);//设置编辑框的十进制模式
                EDIT_SetValue(WM_GetDialogItem(hWin,GUI_ID_EDIT3),(U32)DATA.aY++);//设置编辑区当前的数值  
            break;      
        case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);
                    break;
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hWin, 0);
                    break;
            }
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;        
            switch (NCode)
            {
                  case WM_NOTIFICATION_RELEASED:  //仅仅释放时才有反应
                                       switch(Id)
                                            {
                                              case GUI_ID_BUTTON0:
                                                  FRAMEWIN_Delete(hWin);          //删除界面
                                                  GUI_CreateDialogBox(_aDialogCreate1,GUI_COUNTOF(_aDialogCreate1),&_cbCallback1,0,0,0);// 创建一个对话框(即主界面)     
                                                }
                                       // break;
                                   //case WM_NOTIFICATION_VALUE_CHANGED: /* Value has changed */
                  
                                 //   break;

            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}我是将EDIT放在了WM_TIMER机制下绘制。。但是不行,原来放在WM_PAINT下也不行。。太痛苦了。。怎么办?求助啊
收藏
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-2-20
在线时间
0 小时
发表于 2015-5-6 20:55:18 | 显示全部楼层
首先我也是新手,这里分享下我的经验,本来是可以通过这两行函数来刷新EDIT框里的数值:
    EDIT_SetDecMode(WM_GetDialogItem(hWin,GUI_ID_EDIT0),100,0,65536,0,0);//设置十进制模式
     EDIT_SetValue(WM_GetDialogItem(hWin,GUI_ID_EDIT0),320);//设置EDIT框里的数值,320可以使任意变量,我这里是常数320;
但是由于我的情况是ucgui通过UCGUIBUILDER建立了maintask();后程序会一直停留在GUI_ExecDialogBox这里面,等待触发动作即点击控件等动作来GUI_Exec;至于具体原理我也是模模糊糊的;所以没有触发是不会重绘敞口的(刷新数据的);
用硬件仿真器观察,程序进入GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0)后就再也没出来,
跟踪进入 GUI_ExecDialogBox发现程序在GUI_ExecCreatedDialog里没出来,再进入GUI_ExecCreatedDialog里发现程序在
  while (!DialogStatus.Done) {
    if (!GUI_Exec()) {
      GUI_X_WAIT_EVENT();      /* Wait for event (keyboard, mouse or whatever) */
    }
  }
程序在这里一直循环,不知道为什么。
所以重点解决方法来了:
我猜想可以通过单片机本身的中断来进入更新数据;可以使定时中断或者串口中断或其他中断,我这里用的是串口中断,串口中断usart.c(原子哥战舰板源程序)接受完数据后(我自己的任务需要)接受完标志USART_RX_STA|=0x8000后;调用这两个函数(要在usart.c用这两个函数就要在usart.h头文件包含gui和edit相关头文件),其中这个句柄WM_GetDialogItem(hWin,GUI_ID_EDIT0),我通过在maintask.c文件里先定义变量I16 jubing=0;jubing=WM_GetDialogItem(hWin,GUI_ID_EDIT0);来保存edit编辑框句柄,再在maintask.h头文件申明为外部共享变量extern I16 jubing;最后再包含在usar.h头文件中包含,那么就可以在usart.c串口中断里调用了。  
    EDIT_SetDecMode(jubing,100,0,65536,0,0);//对比上式,由于
     EDIT_SetValue(jubing,adate[0]*10+adate[1]);// 
    USART_RX_STA=0;//注意这一句在原子哥这里是用来表示接收状态标志被清除,本应该在主函数中调用,但由于我主函数中因为上述原因进不去,所以就再接收中断里接收完数据保存在adate【】数组中后并更新edit框后就将接收状态标志USART_RX_STA清0,方便下一次接收,不然下次接收不了。
同样是新手,方知经验来之不易,贵在分享,希望能帮到你。
回复 支持 1 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-30 23:33:22 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2014-5-1 22:39:30 | 显示全部楼层
要放在按键或者触摸里面
态度决定一切
回复 支持 反对

使用道具 举报

11

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-3-15
在线时间
0 小时
 楼主| 发表于 2014-5-9 20:30:35 | 显示全部楼层
回复【3楼】冰封嗜魔:
-------------------------------谢谢你的回答,好像也只能这样了,当有触摸或按键激发时 才可以刷新数据。。。
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2014-8-19
在线时间
13 小时
发表于 2015-2-5 16:08:45 | 显示全部楼层
LZ
现在解决了么?  我想实时的不要触摸来触发   或者说我触发一次之后就能一直显示,我做了多任务 但是也不能实时的显示,要重新进入才会更改
希望与更多的电子爱好者交朋友
回复 支持 反对

使用道具 举报

11

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2013-4-22
在线时间
0 小时
发表于 2015-5-7 09:53:07 | 显示全部楼层
关于“程序会一直停留在GUI_ExecDialogBox这里面”这个问题,前几天我也遇到了,while (!DialogStatus.Done)这是一个死循环,我直接的感觉它的作用有实时执行GUI_Exec()监视界面变化,进行重绘的作用,为了使程序能跳出这个死循环,接着执行主函数中的程序,我是将这个死循环屏蔽了,然后设置一个定时器中断,定时执行GUI_Exec()来进行界面的重绘。我的做法可能有失妥当,但且当做一个实例吧,分享给大家。
山登绝顶我为峰!
回复 支持 反对

使用道具 举报

6

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
763
金钱
763
注册时间
2013-4-23
在线时间
119 小时
发表于 2015-10-28 22:02:40 | 显示全部楼层
回复【7楼】田晓生:
---------------------------------
这是阻塞建立的。用非阻塞建立就不会出现这个问题
MJM_天行健,君子以自强不息;地势坤,君子以厚德载物;
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 21:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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