搜索
bottom↓
回复: 8

界面刷新和控制疑问

[复制链接]

出0入0汤圆

发表于 2014-2-21 16:18:10 | 显示全部楼层 |阅读模式
现在在作一个控制设备的界面,对于界面的刷新和控制要怎么处理有些疑问:

1.定义要关事件,此事件发生,按此事件在界面更新处理函数中查找对应处理来更新界面内容.然后再按此事件在控制处

理函数中查找对应的处理来完成控制功能.
while(1)
{
  switch(事件)
  {
    case 事件1:
   
      break;
    case 事件2:
      事件2界面更新;   
      break;
    ......
    default:

      break;
  }

  switch(事件)
  {
    case 事件1:
   
      break;
    case 事件2:
      事件2控制发出;   
      break;
    ......
    default:

      break;
  }
}

2.定义要关事件,此事件发生,按此事件在界面更新处理函数中查找对应处理来更新界面内容,然后直接在对应处发出控

制.
while(1)
{
  switch(事件)
  {
    case 事件1:
   
      break;
    case 事件2:
      事件2界面更新;
      事件2控制发出;
      break;
    ......
    default:

      break;
  }
}

那种好呢?大家还有更好的方法么?谢谢!

出130入129汤圆

发表于 2014-2-21 16:23:32 | 显示全部楼层
2紧凑一些

出0入0汤圆

发表于 2014-2-21 16:42:29 | 显示全部楼层
本帖最后由 鼻儿眼睛花 于 2014-2-21 16:50 编辑

你这个程序结构无法做大,我的方法是使用链表创建控件循环检测,每个控件拥有自己的回调函数,回调函数的入口参数包含了控件的各种消息,比如单击,双击,滑动,立刻重绘等等消息,这样GUI可以做的非常复杂。
这是我的创建控件:
NMBTN_NormalButtonCreate(&M_EnterLaysor,LCD_WIDTH-85-120,LCD_HEIGHT-38,100,35,1,0);
NMBTN_SetText(&M_EnterLaysor,"激光传感器监测");
NMBTN_SetCallBack(&M_EnterLaysor,&APP_RobotCheckEnterLaysor);
这是我的回调函数:
void APP_RobotCheckEnterLaysor(void *Handle,MsgType msg)
{
        NMBTN_SetInCallBack(Handle,1);
        switch(msg)
        {
                case BTN_MOVEIN:
                        break;
                case BTN_MOVEOUT:
                        break;
                case BTN_MESSAGESEND:
                        EnterLaysor^=1;
                        if(EnterLaysor==1)
                        {
                                short i=0,j=LCD_WIDTH/2;
                                for(;i<=j;i++)
                                {
                                        GUICore_DrawVLine(j-i,20,239,0);
                                        GUICore_DrawVLine(j+i,20,239,0);
                                        GUICore_Delay(0x3fff);               
                                }
                                NMBTN_ButtonDisable(&M_ReturnButton,0);
                                BTN_HideBotton(&CANButton,0);
                                BTN_HideBotton(&CANButton2,0);
                                NMBTN_SetPos(&M_EnterLaysor,M_EnterLaysor.x0+100,M_EnterLaysor.y0);
                                NMBTN_SetText(&M_EnterLaysor,"Í˳ö¼à²â");
                                NMBTN_ButtonUpdate(&M_EnterLaysor,BTNNOTPRESSED);
                                ShowBigNum(0,10,30,RGB(255,0,0),6);
                        }
                        else
                        {
                                NMBTN_ButtonDisable(&M_ReturnButton,1);
                                if(CANIsOpen==0)
                                {
                                        BTN_HideBotton(&CANButton,1);
                                }
                                else
                                {
                                        BTN_HideBotton(&CANButton2,1);
                                }
                       
                                NMBTN_SetPos(&M_EnterLaysor,M_EnterLaysor.x0-100,M_EnterLaysor.y0);
                                NMBTN_SetText(&M_EnterLaysor,"¼¤¹âÆ÷¼à²â");
                                APP_RobotCheckReDraw();
                                NMBTN_ButtonUpdate(&M_EnterLaysor,BTNNOTPRESSED);
                        }
                        break;
                case BTN_REDRAW_NOTPRESSED:
                        break;
                case BTN_REDRAW_PRESSED:
                        break;
                default:
                        break;
        }
        NMBTN_SetInCallBack(Handle,0);
}
程序员,我觉得要做到一劳永逸,你那种方法当你再次开发系统的时候,你会发现非常恼火,以上是我的方案简述,希望对你有所帮助。

出0入0汤圆

发表于 2014-2-21 16:55:56 | 显示全部楼层
我的另外一个帖子,一年多前发的了,希望能够帮助你。http://www.amobbs.com/thread-5532173-1-1.html

出0入296汤圆

发表于 2014-2-21 17:29:18 | 显示全部楼层
对楼主来说基本原理也就是那样了,我推荐你尝试用用函数指针,然后思考下你的代码一直在重复做什么?
你的界面其实本质是什么?思考好以后尝试把一些描述界面的数据和对应的处理函数用函数指针封装在一个
结构体里,然后再去看看有没有什么灵感。

出0入0汤圆

 楼主| 发表于 2014-2-22 08:07:15 | 显示全部楼层
鼻儿眼睛花 发表于 2014-2-21 16:42
你这个程序结构无法做大,我的方法是使用链表创建控件循环检测,每个控件拥有自己的回调函数,回调函数的入 ...

谢谢你的分享!我先看一下。

出0入0汤圆

 楼主| 发表于 2014-2-22 08:08:18 | 显示全部楼层
Gorgon_Meducer 发表于 2014-2-21 17:29
对楼主来说基本原理也就是那样了,我推荐你尝试用用函数指针,然后思考下你的代码一直在重复做什么?
你的 ...

版主讲得好抽象啊。版主有没有这方面的相关书籍可以介绍的呢?

出0入0汤圆

发表于 2014-2-22 15:14:12 | 显示全部楼层
这个得支持

出0入0汤圆

发表于 2014-2-22 15:33:53 | 显示全部楼层
5楼的说的应该是你需要的,你可以搜一下“多级菜单”相关资料
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 08:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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