[应用相关] EDIT-编辑控件

[复制链接]
1563|10
 楼主| 舒斯特尔 发表于 2015-8-30 08:52 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第43章 EDIT-编辑控件

    本期教程讲解STemWin支持的编辑控件。
    43. 1 编辑控件介绍
    43. 2 官方WIDGET_Edit实例
    43. 3 对话框上使用编辑框控件
    43. 4 总结
43.1 编辑控件介绍
    编辑字段通常用作输入文本的主要用户界面:
    也可使用编辑字段以二进制、十进制或十六进制模式输入值。十进制模式编辑字段的外观与下表所列类似。与复选框类似,编辑字段在禁用时显示为灰色:
    开启皮肤设置后,编辑框的显示效果如下:
43.1.1 编辑框支持的通知代码
    以下事件是编辑框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
消息
描述
WM_NOTIFICATION_CLICKED
已被点击。
WM_NOTIFICATION_RELEASED
已被释放。
WM_NOTIFICATION_MOVED_OUT
已被点击,且指针已移出控件,但没有释放。
WM_NOTIFICATION_VALUE_CHANGED
编辑小工具的值 (内容)已更改。
43.1.2 编辑框支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反应:
按键
反应
GUI_KEY_UP
上升当前字符。例如,如果当前字符 (光标下的字符)为 “A”, 则 变 为 “B”。
GUI_KEY_DOWN
下降当前字符。例如,如果当前字符为为 “B”,则变为 “A”。
GUI_KEY_RIGHT
将光标向右移动一个字符。
GUI_KEY_LEFT
将光标向左移动一个字符。
GUI_KEY_BACKSPACE
如果小工具在文本模式下操作,则删除光标前的字符。
GUI_KEY_DELETE
如果小工具在文本模式下操作,则删除当前字符。
GUI_KEY_INSERT
如果小工具在文本模式下操作,则此键在GUI_EDIT_MODE_OVERWRITE
和GUI_EDIT_MODE_INSERT之间切换编辑模式。



                    收藏

评分

参与人数 1威望 +5 收起 理由
mmuuss586 + 5 赞一个!

查看全部评分

 楼主| 舒斯特尔 发表于 2015-8-30 08:53 | 显示全部楼层
3.2 官方WIDGET_Edit实例
    官方的这个例子演示了部分EDIT控件API的使用。这个例子在模拟器中的位置:
