|
尝试着通过自定义按键消息在对话框回调函数中创建EDIT控件(代码如下),在对话框回调函数中接收到自定义按键消息后能在串口打印出编号1(50行)处的提示信息,但下面的代码运行后屏幕上不出现EDIT_CreateEx函数创建的EDIT控件,一开始怀疑是编号2(58行)处的窗口无效化语句没加,但加上后仍然不显示。是我对EDIT_CreateEx函数的使用方式不对么?求教~
- static GUI_WIDGET_CREATE_INFO edit_window[] =
- {
- {WINDOW_CreateIndirect, "", 0, 0, 0, 480, 272, 0, 0, 0},
- {TEXT_CreateIndirect, NULL, GUI_ID_TEXT0, TIPS_POSITION_X, TIPS_POSITION_Y, 400, 30, 0, 0},
- {EDIT_CreateIndirect, NULL, GUI_ID_EDIT0, TEXT_POSITION_X1 + 120, TEXT_POSITION_Y - 4, 200, 30, 0, 0x0, 0},
- {EDIT_CreateIndirect, NULL, GUI_ID_EDIT1, TEXT_POSITION_X1 + 120, TEXT_POSITION_Y - 4 + TEXT_SIZE_Y + TEXT_SPACE_Y - 4, 200, 30, 0, 0x0, 0},
- {EDIT_CreateIndirect, NULL, GUI_ID_EDIT2, TEXT_POSITION_X1 + 120, TEXT_POSITION_Y - 4 + (TEXT_SIZE_Y + TEXT_SPACE_Y - 4) * 2, 200, 30, 0, 0x0, 0},
- {EDIT_CreateIndirect, NULL, GUI_ID_EDIT3, TEXT_POSITION_X1 + 120, TEXT_POSITION_Y - 4 + (TEXT_SIZE_Y + TEXT_SPACE_Y - 4) * 3, 200, 30, 0, 0x0, 0},
- {EDIT_CreateIndirect, NULL, GUI_ID_EDIT4, TEXT_POSITION_X1 + 120, TEXT_POSITION_Y - 4 + (TEXT_SIZE_Y + TEXT_SPACE_Y - 4) * 4, 200, 30, 0, 0x0, 0},
- {EDIT_CreateIndirect, NULL, GUI_ID_EDIT5, TEXT_POSITION_X1 + 120, TEXT_POSITION_Y - 4 + (TEXT_SIZE_Y + TEXT_SPACE_Y - 4) * 5, 200, 30, 0, 0x0, 0},
- {BUTTON_CreateIndirect, NULL, GUI_ID_BUTTON0, 400, 60, 65, 30, 0, 0}
- };
- static EDIT_Handle s_flow_edit_handle;
- int main()
- {
- /** emWin初始化 */
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
- GUI_Init();
- WM_SetCreateFlags(WM_CF_MEMDEV);
- GUI_CreateDialogBox(edit_window, GUI_COUNTOF(edit_window), edit_cb, 0, 0, 0);
- while (1)
- {
- GUI_Delay(10);
- }
- }
- static void edit_cb(WM_MESSAGE *pMsg)
- {
- WM_HWIN hWin;
- WM_HWIN hWinSrc;
- hWin = pMsg->hWin;
- hWinSrc = pMsg->hWinSrc;
- switch (pMsg->MsgId)
- {
- case WM_INIT_DIALOG:
- /** 控件初始化 */
- break;
- case WM_PAINT:
- /** 绘制一些背景线条 */
- break;
- case WM_KEY:
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
- {
- case USER_KEY_ENTER: /**< 自定义按键消息 */
- rt_kprintf("Create the flow 1 edit\n"); /**< 编号 1 */
- /** 创建编辑框 */
- s_flow_edit_handle = EDIT_CreateEx(350, i, 60, 30, hwin, WM_CF_SHOW, 0, GUI_ID_EDIT6, 3);
- EDIT_SetFont(s_flow_edit_handle, TITLE_FONT);
- EDIT_SetFocussable(s_flow_edit_handle, 0);
- EDIT_SetTextAlign(s_flow_edit_handle, GUI_TA_VCENTER | GUI_TA_CENTER);
- WM_DisableWindow(s_flow_edit_handle);
- EDIT_SetDecMode(s_flow_edit_handle, (long)345, 0, 999, 0, GUI_EDIT_NORMAL);
- //WM_InvalidateWindow(WM_GetClientWindow(hWin)); /**< 编号2 */
- break;
- }
- break;
- }
- default:
- WM_DefaultProc(pMsg);
- }
复制代码
解决:早上起来再看上面的代码发现原来是个粗心的错误,52行代码中有个局部变量i,这个i的值在自定义的USER_KEY_ENTER消息中是未定义的,导致EDIT_CreateEx函数创建的EDIT控件坐标超出了屏幕的显示范围。Orz...
这也提示我作为接口的使用者不应该依赖接口内部的参数合法性检验(万一就没有检验呢?),尽量保证传入参数的合法性。 |
|