特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
' ]- @# Z/ t3 H, m第41章 CHECKBOX-复选框控件
) P( P. l! ? n& ~( j 本期教程讲解STemWin支持的复选框。 41. 1 复选框控件介绍 41. 2 官方WIDGET_CheckBox实例 41. 3 总结 41.1 复选框控件介绍 复选框是选择各种不同选项的最常用控件之一。用户可选中或取消选中复选框,并且可一次选中任意个框。使用键盘界面时,被聚焦的复选框的状态可使用<SPACE>键切换。禁用的框显示为灰色,如下图所示,其中描述了每种可能的复选框的外观: 开启皮肤色后显示效果如下: 41.1.1 复选框支持的通知代码 以下事件是复选框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的: | | | | | | WM_NOTIFICATION_MOVED_OUT | | WM_NOTIFICATION_VALUE_CHANGED | | 41.1.2 按钮支持键盘反应 如果控件具有输入焦点,则它将对下列各键做出反应: 41.2 官方WIDGET_CheckBox实例 官方的这个例子做的很好,充分的演示了复选框的各个状态。这个例子在模拟器中的位置: 源代码如下(主要看WIDGET_Checkbox中的代码): - #include <stddef.h> a% x, Q4 _2 n2 S7 \: C. q" O
- #include "GUI.h"
9 N. t4 F3 y5 B# V6 E. F; X! I, t6 h - #include "DIALOG.h"
' Q2 O$ z% e) y& u: L+ ` - #include "Main.h"; i1 J5 U3 s/ v7 C
- 0 j8 T: v! i% l1 o. I$ A* D
- /*********************************************************************
: o% i0 ]$ a7 j4 o0 f! r% [ - *
2 d* B! V5 p' n' J$ \ - * Static data
* N. N7 R& `- @" _8 \ - *
5 s5 l o. b7 Y: o( ] - **********************************************************************- b7 I4 S7 G. c0 A
- */7 n: k* [$ m+ Z" W( W
-
% ?/ L2 W9 l+ I5 }4 o) y c9 U - //$ z5 J+ i* h E2 P8 i
- // Dialog resource
; h' \, G ~; S1 b3 Z" ]& K - //
( K$ j! X- y, i2 G+ ~ - static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {(1): R. R& o+ X- f0 g" _9 L' f9 _
- { FRAMEWIN_CreateIndirect, "Check box sample", 0, 10, 10, 300, 220, FRAMEWIN_CF_MOVEABLE},( [) S4 H' x9 P& X3 J% u
- { TEXT_CreateIndirect, "Enabled:", 0, 5, 10, 120, 0 }," `# U+ y' `5 J8 C' ^/ M2 b
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK0, 5, 30, 120, 0 },
' c) P$ I9 v' Z8 `1 t4 i1 v - { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK1, 5, 60, 120, 0 },5 }: ~6 ~# Y' y% D$ N' n$ d) k; y
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK2, 5, 90, 120, 20 },& S8 C& r8 e- A) Z" ]
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK3, 5, 125, 120, 26 },
' ]' U- m* o/ E* S1 n) \: H - { TEXT_CreateIndirect, "Disabled:", 0, 150, 10, 120, 0 },0 _: i: ?* p) T: y e
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK4, 150, 30, 120, 0 }," l7 S0 p! `+ g4 L2 y h% ^
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK5, 150, 60, 120, 0 },
0 Y5 q. C* X, r - { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK6, 150, 90, 120, 26 },1 ^5 P: N \1 Y9 k
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK7, 150, 125, 120, 26 },
& P# I2 A3 k* E; M/ W3 l- n - { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 10, 170, 60, 20 },8 D+ t, x7 B: W& Q: E6 q6 f4 N C' B
- { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 225, 170, 60, 20 },
) S( m- U, |* |' S( \, r+ @ - };
6 h4 X. u0 @. Q* P. d, `5 A -
# y% i* i0 d3 O5 ~+ H# F2 Y) Z - //
P6 U# n) j, P% L m' J - // Check box text7 ?( ?3 o0 p" e) R8 d7 |
- //
! Q6 t; f! p' Q" o+ s5 H8 ? - static const char * _apLabel[] = {(2)* ^7 k: Y3 U+ U2 A
- "Default",
( \% { H& N! [& _& }3 K9 ~ - "3 States",
" B% r: }) Y1 S - "Box XL",
) Z, J- I! ^% W; h - "Box XXL" U# y5 r7 R/ i5 ^
- };6 L# B# ^% B& }/ W
-
9 ^ g# ~; j4 `6 ^% G - /*********************************************************************/ @) I' q+ w( M( t0 e
- *
9 w/ p% l: v5 ] h! ^/ O" P - * Static code
7 f- n; N& [, W- m/ y' b* | - *& A; K4 N8 i5 ^1 n" C$ M
- **********************************************************************
3 y" ~, u# ^+ b" x - */
0 \, u! _4 m6 |8 m - /*********************************************************************
) w D; U1 T o; _/ n' T7 q - *
4 O, ~. c$ b7 [9 L; a, f9 q8 O - * _cbCallback: l3 I+ B& ~8 F. P2 I$ C
- */
! M0 W7 p- w% n+ l4 J3 Z - static void _cbCallback(WM_MESSAGE * pMsg) {: @$ H' [2 F. ~# _" |0 U
- WM_HWIN hDlg;
' b% U0 U* p. @1 k& @ - WM_HWIN hItem;, D2 O; F4 ~2 ]. E) I! Q+ n
- int i;$ I( B2 ]% `5 m1 `4 `1 z1 u
- int NCode;
9 V; I/ X+ w+ f: ^8 @ - int Id;
( S3 A5 X7 |2 l! e/ f1 I' r - + M+ {3 P. [! D) N
- hDlg = pMsg->hWin;
3 \) K1 g, L% o* f/ s. K - switch (pMsg->MsgId) {
4 H8 ?/ M4 d7 |$ k8 I - case WM_INIT_DIALOG:( C6 v" M) @2 _
- WM_GetDialogItem(hDlg, GUI_ID_CHECK0);
( o Y7 ^) h, D* J1 C! H. r, a) }- j - for (i = 0; i < 8; i++) {(3)
+ Y" ~% l3 S1 _/ Y - int Index = i % 4;
1 Z- f' u- F% r f1 y5 p& l* Z - hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0 + i); // Get the handle of the desired checkbox+ |2 G \" W0 F% N
- CHECKBOX_SetText(hItem, _apLabel[Index]); // Set the check box text(4)
' A* I6 x: z6 V2 H5 y7 p -
* ~- Z9 g9 f- j( m; M - switch (Index) {
8 B9 V) j; q6 r4 ~1 ` - case 1:(5)
/ A7 y# L+ a7 @ - //* D8 `* K9 e% G( F/ Y
- // Set the number of possible states to 3
+ }$ V$ G/ b S, L* \! C0 X- ~3 c - //+ G, Z7 Q4 G: [, [' L9 |
- CHECKBOX_SetNumStates(hItem, 3);(6)* c. F- w# W# A+ P
- //
. O" J- T# ^# }$ t: |7 }% q" l - // Use user defined bitmaps for the third state
8 I' @" C9 x, Q6 k6 |% g( _: q( p3 M - //(7)
8 c* b6 t; R% D* x" p& u& Q# m/ o - CHECKBOX_SetImage(hItem, &_abmBar[0], CHECKBOX_BI_INACTIV_3STATE); // Used if widget is disabled" J9 L9 n; ~0 I( U% @3 L5 q: q q! @
- CHECKBOX_SetImage(hItem, &_abmBar[1], CHECKBOX_BI_ACTIV_3STATE); // Used if widget is enabled" z& }2 ?* j" G. R1 D; s1 ?
- CHECKBOX_SetState(hItem, 2);(8)
9 v2 N3 z! S2 m7 W2 ?* N: o - break;
# F5 c& J2 W( m& i8 I1 `" f0 | - case 2:(9)
7 n" W- x' W2 k3 v" r* b0 r3 ~0 ~ - CHECKBOX_SetState(hItem, 1);, |$ C& A- X1 v* a! P: O3 J5 o
- //
. \3 x- P5 [! [' U: J; E% Y - // Use user defined bitmaps for the 'checked' state
5 J! |! s# [. ~( T0 x2 b8 t - //1 O4 v6 J% C$ ^
- CHECKBOX_SetImage(hItem, &_abmXL[0], CHECKBOX_BI_INACTIV_CHECKED); // Used if widget is disabled0 |# Z9 J$ [* J
- CHECKBOX_SetImage(hItem, &_abmXL[1], CHECKBOX_BI_ACTIV_CHECKED); // Used if widget is enabled * [1 J- `4 K3 a
- CHECKBOX_SetFont(hItem, &GUI_FontComic18B_ASCII);4 ^3 M$ B: f! a) _* j( A! `& }
- break;
1 r$ Q3 `9 P. K/ H, K4 P/ ?8 J. R - case 3:(10)
6 s' h, \( Z) N4 S' } - CHECKBOX_SetState(hItem, 1);( a$ V9 H" |' ]! v" G
- //
5 n$ E# Q5 t3 G: [ - // Use user defined bitmaps for the 'checked' state4 H& J/ y' R+ N9 [4 {$ g5 w s' k
- //& ~8 Q/ q4 G) ]$ _& I2 m6 _
- CHECKBOX_SetImage(hItem, &_abmXXL[0], CHECKBOX_BI_INACTIV_CHECKED); // Used if widget is disabled6 D3 R4 C7 ~0 g+ \1 T/ q' D
- CHECKBOX_SetImage(hItem, &_abmXXL[1], CHECKBOX_BI_ACTIV_CHECKED); // Used if widget is enabled
5 I) s6 e v5 M9 j. x& W9 p) o - CHECKBOX_SetFont(hItem, &GUI_FontComic24B_ASCII);* H0 |3 F$ R6 E2 s W% w1 x% I, L1 K
- break;$ {& D3 S5 O, t; I! j, l
- } q5 b, G4 O0 f, t8 E* A
- //
9 |! r; ^' R& r2 L" Y: l - // Disable all check boxes shown on the right side of the dialog
8 _* D( R3 E- X1 \6 R" ] - //3 D$ K0 m* \% a1 R! \
- if (i >= 4) {(11)
; ]( i8 J/ w$ l& ~- d! Y. X - WM_DisableWindow(hItem);+ R5 j% J7 S; D# W
- }
# Q* e4 E7 z/ k3 z* g5 r - }/ R* u% k) Q6 |0 x6 ]5 J
- break;
, v3 Q3 \- j t2 c& C g& ^" h) A - case WM_NOTIFY_PARENT:
) Q$ a* H& P& H* @ - Id = WM_GetId(pMsg->hWinSrc); // Id of widget* Z# E7 t( e: M
- NCode = pMsg->Data.v; // Notification code
% U+ }+ N e4 i- T0 } - switch (NCode) {
2 N9 }5 y# V) o) U - case WM_NOTIFICATION_RELEASED: // React only if released6 b) ]- F0 d6 O F8 G' e
- if (Id == GUI_ID_OK) { // OK Button
8 ]' }/ u$ W6 V' ]3 t - GUI_EndDialog(hDlg, 0);
/ R; H2 O. R% w: W' x! H; p - }
& ]* O# f" o( c1 A9 l - if (Id == GUI_ID_CANCEL) { // Cancel Button3 Y" B; o' Q* ]* a9 @2 p. v
- GUI_EndDialog(hDlg, 1);
7 r) l' J: y4 j - }
+ t" g" ?. H. b( k9 T! \1 B( n - break;
" |% h, z* H: ?- A& T' U - }) Y( ]0 _% w1 S' K$ U, r! H* ]. p' P
- break;& `+ q- g: \5 s+ t/ A
- default:
( n5 _6 {& E- s: l0 e: t - WM_DefaultProc(pMsg);4 K4 h# R" x2 p1 O; x6 R- U( d
- }
! ? R1 ]1 [$ v( C - }* }, b' y( [+ u1 k- \# q' {
- 2 k* O8 S" D, E* o
- /*********************************************************************
1 a2 X A9 h' u- u2 l; H - *1 s4 X2 e8 C2 k& j, P
- * Public code/ A$ ]8 `) m& L
- * ^% Q" ]4 R5 k
- **********************************************************************
: p4 H0 B7 v( o2 R$ i - */" i& ~: s6 J- _# C' [ W& w! d H
- /*********************************************************************
* a6 d( j* I, L/ I. j - *
# v) ?3 W' K# W/ O - * MainTask/ P8 }7 I. b/ n! q$ t/ p
- */
# ~& J3 f! G! _2 N* [# f# K9 h - void MainTask(void) {+ k8 J! B4 a4 o! \8 L2 m
- #if GUI_SUPPORT_MEMDEV
) X9 G9 z0 ], e - WM_SetCreateFlags(WM_CF_MEMDEV);2 \* \3 G( N H8 V! c
- #endif! O" A; J9 | c. F. L
- GUI_Init();
( a$ _% g3 b! _% ~ - WM_SetDesktopColor(GUI_BLACK);
2 C1 m6 z) q& G, i; a - while (1) {0 A' S8 h9 X) O: B
- GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
6 d6 \/ \( R K1 S: M4 R - GUI_Delay(500);
4 _8 o7 |4 [% w, z - }& U: }: `" m( S
- }
复制代码1. 对话框中控件的资源表,具体每个控件的参数,看前面38.6.1的介绍。 2. 复选框要显示的文本。 3. 循环8次,为8个复选框进行设置。 4. 函数CHECKBOX_SetText用于设置复选框旁边的可选文本。 5. 确切的说这里的case 1应该算是显示的第二种情况,为了方便起见,我们讲起称之为第一种情况,因为前面已经显示了一种情况。也就是i%4 = 0的情况。 6. 函数CHECKBOX_SetNumStates用于设置复选框可能的状态个数,默认情况下,复选框支持2种状态:选中(1)和未选中(0)。如果复选框要支持第三种状态,可将可能状态增加到3种。 7. 函数CHECKBOX_SetImage用于设置复选框被选中后显示的图像。图像必须填充复选框的整个内部区域。使用此函数时,要确保用于创建小工具的复选框的尺寸足以显示位图和 (可选的)文本。 8. 函数CHECKBOX_SetState用于设置复选框的状态,支持三种状态的显示,可以是选中,取消选中和第三种状态。 9. 情况二,显示一种稍大点的复选框。 10. 情况三,显示一种再大点的复选框。 11. 通过这个函数来禁止右侧复选框的状态。 实际的显示效果如下: 41.3 总结 本期教程主要是跟大家讲解了复选框控件的使用,希望大家可以把本期教程中讲的这个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的复选框API,其它的API大家都可以试试。 % U. O0 Z7 T: k4 y3 I
|