源代码如下(官方的这个例子有BUG,下面是修改前的,也就是源代码):
  1. #include "GUI.h"
  2. #include "EDIT.h"
  3. /*********************************************************************
  4. *
  5. *       Defines
  6. *
  7. **********************************************************************
  8. */
  9. #define WM_APP_SHOW_TEXT (WM_USER + 0)                                                              (1)
  10. #define TEXT_MAXLEN      40                                                                         (2)
  11. /*********************************************************************
  12. *
  13. *       Static code
  14. *
  15. **********************************************************************
  16. */
  17. /*********************************************************************
  18. *
  19. *       _cbBk
  20. */
  21. static void _cbBk(WM_MESSAGE * pMsg) {
  22.   static WM_HWIN hEdit;
  23.   static U8      ShowText;
  24.   char           aBuffer[TEXT_MAXLEN];
  25.   hEdit    = 0;
  26.   ShowText = 0;
  27.   switch (pMsg->MsgId) {
  28.   case WM_PAINT:
  29.     GUI_SetBkColor(GUI_DARKGRAY);
  30.     GUI_Clear();
  31.     GUI_SetFont(&GUI_Font24_ASCII);
  32.     GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5);
  33.     GUI_SetFont(&GUI_Font8x16);
  34.     if (ShowText) {
  35.       GUI_DispStringHCenterAt("The string you have modified is:", 160, 90);
  36.       EDIT_GetText(hEdit, aBuffer, TEXT_MAXLEN);
  37.       GUI_DispStringHCenterAt(aBuffer, 160, 110);
  38.     } else {
  39.       GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90);
  40.     }
  41.     break;
  42.   case WM_APP_SHOW_TEXT:
  43.     if (hEdit == 0) {
  44.       hEdit = pMsg->hWinSrc;
  45.     }
  46.     WM_HideWindow(hEdit);
  47.     ShowText = 1;
  48.     WM_InvalidateWindow(WM_HBKWIN);
  49.     WM_CreateTimer(WM_HBKWIN, 0, 3000, 0);
  50.     break;
  51.   case WM_TIMER:
  52.     ShowText = 0;
  53.     WM_InvalidateWindow(WM_HBKWIN);
  54.     WM_ShowWindow(hEdit);
  55.     break;
  56.   default:
  57.     WM_DefaultProc(pMsg);
  58.   }
  59. }
  60. /*********************************************************************
  61. *
  62. *       _cbEdit
  63. */
  64. static void _cbEdit(WM_MESSAGE * pMsg) {                                                            (3)
  65.   const WM_KEY_INFO * pInfo;
  66.   WM_MESSAGE          Msg;
  67.   switch (pMsg->MsgId) {
  68.   case WM_KEY:                                                                                      (4)
  69.     pInfo = (WM_KEY_INFO *)pMsg->Data.p;
  70.     if (pInfo->Key == GUI_KEY_ENTER) {
  71.       if (pInfo->PressedCnt == 0) {
  72.         Msg.MsgId   = WM_APP_SHOW_TEXT;
  73.         Msg.hWinSrc = pMsg->hWin;
  74.         WM_SendMessage(WM_HBKWIN, &Msg);
  75.         return;
  76.       }
  77.     }
  78.   }
  79.   EDIT_Callback(pMsg);                                                                              (5)
  80. }
  81. /*********************************************************************
  82. *
  83. *       Public code
  84. *
  85. **********************************************************************
  86. */
  87. /*********************************************************************
  88. *
  89. *       MainTask
  90. */
  91. void MainTask(void) {
  92.   EDIT_Handle hEdit;
  93.   GUI_Init();
  94.   WM_SetCallback(WM_HBKWIN, _cbBk);                                                                   (6)
  95.   hEdit = EDIT_CreateEx(50, 110, 220, 25, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_EDIT0, TEXT_MAXLEN);       (7)
  96.   WM_SetCallback(hEdit, _cbEdit);                                                                     (8)
  97.   EDIT_SetText(hEdit, "Press <ENTER> when done...");
  98.   EDIT_SetFont(hEdit, &GUI_Font8x16);
  99.   EDIT_SetTextColor(hEdit, 0, GUI_RED);
  100.   EDIT_EnableBlink(hEdit, 300, 1);                                                                    (9)
  101.   while (1) {
  102.     GUI_Delay(10);
  103.   }
  104. }
  105.     这个实例中函数static void _cbBk(WM_MESSAGE * pMsg)存在问题,需要做如下修改:
  106. static void _cbBk(WM_MESSAGE * pMsg) {
  107.   static WM_HWIN hEdit = 0;(10)
  108.   static U8      ShowText = 0;
  109.   char           aBuffer[TEXT_MAXLEN];
  110.   //hEdit    = 0;
  111.   //ShowText = 0;
  112.   switch (pMsg->MsgId) {
  113.   case WM_PAINT:                                                                                     (11)
  114.     GUI_SetBkColor(GUI_DARKGRAY);
  115.     GUI_Clear();
  116.     GUI_SetFont(&GUI_Font24_ASCII);
  117.     GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5);
  118.     GUI_SetFont(&GUI_Font8x16);
  119.     if (ShowText) {
  120.       GUI_DispStringHCenterAt("The string you have modified is:", 160, 90);
  121.       EDIT_GetText(hEdit, aBuffer, TEXT_MAXLEN);
  122.       GUI_DispStringHCenterAt(aBuffer, 160, 110);
  123.     } else {
  124.       GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90);
  125.     }
  126.     break;
  127.   case WM_APP_SHOW_TEXT:                                                                            (12)
  128.     if (hEdit == 0) {
  129.       hEdit = pMsg->hWinSrc;
  130.     }
  131.     WM_HideWindow(hEdit);
  132.     ShowText = 1;
  133.     WM_InvalidateWindow(WM_HBKWIN);
  134.     WM_CreateTimer(WM_HBKWIN, 0, 3000, 0);
  135.     break;
  136.   case WM_TIMER:                                                                                    (13)
  137.     ShowText = 0;
  138.     WM_InvalidateWindow(WM_HBKWIN);
  139.     WM_ShowWindow(hEdit);
  140.     break;
  141.   default:
  142.     WM_DefaultProc(pMsg);
  143.   }
  144. }


 楼主| 舒斯特尔 发表于 2015-8-30 08:53 | 显示全部楼层
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,将桌面窗口无效,从而执行重绘消息,并将编辑框显示出来。
实际显示效果如下:

 楼主| 舒斯特尔 发表于 2015-8-30 08:54 | 显示全部楼层
