特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接6 x6 K8 j: e% x
第53章 RADIO-单选按钮控件
9 U6 I c1 t R+ K4 M5 L) Z0 A& C 本期教程讲解STemWin支持的单选按钮控件。 53. 1 单选按钮控件介绍 53. 2 官方DIALOG_Radio实例 53. 3 使用官方GUIBulder建立单选按钮控件 53. 4 总结 + K, A% Y4 M7 y1 G1 n0 ?
53.1 进度条控件介绍 如同复选框一样,单选按钮也可用来选择选项。打开或选择单选按钮时,将出现圆点。与复选框的差别是,用户一次只能选择一个单选按钮。选择一个按钮时,控件中的其他按钮将关闭 (如右图所示)。一个单选按钮控件可能包含任意数量的按钮, 这些按钮始终处于垂直排列状态。下表显示的是RADIO按钮的默认外观: 设置皮肤后显示效果如下: 53.1.1 单选按钮支持的通知代码 以下事件是单选按钮控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的: | | | | | | WM_NOTIFICATION_MOVED_OUT | | WM_NOTIFICATION_VALUE_CHANGED | | 53.1.2 单选按钮支持的键盘反应 如果控件具有输入焦点,则它将对下列各键做出反 53.2 官方DIALOG_Radio实例 官方的这个实例很好的演示了MULTIPAGE的使用,这个例子在模拟器中的位置: 源码如下(程序中进行了详细的注释): - #include <stddef.h>) g0 g8 m$ u. x1 a3 W
- #include "GUI.h"! W) ]. r' \1 R0 q/ o
- #include "DIALOG.h"
- A4 E% g" l* z* N$ |. V! R -
( H# A/ p8 f0 f - /*********************************************************************- F) t5 d+ `. B3 f* V- ?% N& I I
- *2 @( y( N$ j& w9 P
- * Dialog resource9 Q$ r0 V& T' ~( h6 Q- ~; _
- * 对话框资源表
& e7 D8 J9 z1 B/ Z% Q N - */
6 J+ O% L" _9 u" T - static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
7 D# s9 J, s) Q. w4 P - { FRAMEWIN_CreateIndirect, "Radio button sample", 0, 30, 70, 260, 100, FRAMEWIN_CF_MOVEABLE },
; u% h$ B0 T. t; `% c - { RADIO_CreateIndirect, NULL, GUI_ID_RADIO0, 5, 10, 0, 0, 0, 3 },
! i& E/ n/ ?1 |3 r# ]4 W - { TEXT_CreateIndirect, "Suspend", GUI_ID_TEXT0, 25, 10, 70, 20, TEXT_CF_LEFT },7 ~) k9 Y, L4 u3 J, j2 q1 a
- { TEXT_CreateIndirect, "Shut down", GUI_ID_TEXT1, 25, 30, 70, 20, TEXT_CF_LEFT }, _* }$ M6 [" i( k' d3 f
- { TEXT_CreateIndirect, "Restart after", GUI_ID_TEXT2, 25, 50, 70, 20, TEXT_CF_LEFT },
- i8 ~0 w0 U, o: j& G& `; m - { TEXT_CreateIndirect, "seconds", GUI_ID_TEXT3, 130, 50, 70, 20, TEXT_CF_LEFT }, L/ V6 c' ?5 {, b
- { EDIT_CreateIndirect, "200", GUI_ID_EDIT0, 95, 47, 30, 19, 0, 3},1 U5 Y0 d% L$ p3 N( ~) V9 H
- { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 180, 10, 60, 20 },
( l& }+ K4 z0 G0 `( i - { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 180, 40, 60, 20 }( @$ Z( ^% I3 q/ C/ u0 m
- };5 D& ^ A" c+ s8 _
- ( E4 I9 d/ m' q! k n
-
0 A' O+ k7 G7 F: r - /*********************************************************************
4 ^4 o, {% \ b: b, S( p, x P1 F - *
. C8 P; i7 f7 A - * _cbBkWindow- y; \ \; E# a7 _
- * 桌面窗口的回调函数- B C8 _7 w0 |; s* K1 m9 ^2 \. H
- */
8 G/ q7 I9 |: z# _: b0 m - static void _cbBkWindow(WM_MESSAGE* pMsg) {
$ {5 I8 q# ]9 K+ g) o* V4 ~9 ] - switch (pMsg->MsgId) {
$ ?; @+ K& s! B: `; M: t - case WM_PAINT:9 T7 j! g& h3 z( g9 X0 U
- GUI_SetBkColor(GUI_RED);
# s N, [) l" x/ A; \$ D - GUI_Clear();/ m# P* j7 N' u6 `
- GUI_SetColor(GUI_WHITE);$ C7 f. q) o' }8 e6 _7 j t% O
- GUI_SetFont(&GUI_Font24_ASCII);
2 v- M2 S0 v8 J7 {" L - GUI_DispStringHCenterAt("DIALOG_Radio - Sample", 160, 5);3 u. o( ^1 D1 P% E
- break;7 `6 O& i8 {; l1 t5 P" O. w
- default:! Z8 F2 R; j# F
- WM_DefaultProc(pMsg);0 s# i) j: W" c3 \6 t2 E
- }" U1 y3 |' v8 [
- }
% O0 T* m9 P$ W% j - ) v# W; o& j( N) N4 o
- /*********************************************************************. {; D! Q v9 \ n) J
- *, V1 G! v- I$ h4 C7 ?
- * _cbCallback; `( d* I; l. ^, h( ~: l
- * 对话框的回调函数# A% K2 ]; U" b2 g" x0 u+ R; D
- *// [ q- v, e4 C9 G" X% ]
- static void _cbCallback(WM_MESSAGE * pMsg) {
8 Z9 _3 X3 ^* _1 m) h - WM_HWIN hDlg;$ v# [, u. }: A0 |1 I
- WM_HWIN hItem;+ I- a$ D0 o' k! g
- int Sel;
! P F& @ q5 D. @ - int NCode;8 s2 A4 ^. {1 a) ?2 y
- int Id;
+ Z$ D$ b( P' A -
- K! v+ D) [. }. q, ^4 Y# J# V - GUI_PID_STATE * pState;
( ?- S$ A: P' ?+ y( _, h( n2 V& N - hDlg = pMsg->hWin;
0 k2 z( M, V& w, `+ Y2 d: F# M7 x. E - switch (pMsg->MsgId) {8 w! `% J8 @! d3 l/ T" S" F
- case WM_INIT_DIALOG:0 T8 u, V& A" a1 W, o1 x) ]: U
- hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);
) h% _; |6 i4 T; |4 D& d; v - EDIT_SetDecMode(hItem, 30, 0, 999, 0, 0); // 选项编辑框的10进制模式) G) f9 Q0 ^% k! O4 w
- WM_DisableWindow(hItem);; s8 m3 T5 |& g o4 K* _
- break;. v% _$ h1 e3 q4 A9 ?
- case WM_KEY:2 ?8 Q o( Q* \; L7 A" P( X6 }/ T
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {# F* ]8 M! {( F2 m7 h& m" F; T
- case GUI_KEY_ESCAPE:
* ~ q1 [: \6 r& R. i+ K - GUI_EndDialog(hDlg, 1);
4 |3 @: `" T; d7 I R - break;
; r, g. }. `! h# n$ d: j$ H( I - case GUI_KEY_ENTER:
1 g, M6 h$ }2 Z9 H6 F$ e$ H - GUI_EndDialog(hDlg, 0);
' D' G2 K% {' M4 p2 g: M) m - break;
& g* j3 D8 b- d6 u' B& n- F& r1 R* C - }+ b! t8 \' D2 O* } ^4 V6 h" t
- break;
1 ?& R. \+ h, Y/ @/ ~- y: f# r - /* 通过WM_TOUCH_CHILD消息的主要功能是:当点击单选按钮边上的文本控件时,
`0 I V5 c" `4 t - 也可以实现单选按钮控件的选择
' A3 J- m- M9 m$ H' ~: r - */
3 X- n2 t/ |2 v5 d - case WM_TOUCH_CHILD:6 A' F9 ]0 v9 Z$ y, K
- Id = WM_GetId(pMsg->hWinSrc);
3 q- |6 ^ s0 \/ r/ N - switch (Id) {
: V7 G4 _" Z. F1 W9 Y* l - case GUI_ID_TEXT0:9 _7 Z/ d4 a O8 X; A% {
- case GUI_ID_TEXT1:
8 R! N7 g7 r& |+ O: p8 M7 s$ j - case GUI_ID_TEXT2:
1 u7 N- P( d" A7 q - pState = (GUI_PID_STATE *)((WM_MESSAGE *)pMsg->Data.p)->Data.p;6 `' F7 t" d. e8 [- ]- D* n
- if (pState) {# E; H% I4 q: H
- if (pState->Pressed) {
# Z, S, K/ @( p: E- H: n) V- j - WM_HWIN hRadio = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);5 h5 E- B$ B6 a9 S# d
- RADIO_SetValue(hRadio, Id - GUI_ID_TEXT0);
& m0 @4 [, v& q$ F8 T - }6 Y* J n; X. i1 [3 x
- }
( F. h" s' H5 }- K - break;0 n: g3 G( i i& Y1 O! E6 u
- }
' I# q0 U! J6 ^7 c- I - break;6 o |: C3 `& A: X5 Y, ~4 `3 m
- case WM_NOTIFY_PARENT:
8 a H& X: B$ Z& r) k - Id = WM_GetId(pMsg->hWinSrc); // Id of widget! L: H$ q9 {) E2 v' q# K5 A
- NCode = pMsg->Data.v; // Notification code
( u Z) o! T6 M/ ? I- i+ p - switch (NCode) {
: I; Q" L$ o: p( X) U - case WM_NOTIFICATION_RELEASED: // React only if released1 b8 D$ N0 S' b5 i" K+ B
- switch (Id) {+ r7 V6 N, Z, B* E
- case GUI_ID_OK:) Y, ~8 [* u- g
- GUI_EndDialog(hDlg, 0);
4 I0 F0 |) E$ S - break;: B p) {* u7 B; M, ?1 s
- case GUI_ID_CANCEL:
. o; J" z, M; @' y( t - GUI_EndDialog(hDlg, 1);
- S* n8 [" c1 M) U - break; ?5 K% J8 `1 X
- }; f, f3 |. K3 D0 O) u3 M u
- break;
* x2 _! O$ E* h# u3 z$ D2 | - /* 当选择第三个单选按钮时,将使能编辑框GUI_ID_EDIT0 */
5 w; h: |7 s9 H) a9 }4 g+ G - case WM_NOTIFICATION_VALUE_CHANGED:8 W8 }+ Z2 l. T9 q3 ~
- hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);( h; U: E& i' b% `8 J# I
- Sel = RADIO_GetValue(hItem);1 @' S$ X+ |+ D
- hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);: A- ~1 Z' P1 _; _5 o. s5 c7 k" C
- WM_SetEnableState(hItem, Sel == 2);
$ A, X4 v* w8 @7 T9 X/ A, g N - break;
- E0 ?1 a8 D5 \. k) A5 F - }
' f$ l" t0 x- d3 B3 S - break;" H) [ ~4 |8 I) J/ c
- default:! ^- M) b! {1 a- [4 ^
- WM_DefaultProc(pMsg);+ ]$ t6 J; G2 E
- }
" l T. v6 R) {8 i. B% N, p9 i4 y - }) \5 N3 g( w; y o9 o( z- [- D
- 0 ]$ w* x+ f/ e- j9 W
- /********************************************************************** m ]6 |9 C" K: q: L: x4 e2 V
- *
. o" _+ I7 \. F: {$ W% V& b/ D% ~ - * MainTask
. ^9 s5 s4 B5 x - */
* M `+ w% C _* z - void MainTask(void) {
3 C$ E. ^) o) m ~$ ] - GUI_Init();4 r1 k0 x) r2 S
- WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
2 j4 i. }6 z" Z - WM_SetCreateFlags(WM_CF_MEMDEV); // Use memory devices on all windows to avoid flicker+ c$ B4 F' p" e
- while (1) {0 ] {& w6 F0 |3 D8 k6 Z
- /* 创建阻塞式对话框 */3 ~0 e2 F8 n d M
- GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
5 F/ t3 l" q! o# H' }; y1 J - GUI_Delay(1000);8 l1 F' I3 F6 }9 ~8 `6 t+ `5 a
- }. m; ?4 y* q% Z, k6 `0 x: p$ u
- }
复制代码实际现象效果如下: 53.3 使用官方GUIBulder建立单选按钮控件 这里用GUIBulder5.22建立一个如下的界面(分辨率480*272): 鼠标放在单选按钮控件上面右击可以设置单选按钮: 具体每个选项的名字在右下角进行设置: 将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中): 53.4 总结 本期教程主要是跟大家讲解了单选按钮控件的基础知识。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的单选按钮控件API,其它的API大家都可以试试。 * j/ y( s3 E8 W8 t: ~1 ~1 x; f$ W
|