硬汉嵌入式论坛

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

[emWin] 求助,关于ucgui EDIT控件的奇葩问题

[复制链接]

79

主题

191

回帖

428

积分

高级会员

积分
428
发表于 2014-8-8 21:39:45 | 显示全部楼层 |阅读模式
单色屏+实体按键开发人机界面,现在需要使用EDIT控件用于参数输入。测试代码如下:
     
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
   { WINDOW_CreateIndirect, "",     123, 105,  1, 130, 109, WM_CF_SHOW },
   { BUTTON_CreateIndirect,   "OK",     GUI_ID_OK,       10, 50,  40,  18 },
   { BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,   80, 50,  40,  18 },
   { EDIT_CreateIndirect,   "", GUI_ID_EDIT0, 20, 10,50, 20, 0, 15 },
};

static void _cbCallback(WM_MESSAGE * pMsg) {
               int i;
               int NCode, Id;
              EDIT_Handle hEDIT;
           switch (pMsg->MsgId) {
                  case WM_INIT_DIALOG:
                 hEDIT = WM_GetDialogItem(pMsg->hWin, GUI_ID_EDIT0);
                EDIT_SetText(hEDIT, "1234");      
                   break;
                 
          case WM_KEY:
                          switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
                  case KB_Left:    GUI_SendKeyMsg(GUI_KEY_BACKTAB,1);   break; //上翻
                  case KB_Right:   GUI_SendKeyMsg(GUI_KEY_TAB,1);        break; //下翻
                           case KB_Menu: WM_DeleteWindow(pMsg->hWin);    break;   //关闭此窗口
         }
                   break;
       break;
     default:
       WM_DefaultProc(pMsg);
   }
}


void MainTask(WM_HWIN hWin) {
    GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback,  hWin, 0, 0);
   while(1) {
      GUI_Delay(150);
   }
}


可以正常创建EDIT和BUTTON按钮,且按左右键可以在"OK“和"Cancel"焦点切换,但是!!只要多按一下想要
切换焦点到EDIT上,立马死机,再看看EDIT控件,貌似也没啥反应。。。。。

更奇葩的是,改变窗口资源的创建顺序,也就是这样写:
把EDIT放在两个BUTTON的前面:
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
   { WINDOW_CreateIndirect, "",     123, 105,  1, 130, 109, WM_CF_SHOW },
    { EDIT_CreateIndirect,   "", GUI_ID_EDIT0, 20, 10,50, 20, 0, 15 },
   { BUTTON_CreateIndirect,   "OK",     GUI_ID_OK,       10, 50,  40,  18 },
   { BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,   80, 50,  40,  18 },
};
要是这样,窗口根本无法创建,立即死掉了。。。。。。。
请Eric高手帮忙看看问题出在哪里,另外,我用你的实体按键的例程跑了一下,怎么也死机了??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2014-8-8 22:25:39 | 显示全部楼层
现在有些晚了,要回去休息了,明天过来了给你解答。
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-8-9 09:28:21 | 显示全部楼层
今天又写了一段测试代码:

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "",     123, 105,  1, 130, 109, WM_CF_SHOW },
{ BUTTON_CreateIndirect,   "OK",     GUI_ID_OK,       10, 50,  40,  18 },
{ BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,   80, 50,  40,  18 },
{ EDIT_CreateIndirect,   "", GUI_ID_EDIT0, 20, 10,50, 20, 0, 15 },

};

