特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
" ~! @% ^6 a2 A) e, ~第47章 LISTBOX-列表框控件
' h- T% J- p, ?3 F+ a# O/ D 本期教程讲解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的使用,这个例子在模拟器中的位置: 源码如下(程序中进行了详细的注释): - ----------------------------------------------------------------------5 t9 r+ r+ Y1 ]+ b# |! C5 B
- File : WIDGET_ListBox.c& D0 B& H& R C3 A' {! {
- Purpose : Example demonstrating the LISTBOX widget) K+ G7 X4 D9 D( L- Q' q! N
- ----------------------------------------------------------------------
Z+ q# Z, O2 |5 M; b; } - */
4 ~7 l2 `" C! I# m2 Q -
0 B7 M; _9 E8 o% {/ J) Y. E/ K - #include "GUI.h"
' \7 z( \. g% x* ? - #include "FRAMEWIN.h"
2 K9 j1 |) \: A# |& X$ b - #include "LISTBOX.h"
* [6 {. |% I; E$ M2 i - #include <stddef.h>
* |6 u2 I$ r* Z -
t) C# J7 V/ h, Y! l0 q - #define SPEED 1000
& n/ H: Z2 s- Q# ?8 g" x - 6 r: F. f. g/ A; h. ]) z
- /*******************************************************************- |6 O8 f$ U; X* `% P8 |6 v D
- *
% i8 u9 g2 O, H - * static variables5 F3 C; h+ ]; S+ Q5 C7 z. v5 v- @4 L
- *
0 |9 i2 J A* r% q9 t4 f - ********************************************************************: v8 _( M& s8 t( o- F+ C& V, z+ s
- */
- M: C- y ^9 R- c7 u -
9 C. U% @/ I9 T; [ - static const GUI_ConstString _ListBox[] = {
( S' A# a; U& {0 ?4 [8 o. T - "English", "Deutsch", NULL
4 n+ E2 t0 I& k- ~) L5 v - };
% T, h/ ?8 L) r5 S; U - % d; B: \1 j+ k2 P, a7 P
- /*******************************************************************$ e4 m( B% p$ m% v" x; h# X
- *
" A# \* Q4 W. P5 j& { - * _ShowSeveralFunctions9 s# h( D, k% P
- */1 C) R G: Y8 J9 m! g3 ^
- static void _ShowSeveralFunctions(LISTBOX_Handle hListBox) {
! q0 Y, U7 S6 F4 ~( f. _2 y - int NumEntries, i;
/ b% Y, ?+ t9 `; C, Y9 X+ u4 B# H& Z - / Y! L. L; k3 N* y& O. L P
- /* 增加垂直滚动条 */% ]0 s% \2 m0 _* }& P2 o) [' s3 u3 \
- GUI_DispStringAtCEOL("SCROLLBAR_CreateAttached", 5, 55);
% r' L3 ?) R) P5 `3 c - GUI_Delay(SPEED);
% Y) m" l+ o" | ?2 L2 u - SCROLLBAR_CreateAttached(hListBox, SCROLLBAR_CF_VERTICAL);
5 f6 p8 u' \- R$ o t }! o- l - GUI_Delay(SPEED * 0.75);! E+ S4 U3 P H: n0 u" q/ L
- ) D) H4 H2 P$ u; C* }, x4 x
- /* 增加字符串 */3 t5 S R" @4 P5 R: h' s0 @
- GUI_DispStringAtCEOL("LISTBOX_AddString", 5, 55);
- H; a; u1 g; i! r S - GUI_Delay(SPEED);$ H* n, Z; Q" Q4 P+ [9 r( V+ M5 Q
- LISTBOX_AddString(hListBox, "Fran鏰is");
; _+ R3 X7 I% \ ~8 K - GUI_Delay(SPEED / 6);
+ S. Y; {. ?6 e& p& @5 @/ Z - LISTBOX_AddString(hListBox, "Japanese"); R+ r- ^# X/ F6 o
- GUI_Delay(SPEED / 6);% x% m( ^0 z7 b# f6 b+ b& ?
- LISTBOX_AddString(hListBox, "Italiano");
/ g) W: [* K/ }, g# r( ]( [9 h5 f - GUI_Delay(SPEED / 6);7 Q: l' u( ]* f# j+ _+ \
- LISTBOX_AddString(hListBox, "Espa駉l");: m; E8 |; { } Q
- GUI_Delay(SPEED / 6);( a/ y' _& ^. g# R8 S
- LISTBOX_AddString(hListBox, "Other language ...");1 h n, o6 m4 I, n4 I! t# P+ d9 j$ r
- GUI_Delay(SPEED * 0.6);
& u" c0 q* M- U9 @2 {6 E -
7 e# k$ g* h [ - /* 设置输入焦点 */$ [7 c; x. g/ x- {) g% V
- GUI_DispStringAtCEOL("WM_SetFocus", 5, 55);
$ |' E& u! p" M! A - GUI_Delay(SPEED * 0.9);
$ Z* m, z" U. Q0 L. Q' X - WM_SetFocus(hListBox);
: \6 F: e7 ^) h- m - GUI_Delay(SPEED * 0.7);
1 S" K j' e5 |/ d" J- H0 a7 s -
$ N1 `0 r* I1 a# L - /* 设置字体 */3 ?) n4 V$ L- _4 C. f
- GUI_DispStringAtCEOL("LISTBOX_SetFont", 5, 55);/ ?# L" ]1 @: E9 q2 E
- GUI_Delay(SPEED * 0.9);5 u& t" Y2 B; a
- LISTBOX_SetFont(hListBox, &GUI_Font13B_1);
1 p" z, z0 n: a+ m- y - GUI_Delay(SPEED * 0.7);& D7 o) d' M/ T1 X# U- |
- 3 ?' a. I6 i0 M9 R }
- /* 增加选项 */
" E) v1 l5 m8 P y( L - GUI_DispStringAtCEOL("LISTBOX_IncSel", 5, 55);! u. D2 {! Z+ Y& Q. W+ p$ v
- GUI_Delay(SPEED);
4 `4 x& `0 J- }0 A4 L - NumEntries = LISTBOX_GetNumItems(hListBox);
1 m6 c' _) e% e2 p8 Q" [& H; ~ - for (i = 0; i < NumEntries - 1; i++) {7 g% ^* l: O& h8 U- a# J
- LISTBOX_IncSel(hListBox);
6 q: c$ |, G+ J2 H" S( w4 L - GUI_Delay(SPEED / 6);* r7 @' ^2 X( I7 u8 a3 Q
- }
' h; ? X. @( C - GUI_Delay(SPEED / 4);* [6 @7 H8 N C6 X: V5 X! Z* ]
-
( |# Z `5 I7 q8 f7 u/ L# T5 _6 s - # c4 K3 v ~: p' l
- /* 自动增加滚动条 */. j, v; Y/ L; d6 t% g* |
- GUI_DispStringAtCEOL("Optional automatic scrollbar", 5, 55);
2 }; l/ I3 ^) k& C. F2 f - GUI_Delay(SPEED);1 ~# Z- _3 l& M; V
- LISTBOX_SetAutoScrollH(hListBox, 1);
/ t& t) q2 c% k [2 L - LISTBOX_SetAutoScrollV(hListBox, 1);
/ v0 g/ `8 q2 G% A5 ^1 j+ p) W - GUI_Delay(SPEED * 0.75);
1 {1 R8 O7 T0 E; V2 G+ g0 O! R -
3 p x" Y5 `* F3 j8 J -
- i0 q! n" L8 l4 d' ~7 q0 { - /* Set font */
, D% ~+ [) E! y' w2 t - /* 设置字体 */
" N+ k5 C& `" ~) ]2 [; d9 Y - GUI_DispStringAtCEOL("LISTBOX_SetFont", 5, 55);! t) s% q( [( U1 z+ ^
- GUI_Delay(SPEED);
# {: T7 M/ a! W - LISTBOX_SetFont(hListBox, &GUI_Font16B_1);
8 n6 n2 y- s1 ` - GUI_Delay(SPEED * 0.75);
+ E' B* a0 F# D2 n1 Z& K - * N5 X! Y! s0 s1 X7 ?& A" a, L
- /* 递增选择 */
7 {# P D3 v% J6 u - GUI_DispStringAtCEOL("LISTBOX_DecSel", 5, 55);5 C/ _( i; P( F
- GUI_Delay(SPEED);
7 ^* E' G" |9 L N - for (i = 0; i < NumEntries - 1; i++) {9 Z* u3 {4 ]1 `- Q% r; y& z
- LISTBOX_DecSel(hListBox);0 j5 w. `! ]7 D+ K
- GUI_Delay(SPEED / 6);
6 k5 y6 |; [' M" O4 [3 M& t - }0 W* @/ ]- z3 x4 v
- GUI_Delay(SPEED / 4);$ B! O- a) b0 n% m, s
- * n8 c* A( ?- W( [) K( O7 b4 M& P
- /* 更改滚动条的属性 */
' _) f0 H2 _, H9 x8 w - GUI_DispStringAtCEOL("Change scrollbar width", 5, 55);
& \/ v, t6 ^" Y/ e y - GUI_Delay(SPEED * 0.7);& r! R' w8 `) ~" E( l C$ h
- {! {1 ?6 e* t, n
- /* 得到滚动条的句柄 从而去修改滚动条的属性 */
/ b/ J+ ? T/ q, }6 T' s - SCROLLBAR_Handle hScrollH = WM_GetDialogItem(hListBox, GUI_ID_HSCROLL);
5 d0 y: B6 @) M7 J* f/ x( `5 l - SCROLLBAR_Handle hScrollV = WM_GetDialogItem(hListBox, GUI_ID_VSCROLL);
. r. C+ `9 y* g) z" _2 Y3 T - SCROLLBAR_SetWidth(hScrollV, 14);1 d2 P# z/ A/ B2 I9 o( [ v# X' C# P3 y5 N
- GUI_Delay(SPEED / 4);" ~: }, t% U5 U) g' x
- SCROLLBAR_SetWidth(hScrollH, 14);" J! `' ^- s) O1 W7 q: x& f
- GUI_Delay(SPEED * 0.6);9 ~& p+ I. E9 i8 G
- }
: R a7 v7 Y1 v8 C& Q( N, R+ m2 g -
3 @" C: s$ N# G1 E( N -
& J9 Q( A) h* k8 _ - /* 设置列表框的大小 */( L" e) l3 |* L+ t \
- GUI_DispStringAtCEOL("Change size of listbox", 5, 55);! t; z6 x$ ^- V9 [% o# Q* O
- GUI_Delay(SPEED * 0.75);' k, v$ E% G8 W# o5 ?- H
- WM_ResizeWindow(hListBox, -15, 0);9 E: k$ b5 c |0 @
- GUI_Delay(SPEED / 4);; o6 n# E0 m. [/ j$ O: A
- WM_ResizeWindow(hListBox, 0, -15);
) P' g' N+ r# S+ f, T; _# n6 f - GUI_Delay(SPEED / 4);5 x3 }# @$ ~5 J/ V+ f# ^
- WM_ResizeWindow(hListBox, 15, 0);, H; C. p0 v$ v& g$ P# s7 n
- GUI_Delay(SPEED / 4);# [' j" p4 I6 Y8 k
- WM_ResizeWindow(hListBox, 0, 15);; O4 @7 |7 W* j$ d" w. D. J
- GUI_Delay(SPEED / 2);
+ \. M9 z: g& n) c% f9 [ -
/ k- R2 v2 I0 P0 U8 V0 @ - 3 L3 \2 V: d& W! i
- /* 设置相应的项目禁能 注意0是第一个项目 */; Y. W% u2 O( m$ i$ \7 b# w" I; d
- GUI_DispStringAtCEOL("LISTBOX_SetItemDisabled", 5, 55);5 I7 }8 t1 `# Y' {; P
- GUI_Delay(SPEED);
( v# o5 R) K/ Y5 \, {/ ?3 `- ~$ D0 r - LISTBOX_SetItemDisabled(hListBox, 4, 1);8 w3 H8 m+ U# @. T) I5 c; p$ [7 B
- GUI_Delay(SPEED * 0.75);, z0 [2 k8 V7 L
-
- W$ \/ Y. y" x' v( m2 z - ' v% I9 e3 Z$ E2 y9 V. h
- /* 设置使能多个项目的选择 */( p6 [6 d! T7 H% Z0 I: b& x& X+ ?
- GUI_DispStringAtCEOL("LISTBOX_SetMulti", 5, 55);
) U: O- e: _2 A6 u8 @ - GUI_Delay(SPEED);) ~& N- e7 d3 `2 B" \1 i
- LISTBOX_SetMulti(hListBox, 1);6 r7 A# |3 g7 I! r0 }8 b' I) j! E' J
- GUI_Delay(SPEED * 0.75);9 `9 C+ k/ X. ^+ l' A
-
, {3 H: [0 v9 m - /* 选择项目 */
: v! n* B: H4 x+ Y( n0 K - GUI_DispStringAtCEOL("LISTBOX_SetItemSel", 5, 55);
2 K5 z1 B+ s+ G' | - GUI_Delay(SPEED);
: ]" C' V- q, i; Z - LISTBOX_SetItemSel(hListBox, 0, 1);, k- S# R, x" `) u5 o6 {
- GUI_Delay(SPEED / 4);! B5 y2 O; j3 c$ a3 q" d+ b
- LISTBOX_SetItemSel(hListBox, 1, 1);# d7 D+ m3 m7 B: N0 l6 u+ N
- GUI_Delay(SPEED / 4);. u ~" n* M0 h3 L+ {; W
- LISTBOX_SetItemSel(hListBox, 2, 1);
, o3 _: Q; `, h8 K/ } - GUI_Delay(SPEED * 0.8);% y: ^4 I p) N; m& C0 e: z+ M: N* L5 B
- 8 R& g) R$ N4 S& l" g* j" H# ~$ P
- /* 删除列表框 */
6 Y9 }% m( g, ]8 v0 r8 Z, E - GUI_DispStringAtCEOL("LISTBOX_Delete", 5, 55);2 A) A E0 x2 W0 C5 \) t
- GUI_Delay(SPEED * 1.1);$ [; J. w2 [9 w) ^4 U
- LISTBOX_Delete(hListBox);
' n; P/ ]& w. m# [9 ?0 {' i - GUI_Delay(SPEED * 0.75);
5 I. I1 v7 |- n& ^; B- h) l - }
0 s6 q% o6 {" K/ l+ W% r - 0 E- L% q9 p/ u$ U4 N- n6 V
- /*******************************************************************
) |0 x+ o2 e( F5 d - *
' ^- c+ W8 ?2 _% o |9 P1 H - * _DemoListBox
" m9 r: t; R* m Z* q - */( f' _* f1 N4 }6 V* v
- static void _DemoListBox(void) {$ u( v* J& e: |* W# n: u
- LISTBOX_Handle hListBox;/ E: B$ I# Q: ]$ `$ u5 ^
-
4 _, V1 d- H2 Y$ y - /* 显示标题 */
, t4 x2 y5 w5 Y9 r; ? - GUI_SetBkColor(0xB00000);5 T% _& k2 [/ a
- GUI_SetColor(0xFFFFFF);
3 e5 I) i/ L' l4 I9 X& _ - GUI_SetFont(&GUI_Font24_ASCII);
1 [3 L2 R0 G5 J+ D8 N - GUI_DispStringHCenterAt("Listbox - Sample", 160, 5);. d8 M# F: U! m; G$ ~5 Y0 L6 Z; C+ h
- GUI_Delay(SPEED / 2);
0 t1 F5 r# g- p2 m/ Q6 D -
! Q4 J, q5 c- Q* C6 D [- J; N% t6 Y: ~ - /* 创建列表框 */
2 Q6 F) p2 z" ]: t" b - GUI_SetFont(&GUI_Font8x16);
! N7 W4 f) R( l/ a2 { - GUI_SetTextAlign(GUI_TA_LEFT);
; v& m8 }2 N, k: X& _ - GUI_DispStringAtCEOL("using", 5, 40);0 @6 V' N7 S, q: o) L v& ]
- GUI_DispStringAtCEOL("LISTBOX_Create", 5, 55);
1 ? ^3 w0 o- y4 w1 W8 v1 a1 T; C - GUI_Delay(SPEED * 0.9);
) e. D4 E6 f7 ~" {6 {1 O1 ` - hListBox = LISTBOX_Create(_ListBox, 100, 80, 120, 115, WM_CF_SHOW);
& G" z* M5 P& q- q - GUI_Delay(SPEED * 0.75);% W2 M6 l& ?+ Y# P
-
5 A3 g8 S, e n4 ~: R - /* 功能演示 */( e' _! Z$ g' d
- _ShowSeveralFunctions(hListBox);0 {9 z4 F2 ]7 h$ t- t
- /* Clear display */
: J. [& C- b1 r) k1 ~ - GUI_Clear();
' ` x1 j; ?( y: H) D; h - GUI_Delay(SPEED * 1.5);3 n0 i3 Q x4 N: w
- }4 h/ K& u1 f' {0 z/ X, _
- $ d2 H0 e; C" s" K/ f- Q2 ^/ V. r4 n
- /*******************************************************************
- A; _ ?$ X& d9 Q2 l: j - *
7 q% q I- a' P$ R- j - * _DemoListBoxAsChild3 `$ |, H: D! W3 R2 F
- */- I' `8 h! ^$ A# K( n
- static void _DemoListBoxAsChild(void) {+ S9 \! s- b `) M+ }
- FRAMEWIN_Handle hFrame;
" b x& Q: ^; k _ - LISTBOX_Handle hListBox;
- l! B: T- M) R" K - 4 s3 E( Z4 I- s2 _1 Z
- /* 显示标题 */
7 ?. ?' X' B" U$ B0 a# ] - GUI_SetBkColor(0xB00000);
8 | e. Z Q K5 I - GUI_SetColor(0xFFFFFF);8 G' I1 K7 P1 D# |. q9 K
- GUI_SetFont(&GUI_Font24_ASCII);( M6 H% Y4 s, O
- GUI_DispStringHCenterAt("Listbox as child - Sample", 160, 5);) P& C, w/ n6 `, _1 m
- GUI_Delay(SPEED / 2);$ ]) H5 m4 h: A
-
: z; F) Z( H) [$ I9 e, B2 y0 Y: g - /* 创建窗口框架 */5 V9 L/ m+ {3 B4 D
- GUI_SetFont(&GUI_Font8x16);3 P `) U- m( K
- GUI_SetTextAlign(GUI_TA_LEFT);+ z2 e9 L2 b" C( q1 l
- GUI_DispStringAtCEOL("using", 5, 40);, |; O9 X! x5 h1 Q5 s% `7 i3 u- c
- GUI_DispStringAtCEOL("FRAMEWIN_Create", 5, 55);
9 M) P3 x4 r* J- y; r8 r - GUI_Delay(SPEED);
$ z& S7 Z* M0 O2 H - hFrame = FRAMEWIN_Create("List box", NULL, WM_CF_SHOW, 100, 80, 120, 140);) O. `1 }6 ~0 w# B+ x
- FRAMEWIN_SetFont(hFrame, &GUI_Font16B_ASCII);6 Y, o+ A! t! q/ O7 K* n. W
- FRAMEWIN_SetActive(hFrame, 1);
3 C# I/ I" C* t+ \! ?5 x - GUI_Delay(SPEED * 0.75);
5 W- n" ^; m8 v' | - & x( Z8 e* D1 T# m: h/ A4 H8 M
- / v' |+ E( I1 J) O2 Y7 s1 P4 G
- /* 创建列表框 */
* O+ n# W7 R" b" `' e; B - GUI_DispStringAtCEOL("LISTBOX_CreateAsChild", 5, 55);
2 F/ v( a5 b& k- i - GUI_Delay(SPEED);
* h/ h, }" f4 @; b6 | - /* 其实坐标0,0,水平和垂直的大小如果设置为0的话,那么将默认为父窗口的用户区大小 */
- J, U4 t- u( x8 d( K - hListBox = LISTBOX_CreateAsChild(_ListBox, WM_GetClientWindow(hFrame), 0, 0, 0, 0, WM_CF_SHOW);
# T: k h- R& f" J* a - GUI_Delay(SPEED * 0.75);+ r# w* s' ?7 p
-
1 m2 ^7 u4 ?/ w - _ShowSeveralFunctions(hListBox);2 _' f( h; ^& n( l' }
- ; f, \4 F5 O3 f; k
- /* 删除框架窗口*// G' q0 J. L) d7 w
- GUI_DispStringAtCEOL("FRAMEWIN_Delete", 5, 55);
/ e3 l5 X& U e' n9 H" x& ^ - GUI_Delay(SPEED);
4 y! M& y }* i6 U I3 d6 S - FRAMEWIN_Delete(hFrame);
6 d4 o8 ] w- E5 ^! X& K! T - GUI_Delay(SPEED * 0.75);
" R! e! m9 n& `; A. U7 k. ? - 2 X0 q; B3 } O) g4 e: |
- /* 清除显示 */4 F# I* H4 y. M9 O' Z5 x
- GUI_Clear();% ?7 Y7 \9 F$ D6 ^( F$ @$ v, j
- GUI_Delay(SPEED * 1.5);
2 s8 P8 T0 t* ^; Z3 l - }0 a" r) f* `. r6 Y, P
- 1 n* v4 C9 A6 e- L
- /******************************************************************** P: P4 \# O2 Q) H, e
- *
+ P6 ], Y2 h9 V& }$ i* h7 U5 J8 M - * MainTask
& k4 E; l' B( D( x3 B - *6 [. [0 H% T% `+ n* ~0 G# v+ ^
- * Demonstrates LISTBOX widget
3 l w, `" J" U4 m+ E; { - *
+ S8 N% T6 }. w0 S5 T - ********************************************************************% _3 t; @+ |* [% b" D& B. w
- */
9 N( s5 D( k1 w) y" { - : \( L* S; j8 Y3 q
- void MainTask(void) {
6 m/ d; @# ?& K9 } | - GUI_Init();
: m4 a3 _0 h& e - WM_SetDesktopColor(0xB00000);
4 s8 W. Z0 F* |* w+ n z6 v - GUI_Exec();
0 z% k# n. q. @6 A( Z# j - while(1) {- [* P9 O: n1 {/ f
- _DemoListBox();
% j3 ~8 y" a$ m& a" W* l - _DemoListBoxAsChild();
; h% J" B& `( J8 _& ~; b6 u7 v! X - }6 N5 h& E9 q* R- X
- }
复制代码这个例子的实际现象效果如下: 47.3 对话框上使用列表框控件 用uCGUIBulder4.0建立如下界面(分辨率480*272): 为列表框添加成员的方法如下: 将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中): 47.4 总结 本期教程主要是跟大家讲解了列表框控件的使用,希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的列表框控件API,其它的API大家都可以试试。
, Z+ Z) T6 [! C V9 \6 L3 | |