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

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

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

) @/ V6 W) [- E' L, [( V8 Y
    本期教程讲解STemWin支持的多行文本控件。
    50. 1 多行文本控件介绍
    50. 2 官方WIDGET_Multiedit实例
    50. 3 使用uCGUIBulder建立多行文本控件
    50. 4 总结
' P7 ~2 J! }- E2 A. M
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’)。如果小工具在只读模式下工作,光标将移到下一行的开头。
+ w" C; e- k! B4 I  D
赞 收藏 评论3 发布时间:2015-3-10 11:21

举报

3个回答
baiyongbin2009 回答时间:2015-3-10 11:23:12
50.2 官方WIDGET_Multiedit实例
    官方的这个实例很好的演示了Multiedit的使用,这个例子在模拟器中的位置:
50.2.png
源码如下(程序中进行了详细的注释,代码有点长,这里只贴出了主代码):
  1. /*********************************************************************5 q, H! J# P/ d/ W' \  E
  2. *, n! S% j( H& D+ X2 s: [
  3. * _DemoMultiedit! t/ E9 u- Y8 g" n2 ^
  4. */# i; c7 B* ^4 f: e
  5. static void _DemoMultiedit(void) {
    9 N, o7 b1 D- V  m  h: }
  6. GUI_RECT Rect;
    8 w2 W$ d( s- |2 c4 p+ q2 B
  7. int WinFlags;
    2 K+ Y9 ?0 o# M* U5 u9 v
  8. ! Y* h. c! e# n6 \0 j3 C
  9. _hFrame = 1;
    % v* d# m+ }1 \" h0 v
  10. _Overwrite = 0;
    " d' M& f, y9 X0 e9 \
  11. _ReadOnly = 0;3 S; _. P! {' k# W$ G% [% S+ {' l, P
  12. _Password = 0;$ B( K- d9 k" Z

  13. & I- c( H4 A8 x
  14. /* 下面的几个函数主要实现框架窗口的创建 */
    * |( K9 b, Y( Z" R9 R; P
  15. _ChangeInfoText("Create framewin", SPEED);, C8 f0 X" @' e' A3 r
  16. /* 创建框架窗口 */* h4 Q$ _6 F, ^0 R( c
  17. _hFrame = FRAMEWIN_CreateEx(60, 80, 200, 120, WM_HBKWIN, WM_CF_SHOW, 0, 0, "Notepad", 0);
    ( B% \# ?2 H9 u: P- K% j
  18. /* 获得框架窗口的客户端窗口 */
    $ W# t" U2 h  ]# J
  19. _hClient = WM_GetClientWindow(_hFrame);
    : f/ M9 |/ |' a0 }  i$ G
  20. /* 设置框架窗口的回调函数 */
    4 g7 M$ l7 N( K) L: x8 q8 N
  21. _pcbFrameWin = WM_SetCallback(_hFrame, _cbFrameWin);
    : U; W5 d3 z7 Y
  22. /* 设置框架窗口中客户端窗口的回调函数 */5 G8 `$ V% s2 G* E0 F) L0 A# |! ^
  23. _pcbFrameWinClient = WM_SetCallback(_hClient, _cbFrameWinClient);! G8 Y4 O$ O; b/ G. [7 V

  24. 8 Q. l3 z& I& M, h7 d6 e- R) P1 V
  25. /* 设置框架窗口的属性 */
    2 @$ o" @2 ?, Y% X
  26. FRAMEWIN_SetMoveable(_hFrame, 1);
    3 t3 @- H# [! ~6 P' K. |4 R
  27. FRAMEWIN_SetActive(_hFrame, 1);
    7 W! U1 T( I3 ?, v
  28. FRAMEWIN_SetTextAlign(_hFrame, GUI_TA_HCENTER | GUI_TA_VCENTER);
    % {, }+ S7 W. A) H$ _3 W5 j
  29. FRAMEWIN_SetFont(_hFrame, &GUI_Font8x12_ASCII);: G6 t7 |% P: Q+ @( a& [( K+ L5 j
  30. FRAMEWIN_SetTitleHeight(_hFrame, 16);
    1 o) U( J$ V. E; ]0 M( J
  31. ' [0 \4 P, R+ F' U5 M0 \
  32. /* 增加框架窗口按钮,主要是关闭,最小化,最大化按钮 */
    + S: i; u4 U8 K  ~/ v
  33. if (_ChangeInfoText("Add framewin buttons", SPEED)) return;
    3 h' x$ Y3 F' f& P) Q! W
  34. FRAMEWIN_AddCloseButton(_hFrame, FRAMEWIN_BUTTON_LEFT, 0);
    3 u. ], P6 h6 A3 l1 M) Z
  35. FRAMEWIN_AddMaxButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 0);+ r7 y' S* Z$ a2 U- {; [$ N7 m
  36. FRAMEWIN_AddMinButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 1);3 D* z6 b1 ^7 z  {* @; p
  37. WM_InvalidateWindow(_hFrame);
    2 R) u$ f5 ?8 |5 `
  38. * g) n" g) E" e9 @% R8 Y
  39. /* 创建按钮 */
    $ D% L7 U: {) [5 p
  40. if (_ChangeInfoText("Add option buttons", SPEED)) return;
    2 S( B8 _" q5 x* \
  41. _hWrapButton = _CreateLButton("None", 0, 36, 16, _hClient, ID_NONEWRAP);
    + j1 S5 c4 f- S) k) {# z8 ?, \
  42. _CreateLButton("Word", 37, 36, 16, _hClient, ID_WORDWRAP);( I: [0 z, Q9 t9 {6 ]! E2 {  n1 g0 z
  43. _CreateLButton("Char", 74, 36, 16, _hClient, ID_CHARWRAP);+ V- y, m/ ~7 ]4 y+ Z# V
  44. _CreateRButton("PSW", 52, 25, 16, _hClient, ID_PASSWORD);# s1 w1 b- _% v; X2 a
  45. _CreateRButton("OVR", 26, 25, 16, _hClient, ID_OVERWRITE);3 r! i7 N) c1 ]$ w( [
  46. _CreateRButton("R/O", 0, 25, 16, _hClient, ID_READONLY);
    ) F/ {9 W* X9 |) B3 k  i
  47. _SetButtonState(_hWrapButton, 1);
    8 g# m1 B6 S: p/ }" O3 R3 D# ]

  48. 9 j, j0 T9 G& v* ]0 ?1 d
  49. /* 创建框架窗口 */0 ]" ~4 [4 D' E
  50. if (_ChangeInfoText("using\nMULTIEDIT_CreateEx", SPEED)) return;
    , m* A9 g/ w' E; o' R  V/ o
  51. WinFlags = WM_CF_SHOW | WM_CF_ANCHOR_RIGHT | WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_TOP | WM_CF_ANCHOR_BOTTOM;
    + @/ f0 n. w2 Z( k! J) D
  52. WM_GetClientRectEx(_hClient, &Rect);$ ~8 l- a2 S9 L; T+ }4 _6 r" [* k# u( ^
  53. /* 在框架窗口的客户端窗口中创建多行文本控件 */0 ]# l) F) N0 J
  54. _hMEdit = MULTIEDIT_CreateEx(0, 0, 0, Rect.y1 - 16 + 1, _hClient, WinFlags, MULTIEDIT_CF_INSERT, 0, 0, "");+ e  p. w) ?8 r
  55. /* 设置多行文本控件的回调函数 */! s, e" G' r& L2 W# a; w& F
  56. _pcbMultiEdit = WM_SetCallback(_hMEdit, _cbMultiEdit);$ a& Y) C( l& J, B
  57. /* 激活自动使用水平滚动条 */# f, W$ e( i0 L0 q& V( E' v
  58. MULTIEDIT_SetAutoScrollH(_hMEdit, 1);0 E7 L5 D* B  h( {( D; h( a
  59. /* 激活自动使用垂直滚动条 */
    * x# K3 p3 F- s5 S# I
  60. MULTIEDIT_SetAutoScrollV(_hMEdit, 1);
    - X1 u& [, m( S* R
  61. /* 设置聚焦 */& R+ v  j9 @% ^" n
  62. WM_SetFocus(_hMEdit);
    6 g8 ^, s4 r) _) R/ w
  63. 9 r% W: D  L7 {4 B1 z
  64. /* 下面主要是演示一下多行文本控件支持的几个API函数 */* g( z4 q2 Y/ p) K
  65. if (_ChangeInfoText("using\nMULTIEDIT_SetText", SPEED)) return;+ ?9 I/ v% ^* V( o$ G7 V9 Y# Z
  66. /* 设置文本 */
    % |! F% d* F; \/ E. G, E, m$ Y$ d7 L. U
  67. MULTIEDIT_SetText(_hMEdit, "This sample demonstrates the use of a multiedit widget!");7 W7 V) H4 |  \* `4 w( j
  68. - o* y, w% t5 N3 J% F
  69. /* 设置字体 */
    6 @( c5 j- P5 @3 E8 X- P
  70. if (_ChangeInfoText("using\nMULTIEDIT_SetFont", SPEED)) return;
    / ]! W0 y+ o( f0 v1 X
  71. MULTIEDIT_SetFont(_hMEdit, &GUI_Font16_1);6 i3 U5 k* Z, Z7 l

  72. , k8 |2 P8 w2 o# P
  73. /* 设置文本颜色 */2 }* p7 d) X$ }& `8 @
  74. if (_ChangeInfoText("using\nMULTIEDIT_SetTextColor", SPEED)) return;1 A/ b/ W. H3 m" m3 u
  75. MULTIEDIT_SetTextColor(_hMEdit, 0, 0xE00000);
      T  @" l: r* S

  76. $ ?# N1 Y+ e8 b$ x; A
  77. /* 设置背景色 */) y4 S$ [/ K" x
  78. if (_ChangeInfoText("using\nMULTIEDIT_SetBkColor", SPEED)) return;
    # Q; ~2 V+ \* C8 t/ a5 X) v; z
  79. MULTIEDIT_SetBkColor(_hMEdit, 0, 0xD0FFFF);# ]/ K! x) N1 s" |4 c- ?

  80. : I  k% Z# k) {+ |
  81. /* 启用字词换行 */8 }* @7 e  r9 T2 H, j; S
  82. if (_ChangeInfoText("using\nMULTIEDIT_SetWrapWord", SPEED)) return;& G: L" t1 J5 E; E
  83. MULTIEDIT_SetWrapWord(_hMEdit);- k% k# c  P0 V* A3 S

  84. 4 U! E( J. `8 l* e% S
  85. /* 设置字词换行按钮的状态 */
    : C( w! ]: o3 M
  86. _SetButtonState(_hWrapButton, 0);4 |& v5 d- [$ O+ ]% n; H
  87. _hWrapButton = WM_GetDialogItem(_hClient, ID_WORDWRAP);1 N; d  z# ?' \
  88. _SetButtonState(_hWrapButton, 1);
    # y7 s. E2 {' g) [

  89. + @  y; V6 a1 H) m) z' b# j! E
  90. /* 用于设置边界 *// L+ ?0 D7 I( C, |
  91. if (_ChangeInfoText("using\nMULTIEDIT_SetHBorder", SPEED)) return;6 t4 b6 v& c. m
  92. MULTIEDIT_SetHBorder(_hMEdit, 3);, r) v4 k' M) o5 M1 J3 O- B
  93. 3 G4 G! B/ I1 b# ^  I9 F8 x
  94. /* 设置提示文本 */1 s2 r* M# ~/ C9 c2 s: u
  95. if (_ChangeInfoText("using\nMULTIEDIT_SetPrompt", SPEED)) return;' z6 O; U1 |8 n( x% M  j3 E- a
  96. MULTIEDIT_SetPrompt(_hMEdit, "Type: ");
    # v1 U& x' t, b

  97. ) R% `# v# q2 |" m) b+ a% X" k
  98. if (_ChangeInfoText("Play with multiedit...", SPEED)) return;3 @  g% D3 m+ X# {! L5 M

  99. 9 U) @5 A7 s7 J; a& c+ Z2 h; \
  100. while (_hFrame) / A$ `7 Y3 A) ^# B. q' W' A4 z
  101. {0 w, N, r: z, x; T* s
  102. GUI_Delay(100);; `& v/ y! B* |2 F- Y
  103. }
    + b8 \, }- j. y/ ~" `* M, f
  104. }
    3 g, B0 E4 @. ~2 s1 y" b

  105. 4 o& h* a( I2 g" P
  106. /*********************************************************************; v) x4 P9 ]) L2 x/ D- D' w
  107. *
    $ m  D8 V" @( u3 Z7 p+ t
  108. * public code  `4 |' B/ }# x; i( z( E
  109. *  k3 f' j+ B* ~* Z+ F
  110. **********************************************************************: a" O0 P' ~; Y, H/ I
  111. */; q( r4 ^/ T+ e
  112. /*********************************************************************
    0 A5 C' h. @6 l0 U
  113. *
    + d+ u! p' A: u0 i
  114. * MainTask# Y7 B% Q. G. [2 W
  115. */) R9 z# \6 a' X
  116. void MainTask(void) {, B$ n; l  {, s6 n. ^5 K+ y
  117. GUI_Init();6 n+ q0 h$ c& r0 F2 X. j# u
  118. #if GUI_SUPPORT_MEMDEV
    % Q1 ^8 c& _% ]  }" m" L
  119. WM_SetCreateFlags(WM_CF_MEMDEV);
    9 `! F# I. Z; C' n2 S  T
  120. #endif
      G8 _0 T' E2 r) d9 h: H- k5 A
  121. GUI_CURSOR_Show();
    . l# D7 b( w+ {9 n0 P/ {3 p2 A2 M
  122. WM_SetCallback(WM_HBKWIN, _cbBkWin);% F5 @( ~+ i: a  _7 D
  123. while(1) {
    ! R& E0 X2 D' `/ b! n" X
  124. /* 演示多行文本 */; _+ {- C" u* _+ X  ^
  125. _DemoMultiedit();- `) d- c* [. b9 s8 E2 ~0 X& d( \6 O
  126. *_acInfoText = 0;
    3 ~; y5 o! T1 ~6 p+ j/ _
  127. WM_InvalidateWindow(WM_HBKWIN);/ a" f0 l" N4 l; U; T/ `
  128. GUI_Delay(SPEED);
    3 ^' D4 l) h; u: u5 `3 j2 m
  129. }
    ; Z! X1 F+ Q/ [
  130. }
复制代码
实际显示效果如下:
50.3.png

4 f1 J3 ^9 Q5 D* X! _! @8 q

) P  D  `  w5 j0 \) o. _4 c9 Q
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大家都可以试试。

# H8 Y9 c+ @+ G  s- Y$ u7 c# z
hehe212121 回答时间:2015-3-10 13:19:41
谢谢分享 帮顶
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版