你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第50章 MULTIEDIT-多行文本控件

[复制链接]
baiyongbin2009 发布时间:2015-3-10 11:21
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第50章 MULTIEDIT-多行文本控件

    本期教程讲解STemWin支持的多行文本控件。
    50. 1 多行文本控件介绍
    50. 2 官方WIDGET_Multiedit实例
    50. 3 使用uCGUIBulder建立多行文本控件
    50. 4 总结

50.1 多行文本控件介绍
    通过MULTIEDIT小工具可编辑多行文本。它既可以被用作简单的文本编辑器,也可以用来显示静态文本。该小工具支持带滚动条和不带滚动条的滚动。下表显示MULTIEDIT小工具的外观:
50.1.png
50.1.1 多行文本支持的通知代码
    以下事件是多行文本控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
消息
描述
WM_NOTIFICATION_CLICKED
已单击小工具。
WM_NOTIFICATION_RELEASED
已释放小工具。
WM_NOTIFICATION_MOVED_OUT
已单击小工具,并且指针已移出小工具,但没有释放。
WM_NOTIFICATION_SCROLL_CHANGED
可选滚动条的滚动位置已更改。
WM_NOTIFICATION_VALUE_CHANGED
小工具的文本已更改。
50.1.2 多行文本支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反应:
按键
反应
GUI_KEY_UP
将光标向上移动一行。
GUI_KEY_DOWN
将光标向下移动一行。
GUI_KEY_RIGHT
将光标向右移动一个字符。
GUI_KEY_LEFT
将光标向左移动一个字符。
GUI_KEY_END
将光标移到当前行的末尾。
GUI_KEY_HOME
将光标移到当前行的开头。
GUI_KEY_BACKSPAC
如果小工具在读/写模式下工作,此按键将删除光标之前的字符。
GUI_KEY_DELETE
如果小工具在读/写模式下工作,此按键将删除光标之下的字符。
GUI_KEY_INSERT
在插入模式和覆盖模式之间切换。
GUI_KEY_ENTER
如果小工具在读/写模式下工作,此按键将在当前位置插入一个新行(’\n’)。如果小工具在只读模式下工作,光标将移到下一行的开头。

收藏 评论3 发布时间:2015-3-10 11:21

举报

3个回答
baiyongbin2009 回答时间:2015-3-10 11:23:12
50.2 官方WIDGET_Multiedit实例
    官方的这个实例很好的演示了Multiedit的使用,这个例子在模拟器中的位置:
