特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接5 w$ y5 _' v/ d1 e6 {1 a) I, |2 Y
第35章 窗口管理器实例(二) & L8 u: u( f I$ k+ S) F4 ^3 ^
为了帮助大家更好的理解窗口管理器的回调和消息机制,本期教程专门做了三个相关的例子,这三个例子全部来自官方。 35. 1 官方WM_Sample.c实例 35. 2 官方WM_LateClipping.c实例 35. 3 官方WM_Video实例 35. 4 总结 35.1 官方WM_Sample.c实例 这个实例基本演示了大部分WM的API函数,这个DEMO的所在位置是: 这个代码的内容比较多,这里捡几个重要的部分跟大家讲解一下。 35.1.1 桌面窗口回调函数- #define MSG_CHANGE_TEXT (WM_USER + 0)(1)* v! u# w4 H; l2 Q J" W2 i
- & P' q) u1 t5 C6 o) ~; x. U, i
- /*******************************************************************% ?1 a& @! X/ ?; T0 X. t7 `
- *1 t! m8 @4 s$ o6 G# ~
- * _ChangeInfoText5 {# t$ E9 p" V: t, z1 w
- *
5 N& m" q# ^# o# W7 I - * Function description# U1 n9 W% }: a# a5 A3 O7 L
- * Sends a message to the background window and invalidate it, so
b' ^5 z. x" N; Q4 O+ Q - * the callback of the background window display the new text.
. ]( n' D; F9 }6 e: Z0 K. `% r - */8 h/ {. A: c1 g
- static void _ChangeInfoText(char * pStr) {(2)
- e% Z% @7 j7 d3 E/ I/ C( i4 ?: v - WM_MESSAGE Message;1 S. H: E0 i& S. d! u' Z
- . W5 o r/ G4 f; |
- Message.MsgId = MSG_CHANGE_TEXT;
- h& w" P2 \8 [( S3 S6 s - Message.Data.p = pStr;7 Y1 T0 H+ i. U' f! [
- WM_SendMessage(WM_HBKWIN, &Message);# f) j9 C- E: a7 M: E
- WM_InvalidateWindow(WM_HBKWIN);* [; [: J: `8 y5 t( }" S
- }: K7 i7 k4 }" E7 B. f
- ' b7 x n O# m1 M
- /*******************************************************************' K r4 p F; j9 R: \
- *
4 I& ?5 I, `3 @8 J u, T+ e8 }% ^ - * _DrawInfoText+ k7 d" c1 u1 y* q7 w% N7 w
- *7 c8 t( f' t- Q! h
- * Function description
: c$ c7 A1 S/ @3 r! `0 {( I# [# y - * Drawes the info text directly on the display. This function is for
+ j: m" c" ~& B6 f* G. v( n' i - * the moments when no callback is set.7 i/ d/ D6 J' o3 z1 G+ ^! _' V) C
- */
% U2 j" b# J$ r0 L! g4 `! T - static void _DrawInfoText(char * pStr) {(3)
$ I8 j! J6 E) D/ }' d - GUI_SetColor(GUI_WHITE);
" \9 C& X: A' j - GUI_SetFont(&GUI_Font24_ASCII);
) m8 f4 B6 f. N$ S8 L' F$ k- ? - GUI_DispStringHCenterAt("WindowManager - Sample", 160, 5);0 Z* U9 ^5 @% Q9 `) b) K2 x8 p6 o+ k
- GUI_SetFont(&GUI_Font8x16);
4 H: f1 f6 q3 E0 O* i/ O& e; F2 k0 v - GUI_DispStringAtCEOL(pStr, 5, 40);: W$ T0 P" n+ A
- }
1 U/ h& c" }& v) @ - 3 `0 A6 ~; f9 l0 |! P J3 o+ C
- /*******************************************************************
; _4 k7 o9 ?: O! s - *4 N+ H4 |) m* A% Y( p/ H, I
- * _cbBkWindow
3 X. P& t$ g0 |+ i5 o - */
, Z7 t$ c+ c8 q s- {4 d - static void _cbBkWindow(WM_MESSAGE * pMsg) {0 A) b/ |0 E+ t
- switch (pMsg->MsgId) {
& |. [0 q* V5 j9 B+ c, Y& L - case MSG_CHANGE_TEXT:(4)
& @3 [8 k l7 Q; G9 }. {: B - strcpy(_acInfoText, (char const *)pMsg->Data.p);(5)/ u B! n% k1 v6 Y$ T; }: n* z8 K
- case WM_PAINT:(6)
" k* t, n. r. Q1 u0 e3 _ - GUI_SetBkColor(GUI_BLACK);
# i" `' `5 B; T* N$ h& G' z* d - GUI_Clear();
& |/ n+ T! w) m) c, [: d( r - GUI_SetColor(GUI_WHITE);, P7 c. t: |$ n, O6 B0 J: I& m! {
- GUI_SetFont(&GUI_Font24_ASCII);
8 }& N' O4 J4 i7 @ - GUI_DispStringHCenterAt("WindowManager - Sample", 160, 5);
: c( {& I* b: A7 \ - GUI_SetFont(&GUI_Font8x16);! F) J4 M, K0 V) ]/ J6 }
- GUI_DispStringAt(_acInfoText, 5, 40);
K1 c7 b5 i; F - break; E# H0 D! {, A$ N5 D
- default:1 f9 m) m+ A5 A+ F
- WM_DefaultProc(pMsg);
' \+ V# b" u4 F5 O4 ] - }% W3 ?! X: v4 E, m/ i; A
- }
复制代码1. 用户自定义的消息ID。 2. 通过用户自定义的消息实现给桌面窗口的回调函数发数据。调用了函数WM_SendMessage(WM_HBKWIN, &Message)后会给桌面窗口的回调函数发数据,再调用了WM_InvalidateWindow(WM_HBKWIN)后会执行桌面窗口回调函数中的WM_PAINT。 3. 文本显示函数。 4. 用户自定义消息ID。 5. 字符串复制。将Data.p中的数据复制到_acInfoText中。 6. 在WM_PAINT中显示文本acInfoText。 35.1.2 Redrawing部分演示- /*******************************************************************
& k2 T7 f' B/ x4 L' ] - *
* U: @3 N, @$ t - * _LiftUp: h9 J6 H+ W$ O+ h
- */
) H. l) g# {0 P1 Y4 d$ s, L - static void _LiftUp(int dy) {(1): u, [# u4 Q6 @
- int i;; T3 N" ^! a5 R) N' Y3 a2 o2 C
- int tm;+ T) p' F1 E4 s9 D* d! E* P4 c
-
1 a O8 s6 `7 O$ z$ { - for (i = 0; i < (dy/4); i++) {
9 N1 n, ?$ u. g+ o$ X1 @. G! n; H - tm = GUI_GetTime();
+ j; P: X" r. R \- L - WM_MoveWindow(_hWindow1, 0, -4);
$ z( ?' I5 i1 B q, ?+ [ - WM_MoveWindow(_hWindow2, 0, -4);) j1 ]2 w5 t( ^- a; b
- while ((GUI_GetTime() - tm) < 20) {+ o( O9 l' M2 N
- WM_Exec();+ w& ^0 w) K+ l6 k
- }
5 {3 y" h. u9 [1 ] - }
! y5 m/ O3 R8 X% B7 z - }
) c5 z: u/ N7 j$ O6 `% i -
3 t- `' I$ S0 Q" u4 k' E5 Y - /*******************************************************************8 P! B6 f g: g, u4 I; i
- *
' k, i) [0 w: t- E/ ` - * _LiftDown2 ?5 X. r- z4 _ |' N
- */
5 h" ~$ w4 b9 I/ T% ]& s8 { - static void _LiftDown(int dy) { (2)8 X* d8 ^. J4 Z) B# J* `, R
- int i;
8 E2 d K% L1 T, I - int tm;' }" d1 |! D5 g* G& L/ r) d
-
& j, u: ^7 w; _- Z - for (i = 0; i < (dy/4); i++) {- P3 s3 r3 C; S+ D
- tm = GUI_GetTime();
_3 u: L/ B7 ]: B - WM_MoveWindow(_hWindow1, 0, 4);
H9 h) U ]+ S# C2 B - WM_MoveWindow(_hWindow2, 0, 4);. N& ~2 X6 D0 j! [
- while ((GUI_GetTime() - tm) < 20) {' h, V0 g u( [6 Q" D
- WM_Exec();
8 p/ H- D* H% ~7 D3 Y/ i9 c1 T0 D# { - }) U% D& t# H1 { \6 [
- }, D: A& v! I/ A/ N; n( ~2 ]
- }- n: ^. Z" b, Z5 @8 F2 U
- + C" m% q- T4 o' I
- /*******************************************************************# |1 m$ h6 f- I. g
- *6 W. |. x4 F R5 h1 m% h8 x
- * _DemoRedrawing
0 B+ k+ j c) \$ S3 ` - *" B, J( j- ^; n/ p8 P0 x
- * Function description
2 D) Y+ _- ]; d8 a. }4 F! l$ a - * Demonstrates how useful can be a callback
+ `. a6 E8 @( D. B" h" M& J* n - */
1 e+ w3 N( m ?) X5 a% H: Z4 ` - static void _DemoRedrawing(void) {
! ]. b& @! V& J* Y) G1 L - int i;
6 k% m, w% v Q8 T3 f. d" y - int tm;
$ s: C) P j N' P5 ~) }2 F - int tDiff;8 a9 t. V/ u7 B
-
8 H* t/ g) ^5 {: ? - _ChangeInfoText("Demonstrating redrawing");
+ O5 j9 I" F, ~6 m2 K" z - GUI_Delay(SPEED);- ?. h; r& B9 v
- _LiftUp(40);
3 [3 o% b! D* D c: X% | - GUI_Delay(SPEED/3);+ W5 d0 O9 A3 G1 h7 D
- _ChangeInfoText("Using a callback for redrawing");
% D7 H2 [; X+ V" M( [" u0 i - GUI_Delay(SPEED/3);
0 Q$ r. F4 d) ~+ f1 M - for (i = 0; i < 55; i++) {: w* ^1 u2 v8 N6 `
- tm = GUI_GetTime();
8 ^8 }& {! k% L2 |* _ - WM_MoveWindow(_hWindow1, 1, 1);
$ `4 p+ h" \$ O3 V- Q9 H" s2 e' H1 T - WM_MoveWindow(_hWindow2, -1, -1);- M w+ Y9 B' u& m8 V
- tDiff = 15 - (GUI_GetTime() - tm);
* x9 c+ l, Z* V4 e - GUI_Delay(tDiff);
4 O; C( b. ?: ]; y& W% f" a - }
$ E+ C) y: _5 q2 @# D9 n - for (i = 0; i < 55; i++) {8 V/ B! [; L( [% Y) @: _
- tm = GUI_GetTime();
" Y/ \( c: C9 ]3 Q9 I - WM_MoveWindow(_hWindow1, -1, -1);
* l% l& E6 c3 ]: i - WM_MoveWindow(_hWindow2, 1, 1);0 \% R' B4 i; V2 O. _0 P
- tDiff = 15 - (GUI_GetTime() - tm);
) J4 f M' ^7 F8 Z6 g( N. I - GUI_Delay(tDiff);
' R( Y1 [6 y$ W$ }" Z - }- E6 u/ g: I1 X z( v3 y; E
- GUI_Delay(SPEED/4);" \3 ^1 Z% @" _3 b' D& a( D
- _LiftDown(30);5 \' J8 P4 I0 ~$ M3 q" C2 P
- GUI_Delay(SPEED/2);% f; l) n3 J, N2 ]9 h( d
- _ChangeInfoText("Without redrawing");
! N5 h9 E- d( n" y8 Y( v, m - GUI_Delay(SPEED);
6 X3 i. d# Q+ ?' Z- x. {8 e% T - _LiftUp(30);& @0 _, P& e: @- x
- GUI_Delay(SPEED/4);
C4 \* H; A3 i; b0 i; M2 T- W - WM_SetCallback(WM_HBKWIN, _cbBkWindowOld);
" U' R3 }8 m+ n, k/ ]: } - for (i = 0; i < 55; i++) {
9 M9 {3 b6 q- g& A - tm = GUI_GetTime(); I. ]5 H9 Y; H, d9 {9 J- ~
- WM_MoveWindow(_hWindow1, 1, 1);
* |+ G- F9 a8 k h- u$ j5 O1 B - WM_MoveWindow(_hWindow2, -1, -1);
# V, L% P& o" p! ~: X - tDiff = 15 - (GUI_GetTime() - tm);
2 o' `( X& M0 K2 C/ M' ~4 R; z - GUI_Delay(tDiff);* u' L9 R$ O/ s) V; Z5 z: U+ b' R
- }& }7 }/ F/ I2 o, y
- for (i = 0; i < 55; i++) {
0 Y$ R0 z) D1 ` T - tm = GUI_GetTime();; V Z; l, t- ?& [/ [7 b
- WM_MoveWindow(_hWindow1, -1, -1);
3 D! I: O6 U4 M) L {( Z8 g4 j8 C3 v - WM_MoveWindow(_hWindow2, 1, 1);! c4 |" F& p! R
- tDiff = 15 - (GUI_GetTime() - tm);
( i4 _% g% t. {' h+ S1 o$ a - GUI_Delay(tDiff);
, I; b( D% P( a! `/ o - }5 [# F8 l4 k6 r2 `" R
- GUI_Delay(SPEED/3);
7 A+ l- v6 A+ y8 Y - WM_SetCallback(WM_HBKWIN, _cbBkWindow);
+ l- P$ F! Y; R/ u - _LiftDown(40);5 m- d& S& ^+ \, p$ @$ s P
- GUI_Delay(SPEED);: h9 k+ g: r& L& R
- }
复制代码这部分代码实现了两个窗口在具有重绘和不具有重绘功能时的演示。 1. 实现两个窗口向上移动。 2. 实现两个窗口向下移动。 显示效果如下: 35.1.3 Resize部分演示- /*******************************************************************
% }+ y* ^/ }! s5 D) \ - *
4 x) V0 J" T+ o - * _DemoResizeWindow
$ g" K% s* _* ^& A, s - *& S7 _- L1 A4 ^6 y3 Y1 a7 C0 p
- * Function description
1 j" i/ R( D2 A4 M - * Demonstrates the use of WM_ResizeWindow
" k9 v4 v$ ? K9 c - */: v& u3 h# `: M" f
- static void _DemoResizeWindow(void) {7 p3 f0 m/ ]3 s* C3 T9 _
- int i;
1 ]+ p4 l7 {/ H M( A# S5 A5 e, z - int tm;
% {. \# A. b- x8 N+ } - int tDiff;
M- s6 t3 _. ] ]" z6 h -
, F7 U+ ]5 ]- w* K - _ChangeInfoText("WM_ResizeWindow()");
" a M, T+ ?% @: [ - GUI_Delay(SPEED);
7 K( p; Z5 l$ K- T8 a - _LiftUp(30);( O* B! }- c3 w. q8 T( |
- for (i = 0; i < 20; i++) {* s# B% T+ ~) F$ z. E
- tm = GUI_GetTime();
8 P0 l q* X* O - WM_ResizeWindow(_hWindow1, 1, 1);9 o6 p6 v8 c- r( s( j
- WM_ResizeWindow(_hWindow2, -1, -1);
- x9 z: g9 S9 r/ l - tDiff = 15 - (GUI_GetTime() - tm);
* ^8 K9 {, {" O# U% f4 Y - GUI_Delay(tDiff);
8 G- z5 M" C' M* w4 o B - }. S$ C) b J3 m3 j& S% M
- for (i = 0; i < 40; i++) {
% w3 a! ?0 t' O* p - tm = GUI_GetTime();
, ]- }: z( Q5 ?" {& U* ] - WM_ResizeWindow(_hWindow1, -1, -1);
- Z8 Q4 N5 e* c* f! m* p* ?* U - WM_ResizeWindow(_hWindow2, 1, 1);
* W. X. C( `! K: B8 v - tDiff = 15 - (GUI_GetTime() - tm);& Z( P6 }1 y3 n- ^8 w" P' ?
- GUI_Delay(tDiff);# V& {" t) V1 N- A& s& }
- }9 Y5 G1 C9 l, ^ w4 \
- for (i = 0; i < 20; i++) {
- D* J9 N1 q. k4 i - tm = GUI_GetTime();
, z4 N0 J1 b7 i' b3 [% S7 s& D - WM_ResizeWindow(_hWindow1, 1, 1);/ g: S& d/ K2 B* Y$ v. T& q
- WM_ResizeWindow(_hWindow2, -1, -1);
5 z" _0 B( k: z' c6 d - tDiff = 15 - (GUI_GetTime() - tm); s' g4 K4 V7 _) U2 c
- GUI_Delay(tDiff);
" l/ v4 y$ y! X9 g% y/ I - }
; P# Q. h/ ^$ U* j* D - _LiftDown(30);2 e! a. `' ], A5 t5 i7 a
- GUI_Delay(SPEED); t/ z) y, I/ o' F# @
- }
复制代码这部分的演示主要看放缩函数WM_ResizeWindow(),注意这个函数里面的参数是相对值。显示效果如下: 0 h( _1 Z# Z: o$ @9 g
|