完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有个旋转编码器,可以通过这个旋钮左右旋转,进行画面上控件里面变量的加减操作,但是不能实现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); } } |
|
相关推荐
7个回答
|
|
帮顶下.
|
|
|
|
求 高手指点啊
|
|
|
|
这几天浏览各大论坛,阅尽无数帖子,终于有所眉目。原来外部按键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,很奇怪,求解答?? |
|
|
|
问题已经解决,原因是我的控件都是EDIT,EDIT这个控件是不接受ENTER这个命令的。哎 整了几天!希望对大家有帮助。
|
|
|
|
呵呵 受教 楼主不容易啊!
|
|
|
|
恭喜楼主自学成才。
补充一些观点: 1、按键任务,考虑它的按键响应机制,会产生较大栈消耗,因而推荐使用GUI_StoreKeyMsg(), 2、组件支持的按键会内部调用,产生Notify,不支持的按键的会调用回调函数,跟楼主的描述相反。 |
|
|
|
不知道LZ有没有碰到一个问题就是用函数WM_SetFocus(edit_my);对一个文本框设置焦点之后里面的被选择的字符不会反白,就是说被选择的那个字符整个都是黑色的,这样在调整的时候看不到数字的变化很是恶心额,其他的我用外部绑定的按键也就是调用GUI_StoreKeyMsg(GUI_KEY_DOWN, 1); 可以正常修改里面的数字大小,,求各位大神指教
|
|
|
|
只有小组成员才能发言,加入小组>>
698 浏览 0 评论
1109 浏览 1 评论
2476 浏览 5 评论
2810 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2653 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
656浏览 9评论
651浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
785浏览 6评论
632浏览 5评论
672浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 05:06 , Processed in 1.128198 second(s), Total 93, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号