特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接& i) X' i: T! }7 d9 a. l D$ c; f
第53章 RADIO-单选按钮控件
4 K; _( }! y6 ]- G 本期教程讲解STemWin支持的单选按钮控件。 53. 1 单选按钮控件介绍 53. 2 官方DIALOG_Radio实例 53. 3 使用官方GUIBulder建立单选按钮控件 53. 4 总结
8 t1 ?, O# n3 p2 ~$ D53.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>5 q! f5 Y, e$ L" V1 s* n
- #include "GUI.h"9 Q7 x8 H3 `7 m9 j
- #include "DIALOG.h"
?3 K+ A, v! E- i( ~ -
6 G5 v7 @0 b- ^- f+ x& N7 i" ^6 b. b - /*********************************************************************
- r7 a- l1 O; ^/ B9 F - *5 i7 z6 T+ F2 g! ~4 ?0 ^
- * Dialog resource' s6 D' I# \( q9 y7 k( n% F! o
- * 对话框资源表
3 a; f, {- g; C b - */
" G% E; u ~) n9 o - static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
1 N; ]6 R" T8 B( P6 X3 d - { FRAMEWIN_CreateIndirect, "Radio button sample", 0, 30, 70, 260, 100, FRAMEWIN_CF_MOVEABLE },
: e9 [ s1 J) F; X - { RADIO_CreateIndirect, NULL, GUI_ID_RADIO0, 5, 10, 0, 0, 0, 3 },! ~5 R" a. s& t% a% g5 i
- { TEXT_CreateIndirect, "Suspend", GUI_ID_TEXT0, 25, 10, 70, 20, TEXT_CF_LEFT },
# h. w; K2 n$ w) v. p- D0 A - { TEXT_CreateIndirect, "Shut down", GUI_ID_TEXT1, 25, 30, 70, 20, TEXT_CF_LEFT },3 P- Y0 \" q* ~+ v. s
- { TEXT_CreateIndirect, "Restart after", GUI_ID_TEXT2, 25, 50, 70, 20, TEXT_CF_LEFT },
& D9 y Q! E8 t$ J - { TEXT_CreateIndirect, "seconds", GUI_ID_TEXT3, 130, 50, 70, 20, TEXT_CF_LEFT },
) p! j' N4 V# o/ S" U" ~$ f* @ - { EDIT_CreateIndirect, "200", GUI_ID_EDIT0, 95, 47, 30, 19, 0, 3},
/ y# K. b# W0 D - { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 180, 10, 60, 20 },
: D9 z% Z; X3 k5 k/ l" U - { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 180, 40, 60, 20 }
/ X4 l u; ^* \8 r1 Q0 ]0 p - };
9 d h8 o' K7 M; N -
. G4 k4 |1 I* D7 p5 }, R -
4 x) T" B8 \) `; d* O, T - /*********************************************************************9 {4 A6 N9 p- W) L1 K% L: x
- *
, {/ e0 ]1 Q/ @$ t$ A+ {7 G - * _cbBkWindow
$ w# `( S; p& n. K6 I3 d. t - * 桌面窗口的回调函数
( k% \. w" ]1 v/ ^* S L - */
: M4 @' j/ ?# [% _" {2 s6 s/ X - static void _cbBkWindow(WM_MESSAGE* pMsg) {6 ^0 M) Q7 ]1 ?8 `3 r+ D( [$ t
- switch (pMsg->MsgId) {
+ h$ K8 B+ c; g& A* t: X - case WM_PAINT:) e( k9 k( e/ U/ E
- GUI_SetBkColor(GUI_RED);9 Z! f8 G/ L2 k- r' ^
- GUI_Clear();3 O0 K* Q% H0 W6 F1 ?
- GUI_SetColor(GUI_WHITE);
" `5 k: E0 C0 F - GUI_SetFont(&GUI_Font24_ASCII);. m# a% A) y) P2 I
- GUI_DispStringHCenterAt("DIALOG_Radio - Sample", 160, 5);
- A$ Z8 u- D- y5 b! J - break;- t' P1 J ~+ s% S1 i4 {
- default:0 g8 F, E, l# G# F( ?
- WM_DefaultProc(pMsg);, y( r9 u* r5 C3 L6 n% d6 r$ h
- }
! o( A6 ~9 N& J - }# ?5 {" Y. r) D; Z$ M4 A: ~
- 0 `( Y0 j; i6 j- ^ \; }& x+ F' m
- /*********************************************************************/ \- ]6 N! a2 t2 u$ k; `
- *! o- r) l1 `/ ~7 K
- * _cbCallback, s( ]& b1 L) H
- * 对话框的回调函数
' j4 e* d+ ~) C. l: h. r - */
$ U$ z# F8 b, o - static void _cbCallback(WM_MESSAGE * pMsg) {+ [$ v! ~# s. o, Z
- WM_HWIN hDlg;
! s+ u$ l, A0 H - WM_HWIN hItem;) i5 o7 `6 a8 S* O7 I" m& f
- int Sel;( |( w: Z5 X) } t; q# {4 f
- int NCode;4 w, V' N8 w; }2 X
- int Id;' c' `$ E7 W0 m3 [- b; }
-
( S; O( v. S4 ~! p. s - GUI_PID_STATE * pState;+ P0 U; G4 T0 ^: _6 B
- hDlg = pMsg->hWin;
8 n3 ?# R" n9 \ - switch (pMsg->MsgId) {
3 ?3 y6 l9 j. b# L( M4 A, T3 s - case WM_INIT_DIALOG:
( C5 n+ t: i% A - hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);6 ~, W: X* I) s. ~
- EDIT_SetDecMode(hItem, 30, 0, 999, 0, 0); // 选项编辑框的10进制模式/ V% n* t2 k5 E: j
- WM_DisableWindow(hItem);
: ]" f% _* z6 Y0 F* ~5 | - break;# q, g! i! h' v0 W0 p) G
- case WM_KEY:
! r c; i! G) u; A+ T - switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
5 W/ Q2 f0 _0 @5 N7 z. t - case GUI_KEY_ESCAPE:' M" V; J( l% U% i0 V' \3 N
- GUI_EndDialog(hDlg, 1);
3 b% R) j! A+ O. l - break;* T; C6 S: [: B
- case GUI_KEY_ENTER:
9 A) s6 n4 ^: i( o! i3 g+ n7 n - GUI_EndDialog(hDlg, 0);
) q) G _' M0 P2 I2 Q! i& o - break;1 Q9 R1 P. u1 m! j5 e
- }
( n7 O& @3 s% [9 e w% ` - break;" [8 F6 d0 I* D3 W9 B
- /* 通过WM_TOUCH_CHILD消息的主要功能是:当点击单选按钮边上的文本控件时,
9 X" E1 \1 w& N+ C - 也可以实现单选按钮控件的选择
$ Z X# e. W- c& ? b - */ # v: {# z2 ?7 `" n
- case WM_TOUCH_CHILD:
! g( G" `$ f) X' ^9 k4 R8 Z1 h - Id = WM_GetId(pMsg->hWinSrc); - t' S( y- p# T4 M/ U
- switch (Id) {. Y: {( K( g2 S7 p
- case GUI_ID_TEXT0:
$ m( I- ?, Z1 v0 s7 b, q/ y - case GUI_ID_TEXT1:& x; c2 R l. X* D4 A5 u V
- case GUI_ID_TEXT2:
9 G4 R9 g+ w1 g! y8 } - pState = (GUI_PID_STATE *)((WM_MESSAGE *)pMsg->Data.p)->Data.p;3 g1 x( k9 y5 A" `+ z+ h
- if (pState) {
+ b$ b1 l. q/ P' Q( z9 o - if (pState->Pressed) {7 }% Y/ _3 V' C: Y+ y3 W
- WM_HWIN hRadio = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);
9 }3 P* J$ Y! m3 S9 r- g) S& m - RADIO_SetValue(hRadio, Id - GUI_ID_TEXT0); 4 X- F& g8 q S
- }2 u7 t& ~9 z5 m% ]" X7 {
- }
% ^1 `8 P, r4 M/ ?: q/ b$ _; g! y8 o - break;/ B1 ]; w8 H) A* E6 w9 ` B
- }) o/ K( Q+ C) v3 O8 Y3 m$ j
- break;* o( N0 k) _1 `( \: E
- case WM_NOTIFY_PARENT:
. A8 |- l! ]/ @& l# V - Id = WM_GetId(pMsg->hWinSrc); // Id of widget
7 j6 j2 D, g# `3 j, ^ - NCode = pMsg->Data.v; // Notification code# P" S- \0 [ x: \
- switch (NCode) {3 q" S, H- l& F& U3 l- Y
- case WM_NOTIFICATION_RELEASED: // React only if released# Z. I0 a3 O9 p( F/ ?9 Z3 e+ M
- switch (Id) {" B/ ~5 N5 K- O8 ~" E; Y
- case GUI_ID_OK:7 o+ X& O9 E2 ~4 h' R/ V/ c3 f# t
- GUI_EndDialog(hDlg, 0);7 I5 M, {' E' p( h% K
- break;
* K9 Q9 [4 Z( U" a - case GUI_ID_CANCEL:) H4 E( {+ C% N4 ^: D2 T
- GUI_EndDialog(hDlg, 1);
2 d; o/ E$ w6 ?3 ?. D, Q+ I8 w - break;
5 k* y) E$ a8 D. m( k' ] - }
/ C# E% F3 z5 d - break;$ E. E7 ]% \4 y
- /* 当选择第三个单选按钮时,将使能编辑框GUI_ID_EDIT0 */8 q9 o! ^9 i6 D' t Q
- case WM_NOTIFICATION_VALUE_CHANGED:
G6 |% @* w( V' q - hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);2 ?0 q7 g2 R+ f: v
- Sel = RADIO_GetValue(hItem);
( l* T% w% |1 [7 A - hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);
# X- d+ w! V) y- O - WM_SetEnableState(hItem, Sel == 2);
3 u! y* s1 H5 H* w# j - break;
8 y0 ]0 H" B0 B U - }5 `: B7 e- W. o u3 m' |
- break;
8 G# Z/ }& g( q& o - default:, E# {; C# x: b, B
- WM_DefaultProc(pMsg);# e& g6 P1 \' b6 ?0 j) m8 g8 h
- }/ T$ x+ \5 p) q7 X; f, e; k9 f
- }( Y4 b* s7 W' G4 [, f5 ^. j [
-
# U* J! U7 L# h* W* H/ K' G0 c- t; U - /*********************************************************************
0 L! Z6 ]% \9 V6 ]' a8 B - *
0 O3 [, F1 @6 t1 v - * MainTask& t5 @9 a* P9 `" a9 g: c8 `
- */
1 N9 H8 b; I$ p# h- |5 i6 m0 [8 r - void MainTask(void) {( y f4 G S R
- GUI_Init();
& t, T0 W& [6 \/ [ - WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
3 r" Y+ p# G/ A& ^' j9 T# }: p - WM_SetCreateFlags(WM_CF_MEMDEV); // Use memory devices on all windows to avoid flicker+ m! I6 P6 N0 F' |
- while (1) {
" v2 o# x; Z/ i/ p: ?5 r - /* 创建阻塞式对话框 */
* q( M: O* b- x' ] - GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
' E# T+ z( d8 l$ I - GUI_Delay(1000);
; u8 p0 a2 o8 o4 l8 X - }* ^4 l7 G7 _8 B$ l5 I
- }
复制代码实际现象效果如下: 53.3 使用官方GUIBulder建立单选按钮控件 这里用GUIBulder5.22建立一个如下的界面(分辨率480*272): 鼠标放在单选按钮控件上面右击可以设置单选按钮: 具体每个选项的名字在右下角进行设置: 将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中): 53.4 总结 本期教程主要是跟大家讲解了单选按钮控件的基础知识。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的单选按钮控件API,其它的API大家都可以试试。 ) }; E/ e: ?! j7 c: R( e2 N @
|