特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接' c$ T! J1 _3 g6 @ u9 l- A
第47章 LISTBOX-列表框控件 $ q" ]! K# W- b; E' {% e
本期教程讲解STemWin支持的列表框控件。 47. 1 列表框控件介绍 47. 2 官方WIDGET_ListBox实例 47. 3 对话框上使用列表控件 47. 4 总结 47.1 列表框控件介绍 列表框用于选择列表的一个元素。创建的列表框可以没有环绕的框架窗口,如下所示,或者作为FRAMEWIN控件的子窗口建立。列表框中的项目被选定后,会突出显示。注意,所选项目的背景色取决于列表框窗口是否有输入焦点。 47.1.1 列表框支持的通知代码 以下事件是列表框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的: | | | | | | WM_NOTIFICATION_MOVED_OUT | 列表框已被点击,且指针已从列表框处移开,没有释放。 | WM_NOTIFICATION_SCROLL_CHANGED | | WM_NOTIFICATION_SEL_CHANGED | | 47.2 官方WIDGET_ListBox实例 官方的这个实例很好的演示了LISTBOX的使用,这个例子在模拟器中的位置: 源码如下(程序中进行了详细的注释): - ----------------------------------------------------------------------
4 ~4 Y# J+ b5 c6 v$ \ Z - File : WIDGET_ListBox.c. Y7 k5 g3 e" E, G) f
- Purpose : Example demonstrating the LISTBOX widget1 x# a* A& l P/ s
- ----------------------------------------------------------------------' v1 w: C- D' [( y
- */$ x' [6 d4 [4 j8 N. q
-
4 E+ A9 g6 C4 ^/ B$ a - #include "GUI.h"7 c' L+ i6 u8 }* t/ a( I
- #include "FRAMEWIN.h"
, v9 R' v6 I9 Y7 f6 T - #include "LISTBOX.h"% G* m) V) h" K- @
- #include <stddef.h>/ H; l' _$ Q9 W6 r. ~( ]9 K9 y5 i
-
/ f: Q3 m' x, d - #define SPEED 1000
$ _ J; y5 N4 z% v: } -
' }+ f( l; z$ {1 i: A0 u - /*******************************************************************; w) a1 Y8 E6 Q' n: D
- *
0 Z* V% E2 z0 f# @ - * static variables% o6 T: S3 m" r' ~" ^: A! W5 O) O
- *
( K o. ^6 h! x5 o* ^8 W9 _9 N - ********************************************************************/ H% n& d+ L' H0 ~
- */ B3 n. \8 R6 [3 u9 d
- 6 [' X9 S; _ u* m
- static const GUI_ConstString _ListBox[] = {
! V0 y8 {$ w0 Z5 ]* P - "English", "Deutsch", NULL% j) ~3 P& b0 Z" u) ^3 l
- };
7 O8 M+ l( v" n, V! f! v - ! J2 h6 x3 n% _1 |: {* J
- /*******************************************************************
8 n; Y2 Y* ~7 X - *$ u, i k9 M: L! h
- * _ShowSeveralFunctions3 m- p% p2 p# f
- */& \1 _. u5 D3 `% w
- static void _ShowSeveralFunctions(LISTBOX_Handle hListBox) { Z' C% q8 `0 b4 w. l" o, ~4 k
- int NumEntries, i;0 Z$ D( B0 r; \, p+ u
- - K. E: Q f6 }+ ~6 f* R, Z
- /* 增加垂直滚动条 */
/ j1 X) Y& [( v" q. B - GUI_DispStringAtCEOL("SCROLLBAR_CreateAttached", 5, 55);
- b: A( i E' k - GUI_Delay(SPEED);& A t# W4 ~4 _' i9 e
- SCROLLBAR_CreateAttached(hListBox, SCROLLBAR_CF_VERTICAL);
8 f7 x; Y- G" L7 {/ }$ o( n/ C9 l - GUI_Delay(SPEED * 0.75);
" i7 m* ?( K$ q) \+ y6 J - ( ^8 d" X+ i+ E0 B
- /* 增加字符串 */+ P; w5 k0 E$ c
- GUI_DispStringAtCEOL("LISTBOX_AddString", 5, 55);
2 D2 X' f3 [( v# J% F3 X2 p+ G - GUI_Delay(SPEED);' F' j) ~, N7 _+ X5 }; U
- LISTBOX_AddString(hListBox, "Fran鏰is");4 L( t) ^) i/ d" t9 I
- GUI_Delay(SPEED / 6);! w" m6 ^9 o2 U% W- J0 ^ {' p! N+ p
- LISTBOX_AddString(hListBox, "Japanese");
$ Z3 a. C; O A; ]5 x/ y2 a/ v) V - GUI_Delay(SPEED / 6);
0 B: l% \8 S2 S. Z5 Q. x; R6 s - LISTBOX_AddString(hListBox, "Italiano");
/ w5 E0 d. n( \# L. f2 h - GUI_Delay(SPEED / 6);
$ V* H' k$ v5 \4 f - LISTBOX_AddString(hListBox, "Espa駉l");; P4 D5 R3 \ ]( J4 Q M! f
- GUI_Delay(SPEED / 6);
. T" P$ F4 q7 _( h - LISTBOX_AddString(hListBox, "Other language ...");$ O7 u+ n4 }( g1 U" z0 _$ t) b
- GUI_Delay(SPEED * 0.6);7 F7 B9 l# r' L
- 2 q* j3 o: L$ z8 \4 q' Q
- /* 设置输入焦点 */
- @# C$ U) l4 ]: X0 N$ \9 \ - GUI_DispStringAtCEOL("WM_SetFocus", 5, 55);
& p( H( y9 W& ~ - GUI_Delay(SPEED * 0.9);. _4 Q h" q, u* ]
- WM_SetFocus(hListBox);
" S! ^ r( O* m; o - GUI_Delay(SPEED * 0.7);) ^2 h$ r9 q6 F- h" {
-
0 l0 t$ H% y: o# s - /* 设置字体 */- Q4 ^) `! C7 K5 [. g
- GUI_DispStringAtCEOL("LISTBOX_SetFont", 5, 55);3 t4 H' d4 H Q
- GUI_Delay(SPEED * 0.9);
3 a1 }. R9 j$ o; Z L F/ x0 f - LISTBOX_SetFont(hListBox, &GUI_Font13B_1);
9 \. r4 M$ Q! R; | - GUI_Delay(SPEED * 0.7);
# c5 k; o, P% c) g) K/ Y. M3 I- ~ - : D1 Q* g a) S! d1 h) S
- /* 增加选项 */" h* n7 n# j* ~4 {+ l! |/ p- r
- GUI_DispStringAtCEOL("LISTBOX_IncSel", 5, 55);
- T' u, I& ^- E% S# ~) ` - GUI_Delay(SPEED);
+ F' d) g0 T6 S% ]+ b; R. x - NumEntries = LISTBOX_GetNumItems(hListBox);
$ k% ^2 [/ s, q* _& c$ H - for (i = 0; i < NumEntries - 1; i++) {5 }) ?3 l6 }; K' Y' x( F8 ]
- LISTBOX_IncSel(hListBox);
" Z0 X8 w/ p/ r8 F" W" Q( N - GUI_Delay(SPEED / 6);$ h& b7 i* }4 ~' S- q
- }* A3 G3 d; l% f% r, ]4 v/ F0 i: O9 C
- GUI_Delay(SPEED / 4);
& q2 K( o4 D+ C; p2 \ - " G( | I: {1 ^& y3 P( p
- ! I5 t8 R8 N4 r8 z" @
- /* 自动增加滚动条 */+ Z3 Q: ~) B* e2 z, D! _2 M
- GUI_DispStringAtCEOL("Optional automatic scrollbar", 5, 55);# V O2 h! }2 d9 b+ d) t) Q" j
- GUI_Delay(SPEED);
$ A; p1 @$ s [$ f2 |* R - LISTBOX_SetAutoScrollH(hListBox, 1);5 }! i9 P5 y" v0 t/ j! n3 v
- LISTBOX_SetAutoScrollV(hListBox, 1);
, H9 X0 H6 i! j! g - GUI_Delay(SPEED * 0.75);
6 P1 W) T2 l- U5 ? -
: V/ f+ h7 l2 T* _" n -
% W! |+ i! A& J* t' W' [2 P - /* Set font */, Y8 e. D! J9 Z2 d. r
- /* 设置字体 */4 Z2 ]+ d6 q0 G, Z! b9 q
- GUI_DispStringAtCEOL("LISTBOX_SetFont", 5, 55);+ U! c- \$ Q* V6 @' }: a$ m* ~
- GUI_Delay(SPEED);
- v" C/ z1 Q4 v6 ?0 L& Q - LISTBOX_SetFont(hListBox, &GUI_Font16B_1);
: J0 P/ R. f# g+ ^ - GUI_Delay(SPEED * 0.75);
# p' c, n2 r6 W* A -
& a [1 w3 [7 N, Y! N7 u& t - /* 递增选择 */* M5 E' ?% V% l. l$ y2 u
- GUI_DispStringAtCEOL("LISTBOX_DecSel", 5, 55);( k: W0 N5 y' G4 `- z8 r
- GUI_Delay(SPEED);6 q8 |' a6 j& p- S q5 z
- for (i = 0; i < NumEntries - 1; i++) {
/ l& z6 @4 P! a - LISTBOX_DecSel(hListBox);( i1 @! |, C( ?% p
- GUI_Delay(SPEED / 6);
4 K6 M$ X/ I& J - }
) M* b, Y" h2 o# n r - GUI_Delay(SPEED / 4);
+ t- I; O3 S' P, C3 o! S. l; ] - - s! }4 X- d0 B, N# w- z4 p
- /* 更改滚动条的属性 */
! k8 B4 q; |; r' y+ A# z8 D - GUI_DispStringAtCEOL("Change scrollbar width", 5, 55);
0 G% P; r' c! y2 X/ [% T - GUI_Delay(SPEED * 0.7);
. w- v, t8 `6 o4 H9 N+ [ - {+ E" r3 V' F0 N6 M6 @
- /* 得到滚动条的句柄 从而去修改滚动条的属性 */
, {2 z% I9 i& j% n/ y, [6 E' ` - SCROLLBAR_Handle hScrollH = WM_GetDialogItem(hListBox, GUI_ID_HSCROLL);4 w# J1 O+ v0 b9 v! j8 n
- SCROLLBAR_Handle hScrollV = WM_GetDialogItem(hListBox, GUI_ID_VSCROLL);
) E y" o B, x" h8 T# u3 ? - SCROLLBAR_SetWidth(hScrollV, 14);
" [8 r8 i6 [+ P5 t* N/ |1 _0 e6 T - GUI_Delay(SPEED / 4);
4 {% y) @* b# c$ m3 G4 {# _ - SCROLLBAR_SetWidth(hScrollH, 14);
. J0 B4 J; {% J- w) Q - GUI_Delay(SPEED * 0.6);7 E2 r& G0 J# v& V
- }
( [$ P, l: U6 K& M - 1 [0 M$ e5 M! H4 Z; F) Z) e
-
9 C5 ?3 e( ?4 d - /* 设置列表框的大小 */
' ?6 S- ?1 Q5 L1 I& J6 z {( d - GUI_DispStringAtCEOL("Change size of listbox", 5, 55);( r0 w5 J: c; f3 j) l7 k
- GUI_Delay(SPEED * 0.75);; ^6 I/ C$ @: y, w+ ^
- WM_ResizeWindow(hListBox, -15, 0);
8 }! @1 V1 J R) b" l- Y - GUI_Delay(SPEED / 4);. s8 I" r2 U0 ^( {
- WM_ResizeWindow(hListBox, 0, -15);
* |2 j; w9 `# H+ z - GUI_Delay(SPEED / 4);
( `4 k+ t/ H. h( _. s - WM_ResizeWindow(hListBox, 15, 0);
0 ]& _) W& ^: U* p - GUI_Delay(SPEED / 4);
( ^2 w# l& u$ {8 k4 A, R - WM_ResizeWindow(hListBox, 0, 15);, y+ R& P- u" Z% e
- GUI_Delay(SPEED / 2);
$ f8 g/ `0 h. ~6 Y -
0 I. o: t/ h' t" S. O) e' W -
; K( ]& _, y3 H i& P. t$ X* e" e - /* 设置相应的项目禁能 注意0是第一个项目 */ {3 K, k' [5 H6 I; }8 ?
- GUI_DispStringAtCEOL("LISTBOX_SetItemDisabled", 5, 55);- M _9 P+ U: h- x5 j
- GUI_Delay(SPEED);
. X2 z1 Q2 g# v - LISTBOX_SetItemDisabled(hListBox, 4, 1);1 s% G7 c! B2 u, \) I4 e
- GUI_Delay(SPEED * 0.75);
D( p: s4 ]$ ~$ a8 y - , E# q0 E9 i' b) C9 K/ N# L+ [
- 1 M5 @( y3 R) Z
- /* 设置使能多个项目的选择 */& y4 [$ q: `+ T5 i
- GUI_DispStringAtCEOL("LISTBOX_SetMulti", 5, 55);2 m: Q% r. Q4 H
- GUI_Delay(SPEED);
# `' q$ F6 \7 H, _" v8 ~& N3 q1 m0 x - LISTBOX_SetMulti(hListBox, 1);0 G9 }. g L/ N" g' U- a' }
- GUI_Delay(SPEED * 0.75);
7 P7 w# k% K$ G4 b# b1 w, U -
. i2 q6 C5 n& l( [3 z8 s - /* 选择项目 */
6 N: s9 s. n$ E$ ?6 V - GUI_DispStringAtCEOL("LISTBOX_SetItemSel", 5, 55);6 D O! a% S2 Z4 R) j- H$ k
- GUI_Delay(SPEED);
+ n: i: ]1 y, f \9 @ - LISTBOX_SetItemSel(hListBox, 0, 1);
, g. }$ _7 w1 e1 r" e p9 t - GUI_Delay(SPEED / 4);
# j" p! [4 c' g2 w - LISTBOX_SetItemSel(hListBox, 1, 1);
8 b1 ^' ]/ G0 E( T% U+ U - GUI_Delay(SPEED / 4);# s* x* X( Q) b) b) N; \
- LISTBOX_SetItemSel(hListBox, 2, 1);; g+ a# @! y* Z
- GUI_Delay(SPEED * 0.8);
) n) ]2 v6 T' X' N/ s6 ?# ? - 3 l4 x9 N; v6 Q' k* ~
- /* 删除列表框 */. p( e1 U/ T* x! z3 {" ]
- GUI_DispStringAtCEOL("LISTBOX_Delete", 5, 55);
C a/ @: m" b - GUI_Delay(SPEED * 1.1);
+ P" Y- ~. S( \* h; F9 h9 ^ - LISTBOX_Delete(hListBox);
9 c+ K6 { n; H3 C. ~" J - GUI_Delay(SPEED * 0.75);
# b$ d( D; F# x2 J: P - }" w- E6 S& m; k4 Q
- 9 T# _: ]! ?6 P' [& a
- /*******************************************************************0 E+ K9 }' {) V7 k, s
- *
3 _+ q- `3 V' ]& f( I - * _DemoListBox
- ?" c& `( W! T0 c I/ v - */
( c8 w5 s6 N3 b! A( o - static void _DemoListBox(void) {8 D/ \4 p' E1 T4 d" B, U$ [
- LISTBOX_Handle hListBox;
' ?( u$ q i( \5 U - * I: T4 W: g8 A3 D: }) z8 ?5 Y9 N
- /* 显示标题 */: B9 {/ |) `7 J4 ^: \
- GUI_SetBkColor(0xB00000);4 S% g$ z( r8 t0 g: G* w
- GUI_SetColor(0xFFFFFF);
0 `% \' A- t0 ^8 ?) Q/ u2 S - GUI_SetFont(&GUI_Font24_ASCII);- Z- \ q" F7 E6 O/ Q0 y7 N
- GUI_DispStringHCenterAt("Listbox - Sample", 160, 5);1 r3 s/ ?, u5 p9 F' V6 X
- GUI_Delay(SPEED / 2);3 l! \- p5 P3 W0 g, E
-
4 G# ~- O! G) F1 Q4 @4 L - /* 创建列表框 */1 |, a5 Z* ^8 N V/ X2 d% T
- GUI_SetFont(&GUI_Font8x16);0 o# A% }* E! b4 W9 Z
- GUI_SetTextAlign(GUI_TA_LEFT);
3 r$ M. u0 s: n) G5 d8 {; H8 F - GUI_DispStringAtCEOL("using", 5, 40);# @4 K: m. H( k5 ^. T) \2 S1 U$ N
- GUI_DispStringAtCEOL("LISTBOX_Create", 5, 55);/ T- x8 H/ e; |
- GUI_Delay(SPEED * 0.9);
9 O0 k2 _- v+ ^9 b3 K - hListBox = LISTBOX_Create(_ListBox, 100, 80, 120, 115, WM_CF_SHOW);
# e3 h4 Q) G3 c1 f* P7 }' U7 Z - GUI_Delay(SPEED * 0.75);
8 F6 H4 m7 Z) Z4 W2 C) q - 0 T9 K5 e* @( b0 u9 a
- /* 功能演示 */
2 W( Z/ z; N( h9 P - _ShowSeveralFunctions(hListBox);; W) Q9 }! T% G! I5 t# }7 D- _
- /* Clear display */
% y8 k4 ^: L$ O - GUI_Clear();
" u/ H0 W% c/ _+ f - GUI_Delay(SPEED * 1.5);* E( x0 \0 C. C1 {% y; {5 M/ A
- } y$ M6 Z+ e% C, W
- + l$ ]7 ?, Y9 r! S9 ~
- /*******************************************************************
) U4 j2 p, `: T; l: g* q - *$ u2 u% i9 ^* _' x2 J' \9 s' o
- * _DemoListBoxAsChild
2 M, ~9 K# P9 U* A h; [/ e - */! P- l4 H6 V; O/ r/ g
- static void _DemoListBoxAsChild(void) {# d4 |. z% u5 [
- FRAMEWIN_Handle hFrame;" n+ u6 B, F: ^$ b- S& X
- LISTBOX_Handle hListBox;
) Z( s+ R8 ^6 G6 y# D -
9 I+ W& ~, R4 u2 h* @% M' M - /* 显示标题 */
( }! b8 D$ F; B) n6 ? - GUI_SetBkColor(0xB00000);
3 g$ \3 Y/ x! z* u3 m" a8 { - GUI_SetColor(0xFFFFFF);
) m3 p$ }1 o5 U$ e - GUI_SetFont(&GUI_Font24_ASCII);( u7 j+ E; Z' `* t; J' ]
- GUI_DispStringHCenterAt("Listbox as child - Sample", 160, 5);( W, w4 N) t0 m
- GUI_Delay(SPEED / 2);. o, J4 @; a8 g9 t" B$ i
-
% b9 Z& A; D, u; Z" G3 W - /* 创建窗口框架 */
+ ~ x# P+ e) @; e1 l - GUI_SetFont(&GUI_Font8x16);
) l2 L9 N: n! y( M - GUI_SetTextAlign(GUI_TA_LEFT);( P$ E; s4 M: {# i
- GUI_DispStringAtCEOL("using", 5, 40);
7 L" Q! \& M; D5 a) c$ N) I* @1 s - GUI_DispStringAtCEOL("FRAMEWIN_Create", 5, 55);
1 O& N! ^3 x' ^$ Y) q u - GUI_Delay(SPEED);
2 l0 E$ z' T. b - hFrame = FRAMEWIN_Create("List box", NULL, WM_CF_SHOW, 100, 80, 120, 140);
3 U# c& l6 s" R6 o( q0 D$ I6 j5 J - FRAMEWIN_SetFont(hFrame, &GUI_Font16B_ASCII);
% I. `/ P+ H# G* ]* b7 w - FRAMEWIN_SetActive(hFrame, 1);+ A1 ~; Q% o$ K+ z
- GUI_Delay(SPEED * 0.75);: I9 d8 x+ @" T# S: A) R5 T/ a
- / t" ], C. C+ g7 b
-
/ c. K! \& S7 \2 W8 _ - /* 创建列表框 */6 X1 e2 w% x3 F
- GUI_DispStringAtCEOL("LISTBOX_CreateAsChild", 5, 55);
/ ?$ C9 Z6 V6 W& r. K, t - GUI_Delay(SPEED);9 R* r- p- n" a6 \/ x: [! W
- /* 其实坐标0,0,水平和垂直的大小如果设置为0的话,那么将默认为父窗口的用户区大小 */
) {. T0 S. o9 |$ H! p. w - hListBox = LISTBOX_CreateAsChild(_ListBox, WM_GetClientWindow(hFrame), 0, 0, 0, 0, WM_CF_SHOW);
% H! x; G( B& A$ R! o, f) O - GUI_Delay(SPEED * 0.75);
' q! f$ S Q2 v* T5 X - 0 r% F9 J, i7 ]6 l2 N' G
- _ShowSeveralFunctions(hListBox);
8 @% L$ J/ F, `6 b2 O# ? -
& f+ P$ @7 n" K( t9 { - /* 删除框架窗口*/
1 j! |& z1 o8 p - GUI_DispStringAtCEOL("FRAMEWIN_Delete", 5, 55);5 N$ y1 L/ Y4 l
- GUI_Delay(SPEED);
* W& `1 m% M6 k h1 N: s1 C - FRAMEWIN_Delete(hFrame);
0 Y: F) C1 l# } - GUI_Delay(SPEED * 0.75);5 ^0 X m/ ] E; {1 o l8 A
- : b" E! _7 F' }" K% J
- /* 清除显示 */' M. w) r1 i, @6 D0 Z5 z
- GUI_Clear();
0 A$ V. i! k: \$ S) f: p - GUI_Delay(SPEED * 1.5);, F n$ }) a L2 i {
- }& b( a: Y2 M3 n
-
, o% B' n4 G9 E% }( Z' |$ y - /*******************************************************************
& ^) p+ t6 J1 S, n0 l: S - *
- v4 {, b) y& s! ]8 P - * MainTask
3 }, F7 _3 a; `3 ?+ G - *
. s7 ^. Z/ A& g2 y h5 l2 V) ~1 @ - * Demonstrates LISTBOX widget
; E$ R4 V: H( e- ~: {& @7 ` - *4 s1 }/ o) p% u( Z: B0 G8 m" e
- ********************************************************************# G6 t1 S; x# ] I! d
- */
5 \+ \8 t; k/ ^; a# A2 o -
+ s( |# ^# [- ? w: d6 t" n- n7 L. `! O - void MainTask(void) {% [" a! ~9 \5 n' b3 m/ ~
- GUI_Init();& {4 i( |. H$ g2 G! m9 K& M
- WM_SetDesktopColor(0xB00000);, H6 [) K0 o3 p: D
- GUI_Exec();
# J0 T3 g9 f2 v* R$ q6 t - while(1) {7 F/ r, g5 X) [8 n8 @; z
- _DemoListBox();5 D" [4 Q4 g- z* U
- _DemoListBoxAsChild();
. G- D% ~ ~; B6 x# _4 H - }6 c+ I" J8 o7 _6 a
- }
复制代码这个例子的实际现象效果如下: 47.3 对话框上使用列表框控件 用uCGUIBulder4.0建立如下界面(分辨率480*272): 为列表框添加成员的方法如下: 将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中): 47.4 总结 本期教程主要是跟大家讲解了列表框控件的使用,希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的列表框控件API,其它的API大家都可以试试。
: I. A) W4 O/ J7 A |