static void _cbCallback(WM_MESSAGE * pMsg) {
  int i;
  int NCode, Id;
  EDIT_Handle hEDIT;
  switch (pMsg->MsgId) {
    case WM_INIT_DIALOG:
    hEDIT = WM_GetDialogItem(pMsg->hWin, GUI_ID_EDIT0);
      EDIT_SetText(hEDIT, "1234");      
    break;
  
   case WM_KEY:
      switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
          case KB_Left:    GUI_SendKeyMsg(GUI_KEY_BACKTAB,1);   break; //½¹µãÉÏÒÆ
          case KB_Right:   GUI_SendKeyMsg(GUI_KEY_TAB,1);        break; //½¹µãÏÂÒÆ
            
              case KB_Menu: WM_DeleteWindow(pMsg->hWin);    break;   //¹رմ˴°¿Ú
   }
   break;
      break;
    default:
      WM_DefaultProc(pMsg);
  }
}

void MainTask(void)
{
   GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback,  0, 0, 0);
  while(1) {
     GUI_Delay(150);
  }
}

运行效果如下:
IMG_20140809_090305.jpg

“OK"和"CANCEL"通过键盘可以自由切换焦点,但焦点无法切换到上面的EDIT窗口上,
焦点只要离开OK和CANCEL按钮,就死翘翘了。。。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2014-8-9 09:39:07 | 显示全部楼层
你这个使用错误:
case WM_KEY:
      switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
      这个是用来接收消息的。

下面这两个是用来发送消息的,你放在别的任务里面发送即可
GUI_SendKeyMsg(GUI_KEY_BACKTAB,1);   break;
GUI_SendKeyMsg(GUI_KEY_TAB,1);        break;
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-8-9 09:39:13 | 显示全部楼层
另外,我看了几个关于EDIT控件的例程,有的例程专门为EDIT控件设计了键盘处理的回调函数,例如UCGUI3.98自带的例程WIDGET_EditWinmode.c文件里就有:
      WM_SetCallback(hItem, _cbEdit)  //设置EDIT的CALLBACK
           EDIT_SetpfAddKeyEx(pMsg->hWin, _cbEditAddKey); //关联键盘处理

而有的例程却没有这些过程,貌似也可以用,我有点迷惑,究竟按哪一种例程的方法写??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2014-8-9 09:47:08 | 显示全部楼层

回 天马行空 的帖子

天马行空:另外,我看了几个关于EDIT控件的例程,有的例程专门为EDIT控件设计了键盘处理的回调函数,例如UCGUI3.98自带的例程WIDGET_EditWinmode.c文件里就有:
      WM_SetCallback(hItem, _cbEdit)  //设置EDIT的CALLBACK
   &nb .. (2014-08-09 09:39) 
EDIT本身就是有回调函数的,这个例子属于自定义回调函数,添加一些自己需要的功能
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-8-9 10:23:05 | 显示全部楼层
谢谢ERIC,我再改改看。。。。。。。。
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-8-9 11:57:31 | 显示全部楼层
问题终于解决了,原来是液晶底层驱动有问题,读点的返回值不对,修改了就正常了。。。。
以前总认为是控件本身的问题,折腾了3、4天没啥效果,浪费了大把的时间。
另外我在想:既然液晶读点的返回值不对,怎么其它BUTTON和空间都还能刷出来呢??
还有,旧问题解决了,新问题又来了。。。。。。焦点切换到EDIT上,键盘所有的键值都被EDIT截获了,也就是说只要
焦点移动到EDIT上,就再也无法移动到别处去了。。。。。。
再次请教ERIC,有神马解决方法?最好是有例程参考参考。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2014-8-9 11:59:45 | 显示全部楼层

回 天马行空 的帖子

天马行空:问题终于解决了,原来是液晶底层驱动有问题,读点的返回值不对,修改了就正常了。。。。
以前总认为是控件本身的问题,折腾了3、4天没啥效果,浪费了大把的时间。
另外我在想:既然液晶读点的返回值不对,怎么其它BUTTON和空间都还能刷出来呢??
还有,旧问题解决了,新问题又来 .. (2014-08-09 11:57) 
第一个ATM机的例子研究下。http://www.armbbs.cn/forum.php?mod=viewthread&tid=2932,有视频演示,你可以看下。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 19:50 , Processed in 0.180942 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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