OpenEdv-开源电子网

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

UCGUI 外部按键 怎么实现画面上面按钮同样的功能哦?

[复制链接]

6

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-3-1
在线时间
3 小时
发表于 2013-3-1 10:51:46 | 显示全部楼层 |阅读模式

我有个旋转编码器,可以通过这个旋钮左右旋转,进行画面上控件里面变量的加减操作,但是不能实现OK键的功能,也就是GUI_KEY_ENTER 这个键的功能  。外部的OK键按下以后,进入中断,执行了GUI_StoreKeyMsg(GUI_KEY_ENTER, 1);  但是怎么样才能进入到回调函数里面的 case GUI_KEY_ENTER:  ,求指点
代码如下:

/********************************************
 * QEI 中断处理函数
 
 ********************************************/
void QEI_IRQHandler(void)
{
  uint32_t regVal;
  int Position;
  int DIR;
 
  regVal = LPC_QEI->QEIINTSTAT;  /*读取中断寄存器的值*/

  DIR=LPC_QEI->QEISTAT;            /*读取方向位的值*/


   if (regVal & 0x1==1)                  /*如果是索引中断*/
    {

          GUI_StoreKeyMsg(GUI_KEY_ENTER, 1); /*OK*/
        }


 
   if ((DIR&0x1)==1)                      /*反向旋转*/
    {
             if ( (regVal>>6) & 0x1==1)
              {

                  GUI_StoreKeyMsg(GUI_KEY_DOWN, 1);
  }
  

       }
   if((DIR&0x1)==0)                       /*正向旋转*/
    {
     if ( (regVal>>6) & 0x1==1)  /*如果是当前位置=位置0的中断*/
      {
       
          GUI_StoreKeyMsg(GUI_KEY_UP, 1);

         }
    }
        QEI_IRQCLR();              /*清中断*/
 
}