50.2.png
源码如下(程序中进行了详细的注释,代码有点长,这里只贴出了主代码):
  1. /*********************************************************************
  2. *
  3. * _DemoMultiedit
  4. */
  5. static void _DemoMultiedit(void) {
  6. GUI_RECT Rect;
  7. int WinFlags;

  8. _hFrame = 1;
  9. _Overwrite = 0;
  10. _ReadOnly = 0;
  11. _Password = 0;

  12. /* 下面的几个函数主要实现框架窗口的创建 */
  13. _ChangeInfoText("Create framewin", SPEED);
  14. /* 创建框架窗口 */
  15. _hFrame = FRAMEWIN_CreateEx(60, 80, 200, 120, WM_HBKWIN, WM_CF_SHOW, 0, 0, "Notepad", 0);
  16. /* 获得框架窗口的客户端窗口 */
  17. _hClient = WM_GetClientWindow(_hFrame);
  18. /* 设置框架窗口的回调函数 */
  19. _pcbFrameWin = WM_SetCallback(_hFrame, _cbFrameWin);
  20. /* 设置框架窗口中客户端窗口的回调函数 */
  21. _pcbFrameWinClient = WM_SetCallback(_hClient, _cbFrameWinClient);

  22. /* 设置框架窗口的属性 */
  23. FRAMEWIN_SetMoveable(_hFrame, 1);
  24. FRAMEWIN_SetActive(_hFrame, 1);
  25. FRAMEWIN_SetTextAlign(_hFrame, GUI_TA_HCENTER | GUI_TA_VCENTER);
  26. FRAMEWIN_SetFont(_hFrame, &GUI_Font8x12_ASCII);
  27. FRAMEWIN_SetTitleHeight(_hFrame, 16);

  28. /* 增加框架窗口按钮,主要是关闭,最小化,最大化按钮 */
  29. if (_ChangeInfoText("Add framewin buttons", SPEED)) return;
  30. FRAMEWIN_AddCloseButton(_hFrame, FRAMEWIN_BUTTON_LEFT, 0);
  31. FRAMEWIN_AddMaxButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 0);
  32. FRAMEWIN_AddMinButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 1);
  33. WM_InvalidateWindow(_hFrame);

  34. /* 创建按钮 */
  35. if (_ChangeInfoText("Add option buttons", SPEED)) return;
  36. _hWrapButton = _CreateLButton("None", 0, 36, 16, _hClient, ID_NONEWRAP);
  37. _CreateLButton("Word", 37, 36, 16, _hClient, ID_WORDWRAP);
  38. _CreateLButton("Char", 74, 36, 16, _hClient, ID_CHARWRAP);
  39. _CreateRButton("PSW", 52, 25, 16, _hClient, ID_PASSWORD);
  40. _CreateRButton("OVR", 26, 25, 16, _hClient, ID_OVERWRITE);
  41. _CreateRButton("R/O", 0, 25, 16, _hClient, ID_READONLY);
  42. _SetButtonState(_hWrapButton, 1);

  43. /* 创建框架窗口 */
  44. if (_ChangeInfoText("using\nMULTIEDIT_CreateEx", SPEED)) return;
  45. WinFlags = WM_CF_SHOW | WM_CF_ANCHOR_RIGHT | WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_TOP | WM_CF_ANCHOR_BOTTOM;
  46. WM_GetClientRectEx(_hClient, &Rect);
  47. /* 在框架窗口的客户端窗口中创建多行文本控件 */
  48. _hMEdit = MULTIEDIT_CreateEx(0, 0, 0, Rect.y1 - 16 + 1, _hClient, WinFlags, MULTIEDIT_CF_INSERT, 0, 0, "");
  49. /* 设置多行文本控件的回调函数 */
  50. _pcbMultiEdit = WM_SetCallback(_hMEdit, _cbMultiEdit);
  51. /* 激活自动使用水平滚动条 */
  52. MULTIEDIT_SetAutoScrollH(_hMEdit, 1);
  53. /* 激活自动使用垂直滚动条 */
  54. MULTIEDIT_SetAutoScrollV(_hMEdit, 1);
  55. /* 设置聚焦 */
  56. WM_SetFocus(_hMEdit);

  57. /* 下面主要是演示一下多行文本控件支持的几个API函数 */
  58. if (_ChangeInfoText("using\nMULTIEDIT_SetText", SPEED)) return;
  59. /* 设置文本 */
  60. MULTIEDIT_SetText(_hMEdit, "This sample demonstrates the use of a multiedit widget!");

  61. /* 设置字体 */
  62. if (_ChangeInfoText("using\nMULTIEDIT_SetFont", SPEED)) return;
  63. MULTIEDIT_SetFont(_hMEdit, &GUI_Font16_1);

  64. /* 设置文本颜色 */
  65. if (_ChangeInfoText("using\nMULTIEDIT_SetTextColor", SPEED)) return;
  66. MULTIEDIT_SetTextColor(_hMEdit, 0, 0xE00000);

  67. /* 设置背景色 */
  68. if (_ChangeInfoText("using\nMULTIEDIT_SetBkColor", SPEED)) return;
  69. MULTIEDIT_SetBkColor(_hMEdit, 0, 0xD0FFFF);

  70. /* 启用字词换行 */
  71. if (_ChangeInfoText("using\nMULTIEDIT_SetWrapWord", SPEED)) return;
  72. MULTIEDIT_SetWrapWord(_hMEdit);

  73. /* 设置字词换行按钮的状态 */
  74. _SetButtonState(_hWrapButton, 0);
  75. _hWrapButton = WM_GetDialogItem(_hClient, ID_WORDWRAP);
  76. _SetButtonState(_hWrapButton, 1);

  77. /* 用于设置边界 */
  78. if (_ChangeInfoText("using\nMULTIEDIT_SetHBorder", SPEED)) return;
  79. MULTIEDIT_SetHBorder(_hMEdit, 3);

  80. /* 设置提示文本 */
  81. if (_ChangeInfoText("using\nMULTIEDIT_SetPrompt", SPEED)) return;
  82. MULTIEDIT_SetPrompt(_hMEdit, "Type: ");

  83. if (_ChangeInfoText("Play with multiedit...", SPEED)) return;

  84. while (_hFrame)
  85. {
  86. GUI_Delay(100);
  87. }
  88. }

  89. /*********************************************************************
  90. *
  91. * public code
  92. *
  93. **********************************************************************
  94. */
  95. /*********************************************************************
  96. *
  97. * MainTask
  98. */
  99. void MainTask(void) {
  100. GUI_Init();
  101. #if GUI_SUPPORT_MEMDEV
  102. WM_SetCreateFlags(WM_CF_MEMDEV);
  103. #endif
  104. GUI_CURSOR_Show();
  105. WM_SetCallback(WM_HBKWIN, _cbBkWin);
  106. while(1) {
  107. /* 演示多行文本 */
  108. _DemoMultiedit();
  109. *_acInfoText = 0;
  110. WM_InvalidateWindow(WM_HBKWIN);
  111. GUI_Delay(SPEED);
  112. }
  113. }
复制代码
实际显示效果如下:
50.3.png


baiyongbin2009 回答时间:2015-3-10 11:23:57
50.3 使用uCGUIBulder建立多行文本控件
    用uCGUIBulder4.0建立如下界面:
50.4.png
    为列表框添加成员的方法如下:
50.5.png
    将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中):
50.6.png
50.4 总结
    本期教程主要是跟大家讲解了多行文本控件的基础知识。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的多行文本控件API,其它的API大家都可以试试。

hehe212121 回答时间:2015-3-10 13:19:41
谢谢分享 帮顶

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版