特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
4 x& ^8 K# B2 W5 \: c9 l8 o第34章 窗口管理器实例(一) % V2 v; A5 ?; @0 u! p- ^: o' p0 c
为了帮助大家更好的理解窗口管理器的回调和消息机制,本期教程专门做了三个相关的例子,帮助大家更好的理解。 34. 1 用户自定义消息类型实例 34. 2 桌面窗口回调函数实例 34. 3 官方WM_Redraw.c实例 34. 4 总结 34.1 用户自定义消息类型实例 这里用上期教程所介绍的自定义消息类型做一个实例。代码跟上期教程的三个实例类似。实现源码如下(可以直接将代码复制到模拟器或者开发板上面运行)。 - #include <stddef.h>3 c2 K1 ?& F* k
- #include "GUI.h": y" q' v, N- f4 y8 j p
- #include "DIALOG.h"
- a' y9 I$ p- v S -
7 [ v7 r% L# `( D) u8 c; W! _ - #include "WM.h"8 P+ }( N4 }3 H) Y5 z7 c! }! t2 ~
- #include "BUTTON.h" o! T i* x( m+ ?7 U! c5 N
- #include "CHECKBOX.h"% |, K- X/ c+ }2 j. u
- #include "DROPDOWN.h"* d1 e& x/ J7 O' k: m
- #include "EDIT.h"
2 ^/ q, l8 T/ Z: e/ l - #include "FRAMEWIN.h"' i! _/ W' r$ C% Q7 v% S
- #include "LISTBOX.h"
% }& a3 r. G* {# ` - #include "MULTIEDIT.h": s7 S6 S7 e$ Y7 A$ I) W' h8 m
- #include "RADIO.h"/ I- n: D/ j8 @5 X2 d
- #include "SLIDER.h"; U7 [. H: r$ P) n
- #include "TEXT.h"
( y2 ?* I7 k/ v - #include "PROGBAR.h"& n. b6 V8 U. }7 f
- #include "SCROLLBAR.h"
, N& E+ r% K: c4 H8 g - #include "LISTVIEW.h"" w, }+ F' D' S. Y2 `* c" l
- 8 @6 }; U5 w* ~; F: Y' \" ?3 v1 x
-
* q% k$ Q0 E" Z& t - #define WM_UPDATE WM_USER + 1(1)
+ Y: C {' d: D - /*********************************************************************5 f1 @, C/ E& F
- *( d: [8 U# e$ i8 V% @& C& N' {
- * static data" I4 d/ W4 k/ t. x- s; ~
- *
5 x7 F u: K$ v* B3 h4 F+ A3 b* [: x - **********************************************************************2 t# Y( K5 x- w& k
- */ u5 I$ |" R4 G, ?' b
- GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};) E3 I+ B7 D5 k9 d
- static char ucBackColor;
7 X# d$ `- A. r$ v& | -
$ [4 ] |9 K+ d* B) b) s [7 L - 1 P+ x4 o) Q' s6 n$ I3 T1 e
- $ `+ y4 W: a# |$ I
- /*********************************************************************
, t4 B/ y+ [! A2 [! Z/ ^ - *
' I! r: x# a: A; D2 i0 M* U, n - * Dialog resource2 w) v" ^& n0 V* E. o. I
- *
& b+ q: f% s" z - * This table conatins the info required to create the dialog.
; H' m, I( G/ k3 Q: a/ n7 ? - * It has been created by ucGUIbuilder.# q* _+ Q5 w. y( Z3 U* s9 w
- */5 W/ z) e$ Z1 ], l% |
- : T5 v, e! V, V9 m5 a/ V1 h
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {9 H1 T) N! K: R0 M/ S) q# D
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},
2 g2 d( j5 M- Y - { BUTTON_CreateIndirect, "BUTTON0", GUI_ID_BUTTON0, 82, 122,162,37, 0,0},+ h* \- K Y8 K6 A% N, H; w7 b
- { BUTTON_CreateIndirect, "BUTTON1", GUI_ID_BUTTON1, 357,123,152,35, 0,0}
( y9 f4 Y+ k7 P - };8 m F9 r$ `0 z& O; r0 _1 E1 h" m
-
1 T' u/ I* U$ `5 h) H6 i2 O4 u - /*****************************************************************
: o8 V K* d1 N* u- Y; } - ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg)) ^% G2 }+ k- y! T5 S" V
- ** Function: to initialize the Dialog items
2 J% a8 i) {' B _: G" T - **
3 J d. ?, ^% {3 G ?6 { - ** call this function in _cbCallback --> WM_PAINT1 V q& ~! {$ W& v7 B3 O9 r
- *****************************************************************/- h* s. y; @8 V/ ~9 a8 \
-
2 y2 H+ | A3 l9 c8 I- V - void PaintDialog(WM_MESSAGE * pMsg): W, @( d+ y& d4 g9 |# e+ s0 w" L
- {- l" Z H# z ?+ O, Z4 A. ~! L/ e
- WM_HWIN hWin = pMsg->hWin;: a" G3 G3 H* B/ C0 ^5 ]
- GUI_SetBkColor(_acColor[ucBackColor]);5 i) l% J+ j- q. ^4 X
- GUI_Clear(); W6 r% W- t& U. N+ s
- }
4 Q8 f7 w Z4 I1 _2 B$ V& k5 l$ ^ -
: q+ e* c3 ~+ `( c m3 u( `6 |4 P, t - /*****************************************************************" _: X3 }6 d& |8 M6 {
- ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)9 i& j: ?% R2 X+ i2 l
- ** Function: to initialize the Dialog items
) f$ ?# u' g% @# Y! @( @- Q2 A - **
" ?, G' r6 S5 B# ~ - ** call this function in _cbCallback --> WM_INIT_DIALOG
! t& y H$ `, r6 o% F - *****************************************************************/
( D& Q- `7 J. p8 r; V& E - # B+ p: |5 U: R5 W n0 g2 q( W
- void InitDialog(WM_MESSAGE * pMsg)$ I8 T! @9 L9 P9 `4 h5 ]; ?
- {
( ~* b1 m5 W% H w) R3 a - WM_HWIN hWin = pMsg->hWin;
- g0 p s7 Q9 [7 v. u. U - //; o# Q- F. b$ L! d$ b3 o" N4 S
- //FRAMEWIN M- P I6 \% B$ d* v5 c* Z+ a: g/ U: p
- //! |# K' u- F: `% v8 ] z5 ^$ f
- FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
5 A3 B0 p/ A- A* | - FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);0 R4 k/ f/ M! |3 g; v8 r
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
! q' D/ V4 E" v - FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
) j5 g* q+ @3 j Q4 o9 H- }9 ~% S - FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
" _& V0 k; q% v" K6 f9 P7 | - FRAMEWIN_SetTitleHeight(hWin,30);
) B: l0 o; c; d5 S+ ?3 I+ B7 K -
% N7 d% l$ l0 e4 C( x. p r/ y - /* 默认颜色取*/# ]/ {. G$ O6 A
- ucBackColor = 0;
. Y/ G y( o# `6 x - }
- C" F8 ] o% @7 K8 E -
$ n5 Z, j* W) Y! E - /*********************************************************************
' B5 A# r2 r% v4 L2 o( I {2 G - *
9 U! Q3 y9 l; C Z2 Q0 B - * Dialog callback routine
+ @: F$ s1 s: r3 l: S - */
9 D& N) W" G) _' c9 K$ ^ - static void _cbCallback(WM_MESSAGE * pMsg) & I9 C0 H T: X! {0 P
- {
- [. Q8 ~2 g+ k. v) p - int NCode, Id;# [/ O- \7 K d/ E
- WM_HWIN hWin = pMsg->hWin;
6 N' H: w; N& d# e, ` - switch (pMsg->MsgId) 7 y- |( t" a/ d6 i- l. s% Z3 U3 }
- {- g$ V0 F) `/ {; P9 I' f
-
9 F* A/ t/ @' [! r - case WM_UPDATE: (2)
2 ~8 O- H' @; j, P' h - ucBackColor++;
2 r- R9 p2 a. {+ l - if (ucBackColor == 3)4 u' c4 x7 Z0 f8 Y8 c
- {, s! D% g. j4 w* U, @
- ucBackColor = 0;0 I- k! m7 }. B
- }" l& w/ \5 \; m) G: Y
- WM_InvalidateWindow(hWin);
& f6 b E% m3 Y! I6 ?- a - break;
" z: J: E& a1 L - case WM_MOUSEOVER:
6 d0 @1 L' S" d$ e9 n4 a$ F - break;4 J( n# E* v& G
- case WM_PAINT:5 ^. ^5 c7 J9 G
- PaintDialog(pMsg);
" y- @& R% b+ p+ ]( Q - break;- _; p. S1 ?1 V- k7 A1 M1 b- M
- case WM_INIT_DIALOG:
: s1 \# b% [8 x' Y; i+ O - InitDialog(pMsg);$ }& F+ D( V2 b! u9 f2 D* }$ n
- break;% O \+ c6 m" u0 k8 M X
- case WM_KEY:
$ _+ r5 g+ k# @9 R6 G - switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) : m+ d" X8 M) R* A, [
- {) {8 W2 W+ P1 i" }" V+ P3 B& E
- case GUI_KEY_ESCAPE:
* F0 ?. I( Q7 [7 [0 _ - GUI_EndDialog(hWin, 1);+ j ^% ~3 j. b( M
- break;" k) i* y( |) L
- case GUI_KEY_ENTER:1 q R3 |; x9 W& `# o
- GUI_EndDialog(hWin, 0);! u- @: s1 }3 R- V5 B
- break; _ V9 b& ?0 e; Z
- }
& h- L3 D8 C! A/ p$ V) z - break;
+ b2 C4 W: T; ` - case WM_NOTIFY_PARENT:; n/ n, h1 B0 X- z8 J# y' ~
- Id = WM_GetId(pMsg->hWinSrc);
, e# d6 n3 M) h( J2 L: D6 K! d4 C9 e - NCode = pMsg->Data.v;
% ?6 T! v' O; r* A( n8 K( I! u% V4 p - switch (Id) . v6 D) r6 v: P, T: x( Q) A+ u' \
- {
7 p1 Q5 q) _7 ]) Q! i - case GUI_ID_OK:
$ Z& S3 w# }: z - if(NCode==WM_NOTIFICATION_RELEASED)5 g3 |: d5 A5 e" j* v7 H
- GUI_EndDialog(hWin, 0);; S; [- a. A( K
- break; ?, S+ `7 S6 D9 b
- case GUI_ID_CANCEL:
' F' {2 c% R* l) R& ~. E+ u - if(NCode==WM_NOTIFICATION_RELEASED)
* N# q4 P" k3 Q9 o" C: n. Y - GUI_EndDialog(hWin, 0);& |: z9 U I* g* b
- break;+ i! `( a# h+ M, ]5 {
- case GUI_ID_BUTTON0:
Q, _5 g& E, E! I - switch(NCode)7 H3 J' d" g# o( w5 Q
- {" K( L0 i, E/ n Y! h# W
- case WM_NOTIFICATION_CLICKED:
. W; V& i! \3 I2 B! j: R - ucBackColor++;- z( `. `& J2 n8 M7 ~1 U" M2 F, \
- if (ucBackColor == 3)
' y4 [+ m5 w0 Z1 ~$ L - {
* m- C+ E) f6 a0 x& T - ucBackColor = 0;# a: i: U& N% n) T; h) }# o/ Q
- }, t+ }5 c6 Y2 J$ K
- WM_InvalidateWindow(hWin);( T0 @" C% S% t: S3 E
- break;
' F" M3 ]1 ]+ i' K% W - case WM_NOTIFICATION_RELEASED:
) D: {" E0 D {9 g -
4 L# b0 T1 o9 m - break;
. g4 U7 U4 ]" ^7 V5 j+ s - case WM_NOTIFICATION_MOVED_OUT:
7 [- ~, u. V J) h# v4 k D# m+ \ - & K& i5 T6 }. S& c2 s
- break;
3 `7 D4 _8 @( P4 r- E6 Z" V- \ - } q _$ L7 K" v% D1 Y
- break;2 V: z- E1 D0 G. \. t/ L/ X
- case GUI_ID_BUTTON1:
9 w/ X7 B! E3 D& I- T( e - switch(NCode)% L. `& D' t, Y8 |: o s
- {6 r2 q! s4 r$ v- H. O& t
- case WM_NOTIFICATION_CLICKED:
0 J. i! }2 o/ m0 Q+ _ - ucBackColor--;
# a6 c4 e4 Z7 n5 O: V - if (ucBackColor < 0)
, {/ ^3 E, ]- l% G9 @% U4 M - {
3 k! Q* Q' R( m0 r - ucBackColor = 2;
1 L) k" S. a7 Z3 D! O; m/ n* r - }
" e, O# `! v* W0 B5 F1 @ - WM_InvalidateWindow(hWin);# c, `7 `7 X2 v# U- b, [
- break;
6 J0 z* l# p* g6 e# T! x - case WM_NOTIFICATION_RELEASED:. e9 B' \4 l) V# \
-
4 `2 k% w- N) P - break;
: P& j5 g- b. b7 M+ G( z3 K0 a - case WM_NOTIFICATION_MOVED_OUT:
; Z3 j+ J! k, a4 Z -
3 J7 n) j- S9 a0 t - break;
% \- h' o" N3 w8 S H& T - }
8 \$ b; i: C4 O4 s - break;
9 Y! ~' m1 I5 }4 p& _# c - * U- F3 y1 l! O* s
- }# ~) z: D8 R3 @) H9 H9 H" P8 c2 y# q
- break;
! ~/ c E& G! U& m - default:
( y& ^* P8 U4 v+ z8 U, d! b# o - WM_DefaultProc(pMsg);$ r! w: U( Q+ G9 a
- }
+ B9 }% f8 p& v9 C - }+ a5 F! {. ^' T% @' X" U
-
! Q. Q; \1 F ? - 5 k+ a: ^, e, d! |$ k+ i4 _) l+ [
- /*********************************************************************7 p5 V3 K! h3 x' S/ @$ f
- *9 W8 @3 O" p6 \/ R7 K
- * MainTask) V" [1 [, A$ Z4 a' s( m
- *
+ }* a' D. C+ B( ?" f8 j9 n* x- ]' a5 \ - **********************************************************************; Q+ \ a: A) h0 K3 k
- */
& E# q# C8 V+ Q2 V: x - void MainTask(void) % Q) U* Y8 E; V( Z2 w7 k9 B5 w' V
- { " C4 T9 z% \7 o0 E- g8 i
- WM_HWIN hDlg;
1 }8 Z7 N2 M4 I* B5 n* s - J6 k- y" y9 [ U& l R! b9 S' {
- GUI_Init();$ L1 ^& q. i1 _3 \ W, T/ y% ?# H5 @
- WM_SetDesktopColor(GUI_BLUE); /* Automacally update desktop window */
3 i2 }+ P8 @# }# D! N - WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
6 p: }& w% h0 a* L- s - PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);; y; O7 c1 y! ]( w( S! T" K& ?
- FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
! J2 b0 z' u$ l) R* V+ S, d1 P - PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);5 ^$ v/ \( o6 @9 b. `+ Q
- BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
8 s* q) N- q E4 V - CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);, A, \+ W8 y2 O0 O- y- W
- DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);* f$ E6 ]" W: f6 r5 Y
- SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
: M$ F' u4 r9 p3 M) n: E. ]/ G8 i( | - SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);* ~, K/ k* G, R7 o3 h
- HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);2 x. p8 P+ Y; y! H' z" U& S
- RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
" I0 n5 f. I& M4 r5 Z8 F4 @ - /* 创建一个对话框 */
8 g' P, x7 Y7 H- e - hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);9 o" X. B! E) t0 V
- while (1)
# o$ k$ s' {- Y6 y. N - {
. V( b+ ~0 D! i' Q- a; l. K - WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_UPDATE); (3)
+ L! X9 G% w) ?; Q* B& `" R - GUI_Delay(500);. U, v% ~+ ~% Q" o- C
- }1 o9 w! a! D& Z b1 W
- # G5 ~; W9 ~8 h' P# j
- }
复制代码1. 定义一个用户消息WM_UPDATE。一定要以WM_USER作为起始值,防止跟系统其他的数值冲突。 2. 在回调函数中加入咱们定义的消息WM_UPDATE,实现对话框中背景的更新功能。 3. 通过函数WM_SendMessageNoPara()每隔500ms给对话框发送消息。这里要特别的注意一点,这个函数是给窗口发送消息的,而咱们前面创建的是对话框,所以这里必须得通过函数WM_GetClientWindow得到窗口的句柄。 这个程序的显示效果如下:
9 i) j, r( C' F- T0 @3 ^, [ |
7 y' A2 o) x( v