回调函数:
static void _cbDialog_B(WM_MESSAGE * pMsg) {
 int NCode,i,Id, IdEdit;
 WM_HWIN hDlg,ahButton[5],hItem,hEdit,hButton;
 hDlg = pMsg->hWin;
 
       /* Get focussed edit widget */
 hEdit = WM_GetFocussedWindow();
 IdEdit = WM_GetId(hEdit);
 if ((IdEdit < GUI_ID_EDIT0) || (IdEdit > GUI_ID_EDIT14))
  hEdit = 0;

 
 switch (pMsg->MsgId) {
 case WM_PAINT:
  /* Owner drawn background of dialog */
  GUI_SetBkColor(GUI_LIGHTGREEN);
  GUI_Clear();

  GUI_SetColor(GUI_RED);
  GUI_SetFont(&GUI_Font10_ASCII);
  GUI_DispStringAt("K11",20,25);
  GUI_DispStringAt("K12",90,25);
  GUI_DispStringAt("K13",160,25);
  GUI_DispStringAt("K14",20,55);
  GUI_DispStringAt("K15",90,55);
  GUI_DispStringAt("K16",160,55);
  GUI_DispStringAt("K17",20,85);
  GUI_DispStringAt("K18",90,85);
  GUI_DispStringAt("K19",160,85);
  GUI_DispStringAt("B",25,125);
  GUI_DispStringAt("C",95,125);
  GUI_DispStringAt("D",165,125);
  GUI_DispStringAt("R1",25,155);
  GUI_DispStringAt("R2",95,155);
  GUI_DispStringAt("R3",165,155);

  break;
 case WM_INIT_DIALOG:
  
    
  /* Create the buttons  */
  ahButton[0] = BUTTON_CreateEx(250, 120, 50, 20,        //Send
   hDlg, WM_CF_SHOW , 0, GUI_ID_SENDMESSAGE);
  BUTTON_SetFont(ahButton[0], &GUI_FontHZ12);
  BUTTON_SetText(ahButton[0],"Send");
  BUTTON_SetFocussable(ahButton[0], 0);
  
              ahButton[1] = BUTTON_CreateEx(240, 170, 30, 20,   //OK
    hDlg, WM_CF_SHOW , 0, GUI_KEY_ENTER);
  BUTTON_SetFont(ahButton[1], &GUI_FontHZ12);
  BUTTON_SetText(ahButton[1],"OK");
  BUTTON_SetFocussable(ahButton[1], 0);
  
  ahButton[2] = BUTTON_CreateEx(270, 170, 30, 20,        //Del 
    hDlg, WM_CF_SHOW , 0, GUI_KEY_DELETE);
  BUTTON_SetFont(ahButton[2], &GUI_FontHZ12);
  BUTTON_SetText(ahButton[2],"Del");
  BUTTON_SetFocussable(ahButton[2], 0);

  ahButton[3] = BUTTON_CreateEx(230, 150, 40, 20,       //UP
    hDlg, WM_CF_SHOW , 0, GUI_KEY_TAB);
  BUTTON_SetFont(ahButton[3], &GUI_FontHZ12);
  BUTTON_SetText(ahButton[3],"Up");
  BUTTON_SetFocussable(ahButton[3], 0);

  ahButton[4] = BUTTON_CreateEx(270, 150, 40, 20,       //DOWN
    hDlg, WM_CF_SHOW , 0, GUI_KEY_BACKTAB);
  BUTTON_SetFont(ahButton[4], &GUI_FontHZ12);
  BUTTON_SetText(ahButton[4],"Down");
  BUTTON_SetFocussable(ahButton[4], 0);
  

  /* Set buttons to not focussable state 清除按钮焦点*/
   for (i = '0'; i <= '9'; i++)
      {
    hButton = WM_GetDialogItem(hDlg, i);
    BUTTON_SetFocussable(hButton, 0);
       }  
               hButton = WM_GetDialogItem(hDlg, GUI_KEY_DELETE);
   BUTTON_SetFocussable(hButton, 0);
   hButton = WM_GetDialogItem(hDlg, GUI_KEY_ENTER);
   BUTTON_SetFocussable(hButton, 0);
               hButton = WM_GetDialogItem(hDlg, GUI_KEY_TAB);
   BUTTON_SetFocussable(hButton, 0);
   hButton = WM_GetDialogItem(hDlg, GUI_KEY_BACKTAB);
   BUTTON_SetFocussable(hButton, 0);
            /* Init edit widgets */
   for (i=0; i<10; i++)
   {
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0+i);
    EDIT_SetDecMode(hItem, B_Value, 0, 9999, 1, 0);  /*启用十进制编辑模式设置小数点后1位*/
                                                                                      /*如此EDIT_GetValue(hItem);此函数才有效*/
   }
                     
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT10);
    EDIT_SetDecMode(hItem, B_Value[10], 0, 9999, 2, 0);
    
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT11);
    EDIT_SetDecMode(hItem, B_Value[11], 0, 9999, 2, 0);
    
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT12);
    EDIT_SetDecMode(hItem, B_Value[12], 0, 9999, 2, 0);
    
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT13);
    EDIT_SetDecMode(hItem, B_Value[13], 0, 9999, 2, 0);
    
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT14);
    EDIT_SetDecMode(hItem, B_Value[14], 0, 9999, 2, 0);
    
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT15);
    EDIT_SetDecMode(hItem, B_Value[15], 0, 9999, 2, 0);
    
  
   break;
  
 case WM_NOTIFY_PARENT:
   Id = WM_GetId(pMsg->hWinSrc);
   NCode = pMsg->Data.v;               /* Notification code */
   switch (NCode) {
   case WM_NOTIFICATION_VALUE_CHANGED: /* Value has changed */
    Id = WM_GetId(pMsg->hWinSrc);     /* Id of widget */
    break;
   case WM_NOTIFICATION_RELEASED:      /* React only if released */
    switch (Id)
    {
    
     case GUI_KEY_ENTER:              // Save "Edit" boxes values to "Current" values.
      
      for (i=0; i<10; i++)
      {
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + i);
       B_Value = EDIT_GetValue(hItem);
      }
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT10);
       B_Value[10] = EDIT_GetValue(hItem);
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT11);
       B_Value[11] = EDIT_GetValue(hItem);
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT12);
       B_Value[12] = EDIT_GetValue(hItem);
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT13);
       B_Value[13] = EDIT_GetValue(hItem);
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT14);
       B_Value[14] = EDIT_GetValue(hItem);

      // Invalidate window to make sure value will be shown
      WM_InvalidateWindow(hDlg);
      break;
     
     case GUI_KEY_DELETE: //delete
      hEdit = WM_GetFocussedWindow();
      EDIT_SetText(hEdit, "");
       
      break;
     case GUI_KEY_TAB:

      break;
     case GUI_KEY_BACKTAB:
      break;
     case '0':
      if (IdEdit)
       EDIT_AddKey(hEdit, '0');
      break;      
     case '1':
      if (IdEdit)
       EDIT_AddKey(hEdit, '1');
      break;
     case '2':
      if (IdEdit)
       EDIT_AddKey(hEdit, '2');
      break;
     case '3':
      if (IdEdit)
       EDIT_AddKey(hEdit, '3');
      break;
     case '4':
      if (IdEdit)
       EDIT_AddKey(hEdit, '4');
      break;
     case '5':
      if (IdEdit)
       EDIT_AddKey(hEdit, '5');
      break;
     case '6':
      if (IdEdit)
       EDIT_AddKey(hEdit, '6');
      break;
     case '7':
      if (IdEdit)
       EDIT_AddKey(hEdit, '7');
      break;
     case '8':
      if (IdEdit)
       EDIT_AddKey(hEdit, '8');
      break;
     case '9':
      if (IdEdit)
       EDIT_AddKey(hEdit, '9');
      break;
     case '.':
      if (IdEdit)
       EDIT_AddKey(hEdit, '.');
      break;
      

     //default:
     // break;
    }
    
    if (hEdit)
     WM_SetFocus(hEdit);

   }
   break;
 default:
   WM_DefaultProc(pMsg);
 }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2013-3-1 20:43:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-3-1