43.3 对话框上使用编辑框控件
    用uCGUIBulder4.0建立一个如下的界面(分辨率480*272):
    通过这个例子主要是显示一下编辑框支持的五种显示方式,设置的位置如下:
43.7.png (52.29 KB, 下载次数: 0)
下载附件
2015-3-2 12:01 上传


源代码如下(可以直接复制到模拟器或者开发板上面显示):
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"
  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"

  18. /*********************************************************************
  19. *
  20. * Dialog resource
  21. *
  22. * This table conatins the info required to create the dialog.
  23. * It has been created by ucGUIbuilder.
  24. */
  25. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  26. { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 480,272,FRAMEWIN_CF_MOVEABLE,0},
  27. { EDIT_CreateIndirect, "armfly", GUI_ID_EDIT0, 239,36, 100,21, 0,0},
  28. { TEXT_CreateIndirect, "TextMode", GUI_ID_TEXT0, 81, 36, 106,24, 0,0},
  29. { TEXT_CreateIndirect, "FloatMode", GUI_ID_TEXT4, 81, 199,118,24, 0,0},
  30. { TEXT_CreateIndirect, "DecMode", GUI_ID_TEXT3, 81, 158,94, 24, 0,0},
  31. { TEXT_CreateIndirect, "BinMode", GUI_ID_TEXT2, 81, 117,94, 24, 0,0},
  32. { TEXT_CreateIndirect, "HexMode", GUI_ID_TEXT1, 81, 73, 94, 24, 0,0},
  33. { EDIT_CreateIndirect, "FFFF", GUI_ID_EDIT1, 239,73, 100,21, 0,0},
  34. { EDIT_CreateIndirect, "11110000", GUI_ID_EDIT2, 239,120,100,21, 0,0},
  35. { EDIT_CreateIndirect, "128", GUI_ID_EDIT3, 239,163,100,21, 0,0},
  36. { EDIT_CreateIndirect, "12.123456", GUI_ID_EDIT4, 239,199,100,21, 0,0}
  37. };

  38. /*****************************************************************
  39. ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  40. ** Function: to initialize the Dialog items
  41. **
  42. ** call this function in _cbCallback --> WM_PAINT
  43. *****************************************************************/

  44. void PaintDialog(WM_MESSAGE * pMsg)
  45. {
  46. WM_HWIN hWin = pMsg->hWin;

  47. }

  48. /*****************************************************************
  49. ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  50. ** Function: to initialize the Dialog items
  51. **
  52. ** call this function in _cbCallback --> WM_INIT_DIALOG
  53. *****************************************************************/

  54. void InitDialog(WM_MESSAGE * pMsg)
  55. {
  56. WM_HWIN hWin = pMsg->hWin;
  57. //
  58. //FRAMEWIN
  59. //
  60. FRAMEWIN_SetFont(hWin,&GUI_Font32B_ASCII);
  61. FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  62. FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  63. FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  64. FRAMEWIN_SetTitleHeight(hWin,35);
  65. //
  66. //GUI_ID_EDIT0
  67. //
  68. EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT0),&GUI_Font16B_ASCII);
  69. EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),"armfly");
  70. //
  71. //GUI_ID_TEXT0
  72. //
  73. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0),&GUI_Font24B_ASCII);
  74. //
  75. //GUI_ID_TEXT4
  76. //
  77. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT4),&GUI_Font24B_ASCII);
  78. //
  79. //GUI_ID_TEXT3
  80. //
  81. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&GUI_Font24B_ASCII);
  82. //
  83. //GUI_ID_TEXT2
  84. //
  85. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&GUI_Font24B_ASCII);
  86. //
  87. //GUI_ID_TEXT1
  88. //
  89. TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&GUI_Font24B_ASCII);
  90. //
  91. //GUI_ID_EDIT1
  92. //
  93. EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT1),&GUI_Font16B_ASCII);
  94. EDIT_SetHexMode(WM_GetDialogItem(hWin,GUI_ID_EDIT1),65535,0,255);(1)
  95. //
  96. //GUI_ID_EDIT2
  97. //
  98. EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT2),&GUI_Font16B_ASCII);
  99. EDIT_SetBinMode(WM_GetDialogItem(hWin,GUI_ID_EDIT2),240,0,255);(2)
  100. //
  101. //GUI_ID_EDIT3
  102. //
  103. EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT3),&GUI_Font16B_ASCII);
  104. EDIT_SetDecMode(WM_GetDialogItem(hWin,GUI_ID_EDIT3),128,0,255,0,0); (3)
  105. //
  106. //GUI_ID_EDIT4
  107. //
  108. EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT4),&GUI_Font16B_ASCII);
  109. EDIT_SetFloatMode(WM_GetDialogItem(hWin,GUI_ID_EDIT4),12.12346,0,255,6,0); (4)

  110. }

  111. /*********************************************************************
  112. *
  113. * Dialog callback routine
  114. */
  115. static void _cbCallback(WM_MESSAGE * pMsg)
  116. {
  117. int NCode, Id;
  118. WM_HWIN hWin = pMsg->hWin;
  119. switch (pMsg->MsgId)
  120. {
  121. case WM_PAINT:
  122. PaintDialog(pMsg);
  123. break;
  124. case WM_INIT_DIALOG:
  125. InitDialog(pMsg);
  126. break;
  127. case WM_KEY:
  128. switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  129. {
  130. case GUI_KEY_ESCAPE:
  131. GUI_EndDialog(hWin, 1);
  132. break;
  133. case GUI_KEY_ENTER:
  134. GUI_EndDialog(hWin, 0);
  135. break;
  136. }
  137. break;
  138. case WM_NOTIFY_PARENT:
  139. Id = WM_GetId(pMsg->hWinSrc);
  140. NCode = pMsg->Data.v;
  141. switch (Id)
  142. {
  143. case GUI_ID_OK:
  144. if(NCode==WM_NOTIFICATION_RELEASED)
  145. GUI_EndDialog(hWin, 0);
  146. break;
  147. case GUI_ID_CANCEL:
  148. if(NCode==WM_NOTIFICATION_RELEASED)
  149. GUI_EndDialog(hWin, 0);
  150. break;

  151. }
  152. break;
  153. default:
  154. WM_DefaultProc(pMsg);
  155. }
  156. }

  157. /*********************************************************************
  158. *
  159. * MainTask
  160. *
  161. **********************************************************************
  162. */
  163. void MainTask(void)
  164. {
  165. GUI_Init();
  166. WM_SetDesktopColor(GUI_WHITE); /* Automacally update desktop window */
  167. WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
  168. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  169. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  170. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  171. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  172. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  173. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  174. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  175. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  176. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  177. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  178. GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  179. }


 楼主| 舒斯特尔 发表于 2015-8-30 08:54 | 显示全部楼层
1. 设置16进制显示。
2. 设置2进制显示。
3. 设置10进制显示。
4. 设置浮点数显示。
实际的显示效果如下:
43.4 总结
    本期教程主要是跟大家讲解了编辑框的使用,希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的编辑框API,其它的API大家都可以试试。

Mancherstun 发表于 2015-8-30 09:24 | 显示全部楼层
没有看明白这是个什么东西,向是软件
mmuuss586 发表于 2015-8-30 09:45 | 显示全部楼层

这都行,不错;
李香兰 发表于 2015-8-30 10:10 | 显示全部楼层
这是安卓编程吗
搞IT的 发表于 2015-8-30 20:47 来自手机 | 显示全部楼层
编辑框??感觉这个用的很少啊!!
lefeng 发表于 2015-8-30 20:51 | 显示全部楼层
关注,学习一下
Snow7 发表于 2015-8-30 22:02 | 显示全部楼层
这程序注释太少了,看着费劲啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

277

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部