硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3901|回复: 5
收起左侧

[emWin教程入门篇] 【STemWin教程】第50章 MULTIEDIT-多行文本控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-9 15:12:44 | 显示全部楼层 |阅读模式
特别说明:完整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’)。如果小工具在只读模式下工作,光标将移到下一行的开头。


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


50.3 使用uCGUIBulder建立多行文本控件
    用uCGUIBulder4.0建立如下界面:
50.4.png

    为列表框添加成员的方法如下:
50.5.png

    将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中):
50.6.png


50.4 总结
    本期教程主要是跟大家讲解了多行文本控件的基础知识。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的多行文本控件API,其它的API大家都可以试试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2018-9-26 14:16:08 | 显示全部楼层
半路用到 覆盖模式输入,有些默认配置一时半会还是比较难理解。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-4-5 18:15:46 | 显示全部楼层
您好,这里有点不解
  1. /* 获得框架窗口的客户端窗口 */
  2.   _hClient = WM_GetClientWindow(_hFrame);
  3.   /* 设置框架窗口的回调函数 */
  4.   _pcbFrameWin       = WM_SetCallback(_hFrame,  _cbFrameWin);
  5. /* 设置框架窗口中客户端窗口的回调函数 */
  6.   _pcbFrameWinClient = WM_SetCallback(_hClient, _cbFrameWinClient);
复制代码

    _pcbFrameWin _pcbFrameWinClient  这两个指针有什么用处呢
我看到在这_cbFrameWin    _cbFrameWinClient回调函数分别调用,不理解他的用处?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2019-4-5 18:22:52 | 显示全部楼层
wx_tl3LELl8 发表于 2019-4-5 18:15
您好,这里有点不解

    _pcbFrameWin _pcbFrameWinClient  这两个指针有什么用处呢

了解一个知识点。就是框架窗口FrameWin是由主窗口和客户区窗口组成的,所以可以分别设置回调函数。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-4-5 19:04:28 | 显示全部楼层
eric2013 发表于 2019-4-5 18:22
了解一个知识点。就是框架窗口FrameWin是由主窗口和客户区窗口组成的,所以可以分别设置回调函数。

我的意思是函数WM_SetCallback返回的那个指针有什么作用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2019-4-5 20:05:11 | 显示全部楼层
wx_tl3LELl8 发表于 2019-4-5 19:04
我的意思是函数WM_SetCallback返回的那个指针有什么作用

之前的回调,看emwin手册,如果用不上无需返回
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 17:36 , Processed in 0.186548 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表