pigy0754 发表于 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;
}
}

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

68336016 发表于 2014-2-21 16:23:32

2紧凑一些

鼻儿眼睛花 发表于 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);
}
程序员,我觉得要做到一劳永逸,你那种方法当你再次开发系统的时候,你会发现非常恼火,以上是我的方案简述,希望对你有所帮助。

鼻儿眼睛花 发表于 2014-2-21 16:55:56

我的另外一个帖子,一年多前发的了,希望能够帮助你。http://www.amobbs.com/thread-5532173-1-1.html

Gorgon_Meducer 发表于 2014-2-21 17:29:18

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

pigy0754 发表于 2014-2-22 08:07:15

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

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

pigy0754 发表于 2014-2-22 08:08:18

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

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

atonghua 发表于 2014-2-22 15:14:12

这个得支持

每天学一点 发表于 2014-2-22 15:33:53

5楼的说的应该是你需要的,你可以搜一下“多级菜单”相关资料
页: [1]
查看完整版本: 界面刷新和控制疑问