1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转stemwin教程
本期教程讲解STemWin支持的编辑控件。 43. 1 编辑控件介绍 43. 2 官方WIDGET_Edit实例 43. 3 对话框上使用编辑框控件 43. 4 总结 43.1 编辑控件介绍 编辑字段通常用作输入文本的主要用户界面: 也可使用编辑字段以二进制、十进制或十六进制模式输入值。十进制模式编辑字段的外观与下表所列类似。与复选框类似,编辑字段在禁用时显示为灰色: 开启皮肤设置后,编辑框的显示效果如下: |
|
相关推荐
|
|
43.1.1 编辑框支持的通知代码
以下事件是编辑框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
|
|
|
|
|
|
43.1.2 编辑框支持的键盘反应
如果控件具有输入焦点,则它将对下列各键做出反应:
|
|
|
|
|
|
源代码如下(官方的这个例子有BUG,下面是修改前的,也就是源代码):
#include "GUI.h" #include "EDIT.h" /********************************************************************* * * Defines * ********************************************************************** */ #define WM_APP_SHOW_TEXT (WM_USER + 0) (1) #define TEXT_MAXLEN 40 (2) /********************************************************************* * * Static code * ********************************************************************** */ /********************************************************************* * * _cbBk */ static void _cbBk(WM_MESSAGE * pMsg) { static WM_HWIN hEdit; static U8 ShowText; char aBuffer[TEXT_MAXLEN]; hEdit = 0; ShowText = 0; switch (pMsg->MsgId) { case WM_PAINT: GUI_SetBkColor(GUI_DARKGRAY); GUI_Clear(); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5); GUI_SetFont(&GUI_Font8x16); if (ShowText) { GUI_DispStringHCenterAt("The string you have modified is:", 160, 90); EDIT_GetText(hEdit, aBuffer, TEXT_MAXLEN); GUI_DispStringHCenterAt(aBuffer, 160, 110); } else { GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90); } break; case WM_APP_SHOW_TEXT: if (hEdit == 0) { hEdit = pMsg->hWinSrc; } WM_HideWindow(hEdit); ShowText = 1; WM_InvalidateWindow(WM_HBKWIN); WM_CreateTimer(WM_HBKWIN, 0, 3000, 0); break; case WM_TIMER: ShowText = 0; WM_InvalidateWindow(WM_HBKWIN); WM_ShowWindow(hEdit); break; default: WM_DefaultProc(pMsg); } } /********************************************************************* * * _cbEdit */ static void _cbEdit(WM_MESSAGE * pMsg) { (3) const WM_KEY_INFO * pInfo; WM_MESSAGE Msg; switch (pMsg->MsgId) { case WM_KEY: (4) pInfo = (WM_KEY_INFO *)pMsg->Data.p; if (pInfo->Key == GUI_KEY_ENTER) { if (pInfo->PressedCnt == 0) { Msg.MsgId = WM_APP_SHOW_TEXT; Msg.hWinSrc = pMsg->hWin; WM_SendMessage(WM_HBKWIN, &Msg); return; } } } EDIT_Callback(pMsg); (5) } /********************************************************************* * * Public code * ********************************************************************** */ /********************************************************************* * * MainTask */ void MainTask(void) { EDIT_Handle hEdit; GUI_Init(); WM_SetCallback(WM_HBKWIN, _cbBk); (6) hEdit = EDIT_CreateEx(50, 110, 220, 25, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_EDIT0, TEXT_MAXLEN); (7) WM_SetCallback(hEdit, _cbEdit); (8) EDIT_SetText(hEdit, "Press EDIT_SetFont(hEdit, &GUI_Font8x16); EDIT_SetTextColor(hEdit, 0, GUI_RED); EDIT_EnableBlink(hEdit, 300, 1); (9) while (1) { GUI_Delay(10); } } |
|
|
|
|
|
这个实例中函数static void _cbBk(WM_MESSAGE * pMsg)存在问题,需要做如下修改:
static void _cbBk(WM_MESSAGE * pMsg) { static WM_HWIN hEdit = 0;(10) static U8 ShowText = 0; char aBuffer[TEXT_MAXLEN]; //hEdit = 0; //ShowText = 0; switch (pMsg->MsgId) { case WM_PAINT: (11) GUI_SetBkColor(GUI_DARKGRAY); GUI_Clear(); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5); GUI_SetFont(&GUI_Font8x16); if (ShowText) { GUI_DispStringHCenterAt("The string you have modified is:", 160, 90); EDIT_GetText(hEdit, aBuffer, TEXT_MAXLEN); GUI_DispStringHCenterAt(aBuffer, 160, 110); } else { GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90); } break; case WM_APP_SHOW_TEXT: (12) if (hEdit == 0) { hEdit = pMsg->hWinSrc; } WM_HideWindow(hEdit); ShowText = 1; WM_InvalidateWindow(WM_HBKWIN); WM_CreateTimer(WM_HBKWIN, 0, 3000, 0); break; case WM_TIMER: (13) ShowText = 0; WM_InvalidateWindow(WM_HBKWIN); WM_ShowWindow(hEdit); break; default: WM_DefaultProc(pMsg); } } |
|
|
|
|
|
1. 自定义回调函数的消息。
2. 定义编辑框中可以显示字符的个数。 3. 编辑框的回调函数,默认情况下,编辑框的回调函数是在emWin库函数中自带执行的,不需要用户专门的做一个回调函数,如果用户需要在编辑框的回调函数中加入处理代码的话,可以通过函数WM_SetCallback来指定编辑框的回调函数。 4. 编辑框回调函数中的WM_KEY消息。如果用户在键盘上按下Enter回车键,那么就会给桌面窗口发送前面自定义的消息。 5. emWin库中自带的编辑框回调函数EDIT_Callback(pMsg); 6. 设置桌面窗口的回调函数。 7. 创建编辑框。 8. 设置编辑框的回调函数。 9. 这个函数用于使能或者禁止光标闪烁。 10. 这个函数是桌面窗口的回调函数,由于官方的提供的这个函数是存在问题的,这里专门的做了修改,注意红体字。 11. 桌面窗口的WM_PAINT消息。根据ShowText变量来改变不同的显示值。 12. 桌面窗口中自定义的消息,如果收到这个消息后,隐藏编辑框,设置ShowText = 1,然后将桌面窗口设置为无效,从而会执行桌面窗口的WM_PAINT消息,最后给桌面窗口建立一个定时器,时间是3000ms。 13. 定时器消息,3000ms的时间到了以后设置ShowText = 1,将桌面窗口无效,从而执行重绘消息,并将编辑框显示出来。 |
|
|
|
|
|
源代码如下(可以直接复制到模拟器或者开发板上面显示):
复制代码 #include #include "GUI.h" #include "DIALOG.h" #include "WM.h" #include "BUTTON.h" #include "CHECKBOX.h" #include "DROPDOWN.h" #include "EDIT.h" #include "FRAMEWIN.h" #include "LISTBOX.h" #include "MULTIEDIT.h" #include "RADIO.h" #include "SLIDER.h" #include "TEXT.h" #include "PROGBAR.h" #include "SCROLLBAR.h" #include "LISTVIEW.h" /********************************************************************* * * Dialog resource * * This table conatins the info required to create the dialog. * It has been created by ucGUIbuilder. */ static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 480,272,FRAMEWIN_CF_MOVEABLE,0}, { EDIT_CreateIndirect, "armfly", GUI_ID_EDIT0, 239,36, 100,21, 0,0}, { TEXT_CreateIndirect, "TextMode", GUI_ID_TEXT0, 81, 36, 106,24, 0,0}, { TEXT_CreateIndirect, "FloatMode", GUI_ID_TEXT4, 81, 199,118,24, 0,0}, { TEXT_CreateIndirect, "DecMode", GUI_ID_TEXT3, 81, 158,94, 24, 0,0}, { TEXT_CreateIndirect, "BinMode", GUI_ID_TEXT2, 81, 117,94, 24, 0,0}, { TEXT_CreateIndirect, "HexMode", GUI_ID_TEXT1, 81, 73, 94, 24, 0,0}, { EDIT_CreateIndirect, "FFFF", GUI_ID_EDIT1, 239,73, 100,21, 0,0}, { EDIT_CreateIndirect, "11110000", GUI_ID_EDIT2, 239,120,100,21, 0,0}, { EDIT_CreateIndirect, "128", GUI_ID_EDIT3, 239,163,100,21, 0,0}, { EDIT_CreateIndirect, "12.123456", GUI_ID_EDIT4, 239,199,100,21, 0,0} }; /***************************************************************** ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg) ** Function: to initialize the Dialog items ** ** call this function in _cbCallback --> WM_PAINT *****************************************************************/ void PaintDialog(WM_MESSAGE * pMsg) { WM_HWIN hWin = pMsg->hWin; } /***************************************************************** ** FunctionName:void InitDialog(WM_MESSAGE * pMsg) ** Function: to initialize the Dialog items ** ** call this function in _cbCallback --> WM_INIT_DIALOG *****************************************************************/ void InitDialog(WM_MESSAGE * pMsg) { WM_HWIN hWin = pMsg->hWin; // //FRAMEWIN // FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII); FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0); FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1); FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2); FRAMEWIN_SetTitleHeight(hWin,35); // //GUI_ID_EDIT0 // EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT0),&GUI_Font16B_ASCII); EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),"armfly"); // //GUI_ID_TEXT0 // TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_Font24B_ASCII); // //GUI_ID_TEXT4 // TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4),&GUI_Font24B_ASCII); // //GUI_ID_TEXT3 // TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_Font24B_ASCII); // //GUI_ID_TEXT2 // TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_Font24B_ASCII); // //GUI_ID_TEXT1 // TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_Font24B_ASCII); // //GUI_ID_EDIT1 // EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT1),&GUI_Font16B_ASCII); EDIT_SetHexMode(WM_GetDialogItem(hWin,GUI_ID_EDIT1),65535,0,255);(1) // //GUI_ID_EDIT2 // EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT2),&GUI_Font16B_ASCII); EDIT_SetBinMode(WM_GetDialogItem(hWin,GUI_ID_EDIT2),240,0,255);(2) // //GUI_ID_EDIT3 // EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT3),&GUI_Font16B_ASCII); EDIT_SetDecMode(WM_GetDialogItem(hWin,GUI_ID_EDIT3),128,0,255,0,0); (3) // //GUI_ID_EDIT4 // EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT4),&GUI_Font16B_ASCII); EDIT_SetFloatMode(WM_GetDialogItem(hWin,GUI_ID_EDIT4),12.12346,0,255,6,0); (4) } /********************************************************************* * * Dialog callback routine */ static void _cbCallback(WM_MESSAGE * pMsg) { int NCode, Id; WM_HWIN hWin = pMsg->hWin; switch (pMsg->MsgId) { case WM_PAINT: PaintDialog(pMsg); break; case WM_INIT_DIALOG: InitDialog(pMsg); break; case WM_KEY: switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) { case GUI_KEY_ESCAPE: GUI_EndDialog(hWin, 1); break; case GUI_KEY_ENTER: GUI_EndDialog(hWin, 0); break; } break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); NCode = pMsg->Data.v; switch (Id) { case GUI_ID_OK: if(NCode==WM_NOTIFICATION_RELEASED) GUI_EndDialog(hWin, 0); break; case GUI_ID_CANCEL: if(NCode==WM_NOTIFICATION_RELEASED) GUI_EndDialog(hWin, 0); break; } break; default: WM_DefaultProc(pMsg); } } /********************************************************************* * * MainTask * ********************************************************************** */ void MainTask(void) { GUI_Init(); WM_SetDesktopColor(GUI_WHITE); /* Automacally update desktop window */ WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */ PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX); FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX); PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX); BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX); CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX); DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX); SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX); SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX); HEADER_SetDefaultSkin(HEADER_SKIN_FLEX); RADIO_SetDefaultSkin(RADIO_SKIN_FLEX); GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0); } |
|
|
|
|
|
1. 设置16进制显示。
2. 设置2进制显示。 3. 设置10进制显示。 4. 设置浮点数显示。 实际的显示效果如下: |
|
|
|
|
|
43.4 总结
本期教程主要是跟大家讲解了编辑框的使用,希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的编辑框API,其它的API大家都可以试试。 |
|
|
|
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之烧写原理
321 浏览 0 评论
请问SPH0641LU4H这款麦克风如何在不使用I2S的情况下,单纯通过GPIO来进行驱动且正常读取数据呢
325 浏览 0 评论
296 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十六章 照相机实验
313 浏览 0 评论
STM32模拟eeprom只有起始地址0x8001000正常其他地址都会造成单片机运行不正常怎么回事
276 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12078 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 02:54 , Processed in 0.674089 second(s), Total 60, Slave 53 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号