在线时间
3 小时
 楼主| 发表于 2013-3-5 10:50:55 | 显示全部楼层
求 高手指点啊
回复 支持 反对

使用道具 举报

6

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-3-1
在线时间
3 小时
 楼主| 发表于 2013-3-6 10:20:53 | 显示全部楼层
这几天浏览各大论坛,阅尽无数帖子,终于有所眉目。原来外部按键GUI是有一套独立的消息机制的。那就是当按键按下的时候调用GUI_SendKeyMsg(int Key, int ressedCnt),就会向窗口发送一个按键的消息。回调函数就会跳转到
   case WM_KEY:
      switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) 
      {
        case GUI_KEY_TAB:
          //GUI_EndDialog(hWin, 1); 
break;
        case GUI_KEY_ENTER:
          //GUI_EndDialog(hWin, 0); 
break;
      }break;
然后就可以根据按下的键,进行相应的操作。所以我的回调函数里面加上了
   case WM_KEY:
      switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) 
      {
        case GUI_KEY_TAB:
          //GUI_EndDialog(hWin, 1); 
break;
        case GUI_KEY_ENTER:
          for (i=0; i<10; i++)
      {
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + i);
       B_Value = EDIT_GetValue(hItem);
      }
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT10);
       B_Value[10] = EDIT_GetValue(hItem); 
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT11);
       B_Value[11] = EDIT_GetValue(hItem); 
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT12);
       B_Value[12] = EDIT_GetValue(hItem); 
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT13);
       B_Value[13] = EDIT_GetValue(hItem); 
       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT14);
       B_Value[14] = EDIT_GetValue(hItem); 

      // Invalidate window to make sure value will be shown
      WM_InvalidateWindow(hDlg);


           break;
      }break;
然而,新的问题又出现了,外部按键TAB按下之后调用GUI_SendKeyMsg(GUI_KEY_TAB, 1);   程序可以跳到回调函数的CASE WM_KEY里面,而外部的OK键按下之后调用GUI_SendKeyMsg(GUI_KEY_ENTER,1);却不能跳到回调函数的CASE WM_KEY里面。
为此我特意单步执行跟踪了程序,发现GUI_SendKeyMsg(GUI_KEY_TAB, 1);   这个函数调用了WM_ONKEY(),WM_ONKEY 又调用了WM__SendMessage(),当WM__SendMessage()执行完,程序就跳转到了回调函数的CASE WM_KEY,这就是整个流程。
而我的GUI_SendKeyMsg(GUI_KEY_ENTER,1);执行到   WM__SendMessage(),完成,却没有跳转到回调函数的CASE WM_KEY,很奇怪,求解答??
回复 支持 反对

使用道具 举报

6

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-3-1
在线时间
3 小时
 楼主| 发表于 2013-3-9 08:47:16 | 显示全部楼层
问题已经解决,原因是我的控件都是EDIT,EDIT这个控件是不接受ENTER这个命令的。哎 整了几天!希望对大家有帮助。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-5-8
在线时间
0 小时
发表于 2014-7-3 09:48:35 | 显示全部楼层
呵呵 受教  楼主不容易啊!
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-7-3 10:13:51 | 显示全部楼层
恭喜楼主自学成才。

补充一些观点:

1、按键任务,考虑它的按键响应机制,会产生较大栈消耗,因而推荐使用GUI_StoreKeyMsg(),
2、组件支持的按键会内部调用,产生Notify,不支持的按键的会调用回调函数,跟楼主的描述相反。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2014-7-31
在线时间
6 小时
发表于 2014-9-1 10:53:24 | 显示全部楼层
不知道LZ有没有碰到一个问题就是用函数WM_SetFocus(edit_my);对一个文本框设置焦点之后里面的被选择的字符不会反白,就是说被选择的那个字符整个都是黑色的,这样在调整的时候看不到数字的变化很是恶心额,其他的我用外部绑定的按键也就是调用GUI_StoreKeyMsg(GUI_KEY_DOWN, 1); 可以正常修改里面的数字大小,,求各位大神指教
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 10:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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