特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
5 X; w, c* S' M D, P第58章 SPINBOX控件
* P4 o; u, p r8 c 本期教程讲解STemWin支持的SPINBOX控件。 58. 1 SPINBOX控件介绍 58. 2 官方WIDGET_Spinbox实例 58. 3 使用官方GUIBulder建立SPINBOX控件 58. 3 总结
* P7 o( ~7 K7 H% C( O58.1 SPINBOX控件介绍 SPINBOX控件主要用于需要快速而准确的数据调整,SPINBOX控件是由一个编辑框和两个按钮组成。默认的显示效果如下: 设置了皮肤色后显示效果如下: 58.1.1 SPINBOX支持的通知代码 以下事件是编辑框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
" ~3 c( h7 B9 C2 o! F$ p- E7 G | | | | | | WM_NOTIFICATION_MOVED_OUT | | WM_NOTIFICATION_VALUE_CHANGED | | 58.1.2 SPINBOX支持的键盘反应 同第43章中的43.1.2小节一样。 58.2 官方WIDGET_Spinbox实例 官方的这个实例很好的演示了spinbox的使用,这个例子在模拟器中的位置: 源码如下(程序中进行了详细的注释): - #include "GUI.h"# o! r( p( i6 V% F
- #include "DIALOG.h"
- O e. }: Y9 p; ? -
/ z4 m8 q4 l! V; Y- n! D. O% E" G - /********************************************************************** `" f5 m% h& ?
- *
5 N* T( n* f! g5 ], @2 m - * Static data
+ B# i& b7 M' w+ S+ s* a/ U - *# r: F8 m2 g& D* N
- **********************************************************************7 @" ?% H. J! }7 F
- */, D7 m% ^. j, o& |4 o* b5 C4 @# c
- static const GUI_WIDGET_CREATE_INFO _aDialogSpinbox[] = {! x W1 p$ @9 B# q4 F* y
- { FRAMEWIN_CreateIndirect, "Spinbox", 0, 0, 0, 260, 160, 0, 0, 0 },
( W5 e8 w1 x2 N9 n. i$ K8 a - { TEXT_CreateIndirect, "Step value", GUI_ID_TEXT0, 20, 15, 100, 21, 0, 0, 0 },/ F& A+ m+ S/ e( e A
- { TEXT_CreateIndirect, "Editmode "Step"", GUI_ID_TEXT1, 20, 42, 100, 21, 0, 0, 0 },, u9 o) y/ Q1 V m/ ?$ U$ j! j
- { TEXT_CreateIndirect, "Editmode "Edit"", GUI_ID_TEXT2, 20, 75, 100, 21, 0, 0, 0 },
9 T! r+ [! l' \3 m - { SPINBOX_CreateIndirect, NULL, GUI_ID_SPINBOX0, 130, 15, 60, 21, 0, 0, 0 },
3 w }$ {9 s2 [ \ - { SPINBOX_CreateIndirect, NULL, GUI_ID_SPINBOX1, 130, 42, 60, 21, 0, 0, 0 }," ]$ h. M+ l2 b9 o) K
- { SPINBOX_CreateIndirect, NULL, GUI_ID_SPINBOX2, 130, 75, 60, 21, 0, 0, 0 },
$ g A0 J) r* H2 Y* x, S5 i - };: I/ H$ ~" f, ]$ E
- 2 T/ a/ n% W6 i
- /*********************************************************************
7 a- @% \2 G/ j. e5 o( _$ e - *8 U" g: _" f' |2 S; r0 E' Q
- * _cbBk9 c* {( k1 k& @/ x L0 F N& Y
- * 桌面窗口的回调函数2 l& x$ k3 q. E6 q
- */
1 b4 V; f! d! ]2 ^ - static void _cbBk(WM_MESSAGE * pMsg) {
, W+ t( {: m/ ?# b* X - int xSize;
% J8 i2 U& A4 Q! c/ V - int ySize;' [$ }, D9 E8 I* X
-
: q, n- f! H% V: ?; _, F: e9 X4 B - switch (pMsg->MsgId) {
: T7 u! p; h s9 T5 W( o+ z - case WM_PAINT:- C U' i( q8 W9 ^
- xSize = LCD_GetXSize();0 H: P, B. b3 U W7 @
- ySize = LCD_GetYSize();/ o8 X" ]" u- q2 a1 x
- GUI_DrawGradientV(0, 0, xSize, ySize, GUI_BLUE, GUI_BLACK);
$ k" Y" u9 r5 n - GUI_SetColor(GUI_WHITE);
% x1 o0 f2 W4 B' [" l. S- G$ c - GUI_SetFont(&GUI_Font24_ASCII);4 W5 e7 F6 }. E# N5 O
- GUI_SetTextMode(GUI_TM_TRANS);; C* B8 w4 e- ]' ]0 P
- GUI_DispStringHCenterAt("WIDGET_Spinbox - Sample", xSize / 2, 5);
0 T$ B: H, D1 Y7 r& ~' C - break;
9 |* S. Q2 q1 i% D' t - default:
- a. E8 q3 d* Y6 r - WM_DefaultProc(pMsg);- @: ~ o- ]; f( q z9 `7 V, [ _
- }5 Y, \+ g0 [& n* W4 S& L! f
- }
/ C5 I/ C& Q* b& P# V - , L' W1 y; V! n) a! a: q1 o# `
- /*********************************************************************2 `5 ?7 X: y0 r( d! E$ l7 E: T
- *% o' ?6 w: M1 N# M* b& E/ D
- * _cbClient
' }2 p8 O; D8 ~8 @# o+ ^! O - * 对话框的回调函数- {8 c! Y) R2 ~5 ^2 {: @1 r, m
- */
2 p2 B6 {. V( t& w; |7 j0 a - static void _cbClient(WM_MESSAGE * pMsg) {
" ^# d; N& p' k0 R2 k* T/ s1 G2 ^ - EDIT_Handle hEdit;. E- P+ n1 e- f1 L% h
- WM_HWIN hItem;' ~; ~! L. | g' V, O- _0 ?: D
- int Value;2 h: E) p! p! |4 T" f( D2 Y$ J
- int NCode;" S1 Z8 g. i2 T* N9 A
- int Id;
/ I% o, Q' s* v& X+ A) S -
' z$ [$ Q- `6 s9 G& y) H - switch (pMsg->MsgId) {
; X% v) A1 O* @ - case WM_INIT_DIALOG:' Z: L: {1 c4 F
-
0 [) ?! ~ m1 C9 H6 ^ - /* 设置框架窗口标题的字体和皮肤 */$ j: Z3 j# O8 v
- FRAMEWIN_SetFont(pMsg->hWin, GUI_FONT_16B_ASCII);% t& i& P3 H3 ?0 {
- FRAMEWIN_SetSkin(pMsg->hWin, FRAMEWIN_SKIN_FLEX);
7 c2 X/ R% J' t) } -
/ e3 F5 Y8 c. |( J8 F7 t - /* 设置文本TEXT0的对齐方式 */* n% t2 B% H6 G. p; o3 `
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0);
+ g) w/ y4 B5 K7 F' [9 S - TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);! O) J( [: }9 O7 T$ O Q
- /* 设置文本TEXT1的对齐方式 */
( Y L6 Q. D5 a - hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT1);$ L* ^* m0 z, l+ R7 y6 j
- TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
3 j. n1 j7 h3 V$ S ] - /* 设置文本TEXT2的对齐方式 */% w7 @( u) s# a: X1 G) Q* A. U- k
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT2);$ A) @) s' M; }& P/ u. x
- TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);$ }* @, o3 }6 c5 }
-
: I0 H$ q C# e2 _0 c' u/ ^. [. P, _- K - /* 设置spinbox的皮肤 */
5 |9 T9 w) z# B$ b. I! H - hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX0);
* A, {8 O4 P3 I; R - SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
) f8 k( u1 e( x; e3 K7 g, Z - hEdit = SPINBOX_GetEditHandle(hItem);
" l/ y) l( a; S5 R - /* 启用编辑字段的十进制编辑模式 */
2 r6 `) S+ G9 X$ C - EDIT_SetDecMode(hEdit, " F A. b, H7 U. }% }
- 1, /* 要修改的值 */
8 w& R/ N: A# ^; L& W0 [ - 1, /* 最小值 */$ P3 ]# X) s8 a0 b" c0 ?
- 10, /* 最大值 */
: a3 @) `: Q. Y0 i& Y% s - 0, /* 如果>0,指定小数点的位置 */
7 X! l) f |* b0 A, H7 y) d - 0); /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */- o" Q: o. G; b% [
- , @; U8 o/ _2 F4 P5 s
- /* 设置spinbox的皮肤 */* E$ v4 x" Z: s' R* O
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);
" D3 G3 q1 p$ @$ ` - SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
: ] H, f0 \; B - hEdit = SPINBOX_GetEditHandle(hItem);
! Q& [! _# p) g8 K* Y( ? - /* 启用编辑字段的十进制编辑模式 */
' ?/ E& L& x- T0 ^; s4 g - EDIT_SetDecMode(hEdit, 2 m7 w2 g# g! y) d- u
- 1, /* 要修改的值 */& R; w- N6 X) _) m. L4 X
- 0, /* 最小值 */0 X8 ?3 J; B/ H6 W: t7 {
- 99999, /* 最大值 */" N' z: a% C) c- M+ h& F0 m
- 0, /* 如果>0,指定小数点的位置 */- K. g. p2 p( H) Z9 z+ Z% d* t
- 0); /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */5 t4 v9 I& }2 U8 J* }
- /* 设置spinbox的皮肤 */
1 K( A! U( z0 Q8 U - hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX2);
/ l1 `" ^! S l - SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);- J- F# ~4 D1 J' V5 K4 n \, s7 b) |
- 2 L" O$ t, C# l5 ]! {; _
- /* 特别注意,这个函数是5.24版本才加入的,用于设置模式 */2 m6 g% l+ V$ M( Q/ [- f2 T
- SPINBOX_SetEditMode(hItem, SPINBOX_EM_EDIT);0 t. _8 J! F( `! k' ~& t
- /* 设置最大和最小值 */
! W& G, u- G* ?9 T# A - SPINBOX_SetRange(hItem, 0, 99999);3 @" V( m/ V, i, g5 T
- break;% h' B2 D' a( B" g
- case WM_NOTIFY_PARENT:: ]7 B1 ^$ j0 E9 A7 M
- NCode = pMsg->Data.v;% a2 X4 j: r# t2 Y5 N- B; f
- switch (NCode) {
" j4 q, l9 r: b' a1 K9 g9 N6 N1 S - /* 接收到GUI_ID_SPINBOX0的WM_NOTIFICATION_VALUE_CHANGED消息后,根据SPINBOX0
9 i8 [ F, b' i3 [# Y - 中的当前值修改SPINBOX1中单次的前进后退步数。
2 N f* ^( B3 d5 A$ b3 m - */$ U" z/ P9 r1 ]
- case WM_NOTIFICATION_VALUE_CHANGED:+ z4 ]3 q. ?5 B, Q8 D( H$ N @
- Id = WM_GetId(pMsg->hWinSrc);
! [6 y9 A! \- W" p2 t2 f9 h9 h - if (Id == GUI_ID_SPINBOX0) {
' J9 n) Q! Y& R# H3 w - Value = SPINBOX_GetValue(pMsg->hWinSrc);# a! h* X& J; E. `% _) E4 ?
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);; g; E4 v: b8 q5 F
- SPINBOX_SetStep(hItem, Value);
; i5 _, x: c3 K9 P { - }: o4 A- U7 ?$ e. C$ U. z2 {( w/ ~; I
- break;
4 B0 _( u' T. B( g) P' ` - default:# ?; Z7 a2 p% o; x$ m
- WM_DefaultProc(pMsg);. J! x2 u6 d* v5 k
- }: ^+ O0 s! g7 E% ^! _
- break;
9 x) n$ N' a6 r3 ]: o0 X# g4 s - case WM_PAINT:
" p' o' N( l" k7 V$ N6 b' { - GUI_SetBkColor(0xAE9E8D);
) @6 R6 x. j3 ?8 {/ f - GUI_Clear();+ d: z1 C, p% C4 H
- break;
1 v; `+ {! D/ v1 Y& A7 i# ] - default:
$ V$ d9 P( E8 a q0 } - WM_DefaultProc(pMsg);% [1 q6 Z( |* |$ O2 L
- }' J! P% d$ C' e0 n
- }! s5 C7 Z7 F+ A: p2 a( ?. n" ^
- ( U) F- T7 D1 r/ a: @
- /*********************************************************************7 M' U" |, A- |; z4 c. D4 x
- *
7 |/ h4 j. J8 C8 m6 | - * MainTask
5 X4 c1 \# s4 b# @% g2 ~ - */
: `7 U6 G6 @" V) @7 i$ {' o - void MainTask(void) {
3 l( j% t; q2 v; T- X+ k5 \ - GUI_Init();3 R' ]$ ?, n2 B1 k; P8 S
- WM_SetCallback(WM_HBKWIN, _cbBk);
; ~4 }3 y0 N- n6 N4 P! ? - TEXT_SetDefaultTextColor(GUI_WHITE);8 _" n6 G7 q8 O, K; Y, q
- /* 创建对话框 */
3 K1 ?0 T: [- |" x7 k - GUI_CreateDialogBox(_aDialogSpinbox, GUI_COUNTOF(_aDialogSpinbox), _cbClient, WM_HBKWIN, 30, 60);0 F! L: d; v |2 L. |- a4 `
- while (1) {$ \4 T3 H' z: u J
- GUI_Delay(100);
2 z# t0 G Y% q( Y, R. X - }/ ^% Y$ o( N$ s7 i
- }
复制代码实际显示效果如下: 58.3 使用官方GUIBulder建立SPINBOX控件 这里用GUIBulder5.22建立一个如下的界面(分辨率480*272): 当前GUIBulder5.22版本对SPINBOX控件的支持还比较的弱,仅支持将其添加到对话框上面。将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中): 58.4 总结 本期教程主要是跟大家讲解了SPINBOX控件的基础使用方法。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的SPINBOX控件API,其它的API大家都可以试试。
7 ~" i1 b: S+ K. B" M/ W! C" j |