你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第35章 窗口管理器实例(二)

[复制链接]
baiyongbin2009 发布时间:2015-2-15 20:17
特别说明:完整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.png
这个代码的内容比较多,这里捡几个重要的部分跟大家讲解一下。
35.1.1 桌面窗口回调函数
  1. #define MSG_CHANGE_TEXT (WM_USER + 0)(1)* v! u# w4 H; l2 Q  J" W2 i
  2. & P' q) u1 t5 C6 o) ~; x. U, i
  3. /*******************************************************************% ?1 a& @! X/ ?; T0 X. t7 `
  4. *1 t! m8 @4 s$ o6 G# ~
  5. *       _ChangeInfoText5 {# t$ E9 p" V: t, z1 w
  6. *
    5 N& m" q# ^# o# W7 I
  7. * Function description# U1 n9 W% }: a# a5 A3 O7 L
  8. *   Sends a message to the background window and invalidate it, so
      b' ^5 z. x" N; Q4 O+ Q
  9. *   the callback of the background window display the new text.
    . ]( n' D; F9 }6 e: Z0 K. `% r
  10. */8 h/ {. A: c1 g
  11. static void _ChangeInfoText(char * pStr) {(2)
    - e% Z% @7 j7 d3 E/ I/ C( i4 ?: v
  12.   WM_MESSAGE Message;1 S. H: E0 i& S. d! u' Z
  13. . W5 o  r/ G4 f; |
  14.   Message.MsgId  = MSG_CHANGE_TEXT;
    - h& w" P2 \8 [( S3 S6 s
  15.   Message.Data.p = pStr;7 Y1 T0 H+ i. U' f! [
  16.   WM_SendMessage(WM_HBKWIN, &Message);# f) j9 C- E: a7 M: E
  17.   WM_InvalidateWindow(WM_HBKWIN);* [; [: J: `8 y5 t( }" S
  18. }: K7 i7 k4 }" E7 B. f
  19. ' b7 x  n  O# m1 M
  20. /*******************************************************************' K  r4 p  F; j9 R: \
  21. *
    4 I& ?5 I, `3 @8 J  u, T+ e8 }% ^
  22. *       _DrawInfoText+ k7 d" c1 u1 y* q7 w% N7 w
  23. *7 c8 t( f' t- Q! h
  24. * Function description
    : c$ c7 A1 S/ @3 r! `0 {( I# [# y
  25. *   Drawes the info text directly on the display. This function is for
    + j: m" c" ~& B6 f* G. v( n' i
  26. *   the moments when no callback is set.7 i/ d/ D6 J' o3 z1 G+ ^! _' V) C
  27. */
    % U2 j" b# J$ r0 L! g4 `! T
  28. static void _DrawInfoText(char * pStr) {(3)
    $ I8 j! J6 E) D/ }' d
  29.   GUI_SetColor(GUI_WHITE);
    " \9 C& X: A' j
  30.   GUI_SetFont(&GUI_Font24_ASCII);
    ) m8 f4 B6 f. N$ S8 L' F$ k- ?
  31.   GUI_DispStringHCenterAt("WindowManager - Sample", 160, 5);0 Z* U9 ^5 @% Q9 `) b) K2 x8 p6 o+ k
  32.   GUI_SetFont(&GUI_Font8x16);
    4 H: f1 f6 q3 E0 O* i/ O& e; F2 k0 v
  33.   GUI_DispStringAtCEOL(pStr, 5, 40);: W$ T0 P" n+ A
  34. }
    1 U/ h& c" }& v) @
  35. 3 `0 A6 ~; f9 l0 |! P  J3 o+ C
  36. /*******************************************************************
    ; _4 k7 o9 ?: O! s
  37. *4 N+ H4 |) m* A% Y( p/ H, I
  38. *       _cbBkWindow
    3 X. P& t$ g0 |+ i5 o
  39. */
    , Z7 t$ c+ c8 q  s- {4 d
  40. static void _cbBkWindow(WM_MESSAGE * pMsg) {0 A) b/ |0 E+ t
  41.   switch (pMsg->MsgId) {
    & |. [0 q* V5 j9 B+ c, Y& L
  42.   case MSG_CHANGE_TEXT:(4)
    & @3 [8 k  l7 Q; G9 }. {: B
  43.     strcpy(_acInfoText, (char const *)pMsg->Data.p);(5)/ u  B! n% k1 v6 Y$ T; }: n* z8 K
  44.   case WM_PAINT:(6)
    " k* t, n. r. Q1 u0 e3 _
  45.     GUI_SetBkColor(GUI_BLACK);
    # i" `' `5 B; T* N$ h& G' z* d
  46.     GUI_Clear();
    & |/ n+ T! w) m) c, [: d( r
  47.     GUI_SetColor(GUI_WHITE);, P7 c. t: |$ n, O6 B0 J: I& m! {
  48.     GUI_SetFont(&GUI_Font24_ASCII);
    8 }& N' O4 J4 i7 @
  49.     GUI_DispStringHCenterAt("WindowManager - Sample", 160, 5);
    : c( {& I* b: A7 \
  50.     GUI_SetFont(&GUI_Font8x16);! F) J4 M, K0 V) ]/ J6 }
  51.     GUI_DispStringAt(_acInfoText, 5, 40);
      K1 c7 b5 i; F
  52.     break;  E# H0 D! {, A$ N5 D
  53.   default:1 f9 m) m+ A5 A+ F
  54.     WM_DefaultProc(pMsg);
    ' \+ V# b" u4 F5 O4 ]
  55.   }% W3 ?! X: v4 E, m/ i; A
  56. }
复制代码
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部分演示
  1. /*******************************************************************
    & k2 T7 f' B/ x4 L' ]
  2. *
    * U: @3 N, @$ t
  3. *       _LiftUp: h9 J6 H+ W$ O+ h
  4. */
    ) H. l) g# {0 P1 Y4 d$ s, L
  5. static void _LiftUp(int dy) {(1): u, [# u4 Q6 @
  6.   int i;; T3 N" ^! a5 R) N' Y3 a2 o2 C
  7.   int tm;+ T) p' F1 E4 s9 D* d! E* P4 c

  8. 1 a  O8 s6 `7 O$ z$ {
  9.   for (i = 0; i < (dy/4); i++) {
    9 N1 n, ?$ u. g+ o$ X1 @. G! n; H
  10.     tm = GUI_GetTime();
    + j; P: X" r. R  \- L
  11.     WM_MoveWindow(_hWindow1, 0, -4);
    $ z( ?' I5 i1 B  q, ?+ [
  12.     WM_MoveWindow(_hWindow2, 0, -4);) j1 ]2 w5 t( ^- a; b
  13.     while ((GUI_GetTime() - tm) < 20) {+ o( O9 l' M2 N
  14.       WM_Exec();+ w& ^0 w) K+ l6 k
  15.     }
    5 {3 y" h. u9 [1 ]
  16.   }
    ! y5 m/ O3 R8 X% B7 z
  17. }
    ) c5 z: u/ N7 j$ O6 `% i

  18. 3 t- `' I$ S0 Q" u4 k' E5 Y
  19. /*******************************************************************8 P! B6 f  g: g, u4 I; i
  20. *
    ' k, i) [0 w: t- E/ `
  21. *       _LiftDown2 ?5 X. r- z4 _  |' N
  22. */
    5 h" ~$ w4 b9 I/ T% ]& s8 {
  23. static void _LiftDown(int dy) { (2)8 X* d8 ^. J4 Z) B# J* `, R
  24.   int i;
    8 E2 d  K% L1 T, I
  25.   int tm;' }" d1 |! D5 g* G& L/ r) d

  26. & j, u: ^7 w; _- Z
  27.   for (i = 0; i < (dy/4); i++) {- P3 s3 r3 C; S+ D
  28.     tm = GUI_GetTime();
      _3 u: L/ B7 ]: B
  29.     WM_MoveWindow(_hWindow1, 0, 4);
      H9 h) U  ]+ S# C2 B
  30.     WM_MoveWindow(_hWindow2, 0, 4);. N& ~2 X6 D0 j! [
  31.     while ((GUI_GetTime() - tm) < 20) {' h, V0 g  u( [6 Q" D
  32.       WM_Exec();
    8 p/ H- D* H% ~7 D3 Y/ i9 c1 T0 D# {
  33.     }) U% D& t# H1 {  \6 [
  34.   }, D: A& v! I/ A/ N; n( ~2 ]
  35. }- n: ^. Z" b, Z5 @8 F2 U
  36. + C" m% q- T4 o' I
  37. /*******************************************************************# |1 m$ h6 f- I. g
  38. *6 W. |. x4 F  R5 h1 m% h8 x
  39. *       _DemoRedrawing
    0 B+ k+ j  c) \$ S3 `
  40. *" B, J( j- ^; n/ p8 P0 x
  41. * Function description
    2 D) Y+ _- ]; d8 a. }4 F! l$ a
  42. *   Demonstrates how useful can be a callback
    + `. a6 E8 @( D. B" h" M& J* n
  43. */
    1 e+ w3 N( m  ?) X5 a% H: Z4 `
  44. static void _DemoRedrawing(void) {
    ! ]. b& @! V& J* Y) G1 L
  45.   int i;
    6 k% m, w% v  Q8 T3 f. d" y
  46.   int tm;
    $ s: C) P  j  N' P5 ~) }2 F
  47.   int tDiff;8 a9 t. V/ u7 B

  48. 8 H* t/ g) ^5 {: ?
  49.   _ChangeInfoText("Demonstrating redrawing");
    + O5 j9 I" F, ~6 m2 K" z
  50.   GUI_Delay(SPEED);- ?. h; r& B9 v
  51.   _LiftUp(40);
    3 [3 o% b! D* D  c: X% |
  52.   GUI_Delay(SPEED/3);+ W5 d0 O9 A3 G1 h7 D
  53.   _ChangeInfoText("Using a callback for redrawing");
    % D7 H2 [; X+ V" M( [" u0 i
  54.   GUI_Delay(SPEED/3);
    0 Q$ r. F4 d) ~+ f1 M
  55.   for (i = 0; i < 55; i++) {: w* ^1 u2 v8 N6 `
  56.     tm = GUI_GetTime();
    8 ^8 }& {! k% L2 |* _
  57.     WM_MoveWindow(_hWindow1,  1,  1);
    $ `4 p+ h" \$ O3 V- Q9 H" s2 e' H1 T
  58.     WM_MoveWindow(_hWindow2, -1, -1);- M  w+ Y9 B' u& m8 V
  59.     tDiff = 15 - (GUI_GetTime() - tm);
    * x9 c+ l, Z* V4 e
  60.     GUI_Delay(tDiff);
    4 O; C( b. ?: ]; y& W% f" a
  61.   }
    $ E+ C) y: _5 q2 @# D9 n
  62.   for (i = 0; i < 55; i++) {8 V/ B! [; L( [% Y) @: _
  63.     tm = GUI_GetTime();
    " Y/ \( c: C9 ]3 Q9 I
  64.     WM_MoveWindow(_hWindow1, -1, -1);
    * l% l& E6 c3 ]: i
  65.     WM_MoveWindow(_hWindow2,  1,  1);0 \% R' B4 i; V2 O. _0 P
  66.     tDiff = 15 - (GUI_GetTime() - tm);
    ) J4 f  M' ^7 F8 Z6 g( N. I
  67.     GUI_Delay(tDiff);
    ' R( Y1 [6 y$ W$ }" Z
  68.   }- E6 u/ g: I1 X  z( v3 y; E
  69.   GUI_Delay(SPEED/4);" \3 ^1 Z% @" _3 b' D& a( D
  70.   _LiftDown(30);5 \' J8 P4 I0 ~$ M3 q" C2 P
  71.   GUI_Delay(SPEED/2);% f; l) n3 J, N2 ]9 h( d
  72.   _ChangeInfoText("Without redrawing");
    ! N5 h9 E- d( n" y8 Y( v, m
  73.   GUI_Delay(SPEED);
    6 X3 i. d# Q+ ?' Z- x. {8 e% T
  74.   _LiftUp(30);& @0 _, P& e: @- x
  75.   GUI_Delay(SPEED/4);
      C4 \* H; A3 i; b0 i; M2 T- W
  76.   WM_SetCallback(WM_HBKWIN, _cbBkWindowOld);
    " U' R3 }8 m+ n, k/ ]: }
  77.   for (i = 0; i < 55; i++) {
    9 M9 {3 b6 q- g& A
  78.     tm = GUI_GetTime();  I. ]5 H9 Y; H, d9 {9 J- ~
  79.     WM_MoveWindow(_hWindow1,  1,  1);
    * |+ G- F9 a8 k  h- u$ j5 O1 B
  80.     WM_MoveWindow(_hWindow2, -1, -1);
    # V, L% P& o" p! ~: X
  81.     tDiff = 15 - (GUI_GetTime() - tm);
    2 o' `( X& M0 K2 C/ M' ~4 R; z
  82.     GUI_Delay(tDiff);* u' L9 R$ O/ s) V; Z5 z: U+ b' R
  83.   }& }7 }/ F/ I2 o, y
  84.   for (i = 0; i < 55; i++) {
    0 Y$ R0 z) D1 `  T
  85.     tm = GUI_GetTime();; V  Z; l, t- ?& [/ [7 b
  86.     WM_MoveWindow(_hWindow1, -1, -1);
    3 D! I: O6 U4 M) L  {( Z8 g4 j8 C3 v
  87.     WM_MoveWindow(_hWindow2,  1,  1);! c4 |" F& p! R
  88.     tDiff = 15 - (GUI_GetTime() - tm);
    ( i4 _% g% t. {' h+ S1 o$ a
  89.     GUI_Delay(tDiff);
    , I; b( D% P( a! `/ o
  90.   }5 [# F8 l4 k6 r2 `" R
  91.   GUI_Delay(SPEED/3);
    7 A+ l- v6 A+ y8 Y
  92.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
    + l- P$ F! Y; R/ u
  93.   _LiftDown(40);5 m- d& S& ^+ \, p$ @$ s  P
  94.   GUI_Delay(SPEED);: h9 k+ g: r& L& R
  95. }
复制代码
这部分代码实现了两个窗口在具有重绘和不具有重绘功能时的演示。
1. 实现两个窗口向上移动。
2. 实现两个窗口向下移动。
显示效果如下:
35.2.png
35.1.3 Resize部分演示
  1. /*******************************************************************
    % }+ y* ^/ }! s5 D) \
  2. *
    4 x) V0 J" T+ o
  3. *       _DemoResizeWindow
    $ g" K% s* _* ^& A, s
  4. *& S7 _- L1 A4 ^6 y3 Y1 a7 C0 p
  5. * Function description
    1 j" i/ R( D2 A4 M
  6. *   Demonstrates the use of WM_ResizeWindow
    " k9 v4 v$ ?  K9 c
  7. */: v& u3 h# `: M" f
  8. static void _DemoResizeWindow(void) {7 p3 f0 m/ ]3 s* C3 T9 _
  9.   int i;
    1 ]+ p4 l7 {/ H  M( A# S5 A5 e, z
  10.   int tm;
    % {. \# A. b- x8 N+ }
  11.   int tDiff;
      M- s6 t3 _. ]  ]" z6 h

  12. , F7 U+ ]5 ]- w* K
  13.   _ChangeInfoText("WM_ResizeWindow()");
    " a  M, T+ ?% @: [
  14.   GUI_Delay(SPEED);
    7 K( p; Z5 l$ K- T8 a
  15.   _LiftUp(30);( O* B! }- c3 w. q8 T( |
  16.   for (i = 0; i < 20; i++) {* s# B% T+ ~) F$ z. E
  17.     tm = GUI_GetTime();
    8 P0 l  q* X* O
  18.     WM_ResizeWindow(_hWindow1,  1,  1);9 o6 p6 v8 c- r( s( j
  19.     WM_ResizeWindow(_hWindow2, -1, -1);
    - x9 z: g9 S9 r/ l
  20.     tDiff = 15 - (GUI_GetTime() - tm);
    * ^8 K9 {, {" O# U% f4 Y
  21.     GUI_Delay(tDiff);
    8 G- z5 M" C' M* w4 o  B
  22.   }. S$ C) b  J3 m3 j& S% M
  23.   for (i = 0; i < 40; i++) {
    % w3 a! ?0 t' O* p
  24.     tm = GUI_GetTime();
    , ]- }: z( Q5 ?" {& U* ]
  25.     WM_ResizeWindow(_hWindow1, -1, -1);
    - Z8 Q4 N5 e* c* f! m* p* ?* U
  26.     WM_ResizeWindow(_hWindow2,  1,  1);
    * W. X. C( `! K: B8 v
  27.     tDiff = 15 - (GUI_GetTime() - tm);& Z( P6 }1 y3 n- ^8 w" P' ?
  28.     GUI_Delay(tDiff);# V& {" t) V1 N- A& s& }
  29.   }9 Y5 G1 C9 l, ^  w4 \
  30.   for (i = 0; i < 20; i++) {
    - D* J9 N1 q. k4 i
  31.     tm = GUI_GetTime();
    , z4 N0 J1 b7 i' b3 [% S7 s& D
  32.     WM_ResizeWindow(_hWindow1,  1,  1);/ g: S& d/ K2 B* Y$ v. T& q
  33.     WM_ResizeWindow(_hWindow2, -1, -1);
    5 z" _0 B( k: z' c6 d
  34.     tDiff = 15 - (GUI_GetTime() - tm);  s' g4 K4 V7 _) U2 c
  35.     GUI_Delay(tDiff);
    " l/ v4 y$ y! X9 g% y/ I
  36.   }
    ; P# Q. h/ ^$ U* j* D
  37.   _LiftDown(30);2 e! a. `' ], A5 t5 i7 a
  38.   GUI_Delay(SPEED);  t/ z) y, I/ o' F# @
  39. }
复制代码
这部分的演示主要看放缩函数WM_ResizeWindow(),注意这个函数里面的参数是相对值。显示效果如下:
35.3.png
0 h( _1 Z# Z: o$ @9 g
赞 收藏 评论4 发布时间:2015-2-15 20:17

举报

4个回答
baiyongbin2009 回答时间:2015-2-15 20:19:36
35.2 官方WM_LateClipping.c实例
    这个Demo中涉及到了BOTTON和FrameWin的创建及其使用,如果初学的同学不理解这部分内容没有关系,后面的教程中会跟大家详细的讲解这部分知识。这里大家重点是看回调函数。Demo所在位置:
35.4.png
源代码如下:
  1. #include "GUI.h"1 p8 ^' `) W! D" C
  2. #include "WM.h"
    . C  [- ]) c0 M$ U" |8 p, o( Z
  3. #include "FRAMEWIN.h"! K# A# w$ U# I2 r5 |* b
  4. #include "BUTTON.h"1 p- C2 w5 r+ S8 R8 g9 h

  5. 6 l) U: r, g7 J, \+ Z' c$ @5 X& f
  6. /*********************************************************************' i- ~* J; I8 [: L4 s. x
  7. *, O- E% G- q( l4 ]7 G
  8. *       Static data
    $ L- Z  X  T2 x$ A, d  [
  9. *
    ( K2 z4 m$ ^% {4 |2 H
  10. **********************************************************************
    9 ^8 ?1 E/ M' y1 u6 W
  11. */
      E3 d: |: b6 O. \0 c' E- @1 {
  12. static WM_HWIN _hWin1;9 x" N+ E" ^$ i+ C0 [/ i
  13. static WM_HWIN _hWin2;
    8 Q$ H% [; }& H2 g) e
  14. static WM_HWIN _hBut1;' o) {$ A9 T; `, f9 W8 H5 D; u
  15. static WM_HWIN _hBut2;' h* {( p5 B4 z0 K7 [
  16. static int     _PaintCount1;
    ' o* z) B9 V3 T
  17. static int     _PaintCount2;3 q7 \$ P! N- s- [

  18. 9 L; y$ i5 f* g) n: X6 Q
  19. static GUI_COLOR _aColors[] = {
    ' a/ `; |2 Y7 v. b+ {1 M
  20.   0x0000FF, 0x00FF00, 0xFF0000, 0x00FFFF, 0xA000A0, 0xFFFF00- f/ u$ |, v. Z/ T
  21. };1 d- ?4 M- r+ _2 P; Q

  22. ' X* u" ~: B3 T+ i  w- `
  23. /*********************************************************************
    6 _& x4 \" z  B+ x$ b" u9 X
  24. *
    0 Z, ]+ A! g) S2 J  `! k( K
  25. *       Static code" k$ t7 M4 P% M2 H
  26. *  ^- c4 N- l# S# y  U; F
  27. **********************************************************************7 {6 _$ l- s- [
  28. */
    ' C! b' {4 H( B6 S0 v8 U% c3 `3 R
  29. /*********************************************************************9 F' W! Q+ ]" X7 v; K
  30. *; S1 N! v( _$ [" `* n+ p! D9 g' `" l
  31. *       _cbBkWin
    % }* W+ d1 ]' s6 D9 f- l
  32. */
    + p" L) k; v# l2 ]
  33. static void _cbBkWin(WM_MESSAGE* pMsg) {(1): d& z* R3 H& u' D: @* a" U
  34.   switch(pMsg->MsgId) {8 L* _* x6 W/ r
  35.   case WM_PAINT:(2)
    ) H0 V" v4 a% D3 i; [
  36.     GUI_SetBkColor(GUI_BLACK);- O$ m8 s' k$ ^/ k; J
  37.     GUI_Clear();
    ' d# C% G2 L7 y; }5 n9 a
  38.     GUI_SetColor(0x0060FF);# L# K$ n. S9 g! v7 a
  39.     GUI_DispStringAt("PaintCount (Early):", 0, 0);; X4 l$ T6 ]0 E$ V' s
  40.     GUI_DispDecAt(_PaintCount1, 120, 0, 5);8 ?2 w" y9 W  m, V$ }+ g* U
  41.     GUI_SetColor(0x00FFC0);7 \7 _6 b# q* k. X
  42.     GUI_DispStringAt("PaintCount (Late):", 0, 12);
    + f) N  A( V+ r6 {$ D" E9 O$ e6 v
  43.     GUI_DispDecAt(_PaintCount2, 120, 12, 5);
    % z& c  L' ~. ]: h, a
  44.     break;
    1 S5 H: g5 B% Z! s
  45.   case WM_NOTIFY_PARENT:
    2 f) g. i6 d, e  c0 a; ^  D$ R0 N
  46.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
    0 h$ a3 H/ k: E: n* O$ c
  47.       if (pMsg->hWinSrc == _hBut1) {(3)
    ; K  \& V& E$ t; |8 @, G8 t
  48.         WM_InvalidateWindow(_hWin1);
    3 q. f' i+ b" s
  49.         WM_InvalidateWindow(_hWin2);
    $ K) o* l% u6 [4 t6 m. P) m$ Y
  50.       } else if (pMsg->hWinSrc == _hBut2) {(4)4 q2 t5 m" Q3 d. B' p
  51.         _PaintCount1 = 0;$ x# S$ F5 {* P8 f( W
  52.         _PaintCount2 = 0;
    * Z6 b; e' \2 F7 t! }. n
  53.         WM_InvalidateWindow(pMsg->hWin);
    + _2 V! J" O- m2 I7 e3 ~$ Z
  54.       }9 ?0 O. p9 w3 ]
  55.     }- u9 P8 t7 \  q# r% B
  56.     break;! Z2 d" q( L5 k) @4 W( g% Z
  57.   default:) v) e& y. m: d4 d" d
  58.     WM_DefaultProc(pMsg);7 `2 a: |4 @/ K+ `9 l1 e( b
  59.   }
    " ^6 d8 e& L  F0 Q# Q( @) ^$ [' G
  60. }' l7 Z/ w" j) c  P  @( E; l
  61. % K6 S: {( d" s- j
  62. /*********************************************************************3 C6 ]( D& o, D
  63. *1 `. ]# d6 ^  \5 T1 T
  64. *       _cbTop
    9 Z4 w4 x2 w8 K% q. L6 W
  65. */
    / B, G7 a! ^8 c; {( |3 s; |* k
  66. static void _cbTop(WM_MESSAGE* pMsg) {(5)
    9 c% Q9 c+ o& }- n$ [: o
  67.   switch(pMsg->MsgId) {# P' [! j# i1 e
  68.   case WM_PAINT:+ K" q5 Y' U/ z
  69.     GUI_SetBkColor(GUI_MAGENTA);
    " c1 G) u& b7 f6 N/ T  e
  70.     GUI_Clear();. |0 ~& d' D- s
  71.     break;5 i4 W3 E% J: v
  72.   default:+ ^- b' `: T  }( }" k2 @7 x
  73.     WM_DefaultProc(pMsg);
    ; \, \" j3 m& ], S' F% c
  74.   }
    " Z. G" e9 M* Q/ a9 o- @
  75. }( |8 _. P) {8 S" b7 t) Z

  76. * R' E/ ~) z& Z- C7 i. C( N6 I
  77. /*********************************************************************5 t1 @5 u- [* M( S- C  m: K3 C
  78. *
    ) Q/ X* X1 G2 e8 X3 n) S
  79. *       _cbFrameWin1$ L' {& f5 \# A& `
  80. */
    - R& ^7 V/ D8 H) z
  81. static void _cbFrameWin1(WM_MESSAGE* pMsg) { (6)
    2 a( Q0 C- |/ }3 ~$ x
  82.   switch(pMsg->MsgId) {: `8 q6 `( y8 _
  83.   case WM_PAINT:/ M4 j# |2 A2 X7 X) @! N. a7 w4 N
  84.     GUI_SetBkColor(_aColors[_PaintCount1 % 6]);- U8 i' Q2 D; M; `: k! L3 P
  85.     GUI_Clear();" {$ a) Z3 [4 q6 b1 p: g
  86.     GUI_SetColor(0x0060FF);
    ; V3 V& ~9 }7 t
  87.     GUI_FillCircle(25, 25, 15);* h& a2 g( l1 p3 Y
  88.     GUI_SetColor(GUI_BLACK);
    7 n7 F( o: \4 S+ ]
  89.     GUI_DrawCircle(25, 25, 15);
    7 K$ m) M# ~, d$ z
  90.     _PaintCount1++;9 a% U0 n4 ]& c$ q- f
  91.     WM_InvalidateWindow(WM_HBKWIN);
    5 S& x( x1 ~. x* i) ]. }) z
  92.     break;* q. K% M( x0 x0 H5 s5 |
  93.   default:8 s. y4 F: |; {6 n, A7 C1 a
  94.     WM_DefaultProc(pMsg);& a; r( V. y2 O4 ^
  95.   }& h, w8 g5 f& X9 U
  96. }0 o) j1 B: M4 \. i( U6 {
  97. 3 P, `& X' B8 R' |1 Z* P: j
  98. /*********************************************************************
    3 Z5 T$ {- [$ P4 e6 t, E
  99. *  j  l2 w& B2 F! \2 c5 X  u4 [6 H1 C
  100. *       _cbFrameWin28 M- H4 c, ^3 s
  101. */
    + R1 d% C; ^2 D7 E5 Z$ O, r2 N
  102. static void _cbFrameWin2(WM_MESSAGE* pMsg) {(7): h  i8 c8 ]5 x! C! o! j
  103.   switch(pMsg->MsgId) {' i* T7 J  P8 s2 X7 u1 n
  104.   case WM_PAINT:
    % X: ?2 Z8 v; T7 Y  M1 [* N
  105.     GUI_SetBkColor(_aColors[_PaintCount2 % 6]);( g* h# `5 K5 v% d- T3 ?; j! n
  106.     GUI_Clear();
    0 {% o! O" n0 l
  107.     GUI_SetColor(0x00FFC0);+ J1 _4 b1 Z0 W& [5 F6 z% t
  108.     GUI_FillCircle(25, 25, 15);
    ( m  Q1 R# F) ]+ }
  109.     GUI_SetColor(GUI_BLACK);0 H/ c; `; I  p4 k, o8 t
  110.     GUI_DrawCircle(25, 25, 15);9 V" \) ?7 h/ ~
  111.     _PaintCount2++;
    " N; z/ i+ n, m) b- \9 Y
  112.     WM_InvalidateWindow(WM_HBKWIN);
    ; s# g, f  s" `4 E; A7 Y( t4 Y: {
  113.     break;
    & O& [$ ]" _0 @. V8 N* Z) u
  114.   default:
    - \6 w# }( O; K0 C" L
  115.     WM_DefaultProc(pMsg);
    8 x: V( N) i  _3 y* i  }
  116.   }1 ~* i1 i0 T. W9 D3 L
  117. }2 G. b" M  m" l2 C7 \0 t

  118. ) {/ H' N, {' F/ e4 c/ O4 D5 |
  119. /*********************************************************************
    * W/ L0 ~* v3 O2 z2 ]; T8 [5 c
  120. *
    * v3 ^- T* W: P" O6 J/ R7 O" U# X
  121. *       _ShowDemo+ l& _! b$ c  T2 x& P4 [2 r3 `
  122. */4 \; K# L* f# z6 j+ C
  123. static void _ShowDemo(void) {
      ]! h; w2 w7 |: A! x! q5 N" z
  124.   WM_HWIN hWin0;" g4 z( T8 i" l+ [
  125.   WM_HWIN hWin1;1 ?, t5 q7 z( P' H* R3 M6 o
  126.   WM_HWIN hWin2;/ w) E0 U. v6 E1 q" s7 m+ g* c
  127.   WM_HWIN hFrame1;
    7 b: }% r6 s6 A$ Y/ e& h
  128.   WM_HWIN hFrame2;/ G2 r; b5 _3 O6 V$ d
  129.   WM_HWIN hClient1;- M( Y( T9 E( x" x4 N
  130.   WM_HWIN hClient2;
    % z9 W9 J8 y, G1 R& {. \
  131. " b& |. I, a+ k+ R$ i
  132.   WM_SetCallback(WM_HBKWIN, _cbBkWin);(8)7 a9 l) e* g) f3 R; W# V: B
  133.   hFrame1  = FRAMEWIN_CreateEx( 10, 30, 140, 140, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Early Clipping", _cbFrameWin1);) H2 p' S/ E7 d) L8 F
  134.   hFrame2  = FRAMEWIN_CreateEx(170, 30, 140, 140, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Late Clipping", _cbFrameWin2);
    7 v0 ]+ u) U/ L/ s+ y4 `
  135.   hClient1 = WM_GetClientWindow(hFrame1);' D' v9 y" U1 d9 T- k* [# x7 D
  136.   hClient2 = WM_GetClientWindow(hFrame2);
    , V  Y' w! A/ J. k+ h+ x$ }
  137.   _hWin1   = WM_CreateWindowAsChild(0, 0, WM_GetWindowSizeX(hClient1), WM_GetWindowSizeY(hClient1), hClient1, WM_CF_SHOW, _cbFrameWin1, 0);
    ' `) M4 G1 u  N  S
  138.   _hWin2   = WM_CreateWindowAsChild(0, 0, WM_GetWindowSizeX(hClient2), WM_GetWindowSizeY(hClient2), hClient2, WM_CF_SHOW | WM_CF_LATE_CLIP, _cbFrameWin2, 0);
    , }  @" k- p3 `6 |
  139.   _hBut1   = BUTTON_CreateEx( 10, 210, 140, 20, 0, WM_CF_SHOW, 0, 1);
    ; d" u+ v% \0 ~& A: a
  140.   _hBut2   = BUTTON_CreateEx(170, 210, 140, 20, 0, WM_CF_SHOW, 0, 2);& Q$ o8 ~2 {' e3 I
  141.   hWin0    = FRAMEWIN_CreateEx( 60,  80, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 0", _cbTop);2 X# N: j' ?3 c$ h( ^3 Y5 P
  142.   hWin1    = FRAMEWIN_CreateEx(220,  80, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 1", _cbTop);# X3 p! c- s( j+ i4 ]; \
  143.   hWin2    = FRAMEWIN_CreateEx(140, 170, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 2", _cbTop);4 a" [. c3 N2 e, O7 i  \; i8 M
  144.   FRAMEWIN_SetResizeable(hWin0, 1);# T6 R: t4 {$ R& ~( C
  145.   FRAMEWIN_SetResizeable(hWin1, 1);3 y0 c; J# y7 J% g+ u8 h
  146.   FRAMEWIN_SetResizeable(hWin2, 1);
    ! ^! }$ ~  ?  b8 |0 @0 S2 l
  147.   BUTTON_SetText(_hBut1, "Invalidate");
      j! {* c" Q' H. f5 w* S
  148.   BUTTON_SetText(_hBut2, "Reset counters");
    + f! J9 V) G- e0 y3 i
  149.   while(1) {% \4 h. E; G; }0 N! h+ t
  150.     GUI_Delay(50);
    ( h7 V) P' ~+ ?/ A8 \# k) x
  151.   }7 |( I2 @7 C! Z! [! j" P. ]
  152. }
    ( S6 {9 E$ l- L

  153. # B: c- ]3 K- |3 f( p
  154. /*********************************************************************9 c" _# O4 g3 A. N$ d' @
  155. *: [/ r/ }8 @2 y1 M
  156. *       Public code. P' E3 h: H5 X4 P
  157. *
    # }: V& E' n. R: o- G9 F
  158. **********************************************************************
    ) |8 ~6 }- h; p7 |
  159. */
    8 y% ?; d8 h9 h; M1 b, Z9 a
  160. /*********************************************************************
    0 X5 \! J  d) ?" A0 P5 D
  161. *
    ' Z$ j6 |; d/ X7 v2 M
  162. *       MainTask, B4 W+ ?" U$ Y# h: Y# i! u; }- |& H
  163. */7 y/ \( }+ T6 I/ _3 N
  164. void MainTask(void) {
    " M1 V  Y1 X; F/ f; J
  165.   GUI_Init();& ]( s: ]. G3 Z8 u
  166.   while(1) {
    * M% L1 J* B. v7 e3 x0 t
  167.     _ShowDemo();) \& `. i* w1 _. t) a$ \+ ]
  168.   }5 e$ `2 s  b7 N; ?- E2 n
  169. }
复制代码
1. 桌面窗口回调函数。
2. 回调函数中重绘部分的代码。
3. 由于两个按钮是创建在桌面窗口上面的,所以按钮的WM_NOTIFICATION_RELEASED(通知代码消息类型)是在桌面窗口的回调函数中。这个按钮按下后将_hWin1和_hWin2无效。从而会执行这两个窗口的背景重绘功能。
4. 同上,只不过这里实现的功能是将两个计数值清零,并使桌面窗口无效,从而执行桌面窗口的重绘消息。
5. 这个是hWin0,hWin1,hWin2的回调函数。
6. 这个是hFrame1的回调函数。回调函数中主要实现了重绘消息。重绘消息中记录了重绘的次数,并根据重绘次数修改背景颜色。
7. 这个是hFrame2的回调函数。回调函数中主要实现了重绘消息。重绘消息中记录了重绘的次数,并根据重绘次数修改背景颜色。
8. (1) 先创建两个FrameWin
    (2) 分别在这两个FrameWin中创建两个子窗口。
    (3) 创建两个按钮。
    (4) 创建三个FrameWin。
9. 这个Demo还有一个控件剪切问题,后面会专门抽一期教程专门跟大家讲解这个。
这个例子对于研究回调函数函数还是非常好的,大家可以在这个例子的基础上做一些修改,实现一些功能,这个Demo的显示效果如下:
35.5.png

( q5 R  G9 B. Q# [2 z- K; |
baiyongbin2009 回答时间:2015-2-15 20:21:22
35.3 官方WM_Video.c实例
    这个例子所在位置:
35.6.png
源代码如下:
  1. #include <stddef.h>
    / g# ~7 N' I+ r7 O! L
  2. #include <stdio.h>% F) g) K- m' \5 ^
  3. + E& C+ r, R0 y
  4. #include "WM.h"
    3 x- I: g# b  @8 R" R) p/ V
  5. #include "GUI.h", b5 F5 l* k0 U6 J
  6. #include "FRAMEWIN.h"" [! j. k! P4 G' T: m) z% C
  7. #include "BUTTON.h"
    8 X, C0 g3 e# i, M7 U: H
  8. #include "TEXT.h") q. L- y3 L) T9 k

  9. 1 g4 @% U0 r- v9 S, Q7 F
  10. static void _cbFrameWinTest(WM_MESSAGE * pMsg);; B% m# }8 O8 D/ b6 y

  11. 2 _; _9 d* V! w5 j9 ^/ R$ q  g, V
  12. /*********************************************************************7 Z& m5 O' `' _0 q+ @1 c
  13. *
    # s3 P. Y  @- K& _+ t9 k
  14. *       Defines
    5 @% B: J5 q# I% K: h
  15. *1 n+ J0 {; g& t& e
  16. **********************************************************************2 x7 W$ v3 u8 l1 u5 h* A
  17. */+ w% [+ Y8 A8 k2 w6 o% z5 k
  18. #define MAX_WINDOWS   50- r( E' Z/ c; R1 v

  19. " W6 W( o! b  D9 z+ L( z4 K
  20. /*********************************************************************$ }# d9 Z- T- f
  21. *" y# r* y# I; p7 M2 C3 W! |& K1 `
  22. *       Static data2 [7 d. I: E9 r2 V+ `) f6 M
  23. *
    # n2 J5 C$ h/ h( m, M; {" x* O
  24. **********************************************************************5 X& R7 k$ L" w5 W: N! [$ X. Q
  25. */
    + s; n0 _% F; n7 q' Q$ Q5 {  g' J7 o

  26. 2 ^3 W) a9 F6 b) b0 v0 s- N- q
  27. static WM_HWIN _ahWin[MAX_WINDOWS];7 y+ X5 m3 v& }. v) p/ f, ~
  28. static char    _IsCompletelyVis;8 a) y/ f! n: q

  29. ; Z4 ~5 {: Y, @. B- O: ^6 ~, |/ O
  30. /*********************************************************************) n4 V( Q9 {4 ?
  31. *4 T, [/ |: O2 p4 z8 y
  32. *       Static code
    0 R) V4 n; A# V% ?) k1 \
  33. *% m) d1 p5 g; a! @' d
  34. **********************************************************************
    6 ]" P% W: ]9 N0 U
  35. */
    4 ]' m* T% w1 Z/ H# s9 \
  36. /*********************************************************************; Y# N& M* p. `( I5 |7 H- M
  37. *3 y" Y$ w+ s/ q, I. H' }* _; R
  38. *       _CreateWindow
    6 I. o6 M3 i) \- K9 ^4 k
  39. */
    # g0 f, {, R3 q9 ~
  40. static void _CreateWindow(void) { (1)
    + p" B- a4 @" Y! @! H
  41.   unsigned i;
    ! I+ x+ ^4 X  H/ `! d+ x5 \. I
  42.   WM_HWIN  hWin;
    - g' ?% d! t2 ~) g8 I6 `- s
  43.   char     ac[32];
    / }- s" \9 w1 I* z5 i3 C
  44.   int      j;% d* a$ w( P; W$ X# g) {7 K" |

  45. . j; H4 j  ]% ~& r0 W* C
  46.   for (i = 0; i < MAX_WINDOWS; i++) {
    " U2 M" t2 Y, [, X" z9 q# U1 j6 a+ p
  47.     if (_ahWin[i] == 0) {
    2 p$ q! c  K3 }: h7 }: |6 ~  g3 T" o
  48.       j = i + 1;
    9 f# o& [+ o; n* l% M
  49.       sprintf(ac, "Test window %d", j);% h! `& Z1 s8 B9 Q8 ?
  50.       hWin = FRAMEWIN_CreateEx(5 + 10 * i, 135 + 10 * i, 120, 60, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, ac, _cbFrameWinTest);
    3 |: i3 x* n5 S4 r: g3 @8 F0 i
  51.       FRAMEWIN_SetClientColor(hWin, GUI_INVALID_COLOR);
    + X# n7 h+ u8 y
  52.       _ahWin[i] = hWin;
    ( Q$ o; M4 P) E
  53.       break;
    % h' i6 d: e' G" F5 W, S8 J1 O& {0 C
  54.     }
    ( E8 h+ b  _$ d1 o/ I' B
  55.   }5 e+ Y/ O1 V* X" E. g8 o! h
  56. }" L5 B* ~/ `9 z0 v6 m% k  v; l0 Q4 J; B
  57. 6 T3 j3 B/ i: [
  58. /*********************************************************************+ ~$ K2 v1 j# f
  59. *
    2 o9 [& `4 B5 q, X! c5 h
  60. *       _DeleteWindow
    ; F, u! b+ p" `) F" h
  61. */  Z5 B5 ]& v8 p/ U' ^, v
  62. static void _DeleteWindow(void) { (2)
    6 Q5 ?* u3 S/ W+ i' W9 j
  63.   unsigned i;
    - z) G" q% k9 T& L& X; c
  64. + D/ \( W: ?9 m5 f+ N
  65.   for (i = 0; i < MAX_WINDOWS; i++) {5 V1 k( }$ r  I1 e
  66.     if (WM_IsVisible(_ahWin[i])) {
    7 }1 h" O# }; ]" Z, V7 d3 {" y
  67.       WM_DeleteWindow(_ahWin[i]);, \  J# ~1 A: J, Q; Y- d( }; e
  68.       _ahWin[i] = 0;
    * ], A# p+ P6 {. q; e! n
  69.       break;
    * o$ K: e: [5 v, ~, x
  70.     }6 g% t' o0 F$ `  A2 Z3 K8 u0 n
  71.   }
    8 P6 U, w4 S* \$ ]3 w  G
  72. }
    5 i% A! {7 e% L: v4 k6 e# L
  73. # ~: ^/ Q9 v; Z& m9 I
  74. /*********************************************************************
    3 _0 j( [1 M% R) Z2 l# m
  75. *
    1 O. g% m+ U+ g# r& @+ ?
  76. *       _ShowWindow0 ~+ i/ a% _/ `9 d# j
  77. */
    2 H' r" A" [* y" z
  78. static void _ShowWindow(void) {     (3)! E+ \( b4 B  j# N3 ~, ~
  79.   unsigned i;
    ; B0 b( B7 W: A1 P8 D0 _- ~
  80. * l4 n9 @9 {/ \
  81.   for (i = 0; i < MAX_WINDOWS; i++) {/ O- [' |* W4 ^4 k3 Y
  82.     if (_ahWin[i] != 0) {
    9 J) [& l* S+ |
  83.       if (WM_IsVisible(_ahWin[i]) == 0) {* p0 R- d3 `: i5 o, T
  84.         WM_ShowWindow(_ahWin[i]);
    & u- U1 |( l7 P6 {9 b+ N0 I
  85.         break;, c# l( y. \" {6 D' X7 g
  86.       }
    # C# x( K5 b+ B) Y( t
  87.     }) a4 f* S7 H, r: U/ i  l1 z+ s3 G7 T0 E
  88.   }9 y$ e! B( Z3 d+ e+ V# f. T
  89. }* D# @: c; R+ v- w* L

  90. - G/ }2 A+ R0 h. s" @0 |3 F
  91. /*********************************************************************, Q/ x. c. i% D
  92. *
    1 A' p! V, B' X& n
  93. *       _HideWindow$ O2 T2 N9 _" {9 @3 i2 T# t
  94. */3 Y) M- Z" j; n/ ]. A5 |9 C* Z
  95. static void _HideWindow(void) {(4)
    * f9 N9 ~: f; f5 E6 M
  96.   unsigned i;7 {  I. {. Q0 ^0 \7 E7 }9 `

  97. 0 N2 M% ~7 N' o; T0 |
  98.   for (i = 0; i < MAX_WINDOWS; i++) {9 C' H% ~  p$ d2 Y  z- U
  99.     if (WM_IsVisible(_ahWin[i])) {4 T. {0 t3 x3 Y
  100.       WM_HideWindow(_ahWin[i]);
    3 E9 y) `3 I1 s; Y& ]7 }1 R, y
  101.       break;2 E2 C" _/ _- w- G
  102.     }
    0 z* @7 k6 y. v; S5 _2 [2 F. }
  103.   }
    : P3 c# K4 s8 a8 J0 T+ Q- a& Z: H
  104. }& u  o  P" X( t  W; j, v3 Y2 r- }( J- K
  105. ! t. z4 }' c  h
  106. /********************************************************************** V# K+ o% `4 N3 j2 Y* T
  107. *
    0 a# _: O2 B0 b8 B9 Q5 ?8 Y
  108. *       Static code, callbacks8 ]; F! X2 t- ~
  109. *
    : z2 G4 u" p$ S; k6 s
  110. **********************************************************************: Z7 Z/ W) D7 ]
  111. */3 ^4 L& ^: o: c0 l" {/ l
  112. /*********************************************************************6 ?" J0 E, k( m5 S+ i8 R
  113. *
    $ d: I) z  q5 ^5 J
  114. *       _cbBkWin4 ^1 a6 v& g; X! Z
  115. */9 ?& F# y" ~' z; h  }  g
  116. static void _cbBkWin(WM_MESSAGE* pMsg) {   (5)' m% @9 }8 k, G0 W
  117.   int Id;3 g0 R4 m% P% x& K% U% }1 O% a% N' y

  118. : }2 M8 P6 S7 D. [# k6 o. }
  119.   switch (pMsg->MsgId) {
    $ K0 |6 _( v0 S7 x
  120.   case WM_PAINT:
    ' N# e2 q5 K8 Q# M+ m
  121.     GUI_SetBkColor(GUI_BLACK);
    - C9 q( c( ^4 z+ P+ r2 a
  122.     GUI_Clear();
    ( \  W3 D9 z% Y) h4 O
  123.     break;
    7 _% s0 ]0 O, v5 i6 t
  124.   case WM_NOTIFY_PARENT:
    . W- y, w* B$ V
  125.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {! N) \9 L/ C( Z; w: b
  126.       Id = WM_GetId(pMsg->hWinSrc);
    : O6 N& w! s5 x' y2 l" w, O3 a: b
  127.       switch (Id) {1 w4 K6 L" H, c/ S# z! t! V+ o9 @
  128.       case GUI_ID_BUTTON0:3 y9 e: C* i8 w7 P7 ]" J
  129.         _CreateWindow();. q# i2 g8 p7 |0 H) ]+ `; e
  130.         break;
    " R8 x% m0 F6 w' `; A
  131.       case GUI_ID_BUTTON1:" Z3 o( c1 e) N1 e
  132.         _DeleteWindow();# R7 K& Z1 `5 @0 T6 D8 b3 D# K0 U
  133.         break;4 f! q8 F2 t  r! A8 L
  134.       case GUI_ID_BUTTON2:1 }* A0 U7 b6 d
  135.         _ShowWindow();
    ( k% q% A/ Q- h3 [8 t( g
  136.         break;0 O% p) N; b# J0 L% D/ N
  137.       case GUI_ID_BUTTON3:
    & I% {" s) I1 x9 T6 Z2 Z
  138.         _HideWindow();$ f, y/ u+ l5 B
  139.         break;
    1 {. z9 r. E* B
  140.       }
    4 I$ W/ _$ n. r7 u5 y
  141.     }
    : x+ F( o. ]" P6 P, p/ p: `
  142.     break;
    * I  \2 N: \2 @( A) w
  143.   default:5 q0 P8 g3 K& W4 Q7 W
  144.     WM_DefaultProc(pMsg);
    : F' f* k; E+ p2 k4 O. ^
  145.   }" I% g2 ~2 F; t4 {" [! c4 ?9 ~
  146. }
    6 c/ r1 i- h; T2 F
  147. 8 z+ t! c$ G  ~
  148. /*********************************************************************$ m: {5 ?3 k) R" Y( Y' J, \* r5 u
  149. *. D% t, [5 o3 p
  150. *       _cbFrameWinVideo
    & E+ Y  B; H2 y) V( i% d
  151. */
    4 w, B2 c! {" m/ |7 M& m( C, V
  152. static void _cbFrameWinVideo(WM_MESSAGE* pMsg) {(6)
    , Y/ T4 ]1 E3 R2 d
  153.   WM_HWIN hWin;
    : z$ s" @) b# B- Y9 @* P$ `1 @
  154.   WM_HWIN hText;2 J+ H+ Q  Y* V4 W+ X
  155.   int     IsCompletelyVis;
    3 O3 _3 a' W0 u0 C6 w2 [, V
  156.   int     IsCompletelyCovered;
    3 ~; n' ^4 F5 n8 P

  157. 1 t4 h  ~+ D1 T6 p6 J
  158.   switch (pMsg->MsgId) {
    0 q7 q/ f; Z& P% c6 W1 @, r
  159.   case WM_PAINT:
    ! j# Q& x2 z$ {+ ]5 b9 F* |
  160.     if (_IsCompletelyVis) {
    9 r3 N0 N$ k! E9 W
  161.       GUI_SetBkColor(GUI_DARKGREEN);
    7 {/ f7 x' J% ^4 u4 s4 \
  162.       GUI_Clear();2 g7 i, X. T7 y9 E4 v5 }" p
  163.       GUI_SetColor(GUI_WHITE);
    5 B  a0 E0 ?& c
  164.       GUI_DispStringAt("Completely visible", 5, 5);% g+ _- ^& n2 B5 p+ V( s& Q
  165.     } else {
    : e4 O0 k  o* i% m" P
  166.       GUI_SetBkColor(GUI_GRAY);
    # {) S& E+ X" j* h
  167.       GUI_Clear();
    3 E, X' H" b8 Q0 Y1 y  O
  168.       GUI_SetColor(GUI_WHITE);
    & `" Y( v: T) t% a6 J2 o
  169.       GUI_DispStringAt("Not completely visible", 5, 5);
    0 t6 E0 h$ ~$ e7 f# I5 @
  170.     }+ A# c# C9 F  z  ~1 Y* g4 O
  171.     break;
    0 g3 ]+ t1 _- V
  172.   case WM_NOTIFY_VIS_CHANGED:, {8 o; U  _6 F( N. |7 ?6 g2 J
  173.     hText = WM_GetDialogItem(WM_HBKWIN, GUI_ID_TEXT1);; \) i# U: F# @" M+ [" @: e+ S/ e: c
  174.     hWin  = WM_GetClientWindow(pMsg->hWin);2 Q8 Q4 m# ?0 n  M
  175.     IsCompletelyVis     = WM_IsCompletelyVisible(hWin);3 }% v# ]: |" n! l1 S
  176.     IsCompletelyCovered = WM_IsCompletelyCovered(hWin);
    7 Y2 r2 A3 k; G  E0 ~6 r5 h/ s
  177.     if (IsCompletelyCovered) {* _. ^) j9 M0 r  ^7 H& e
  178.       TEXT_SetText(hText, "completely\ncovered");; B, H0 ?( u" h
  179.     } else {3 \4 Z! i+ E0 Y4 o
  180.       TEXT_SetText(hText, "not completely\ncovered");
    $ m$ t- A, D) o
  181.     }4 x, b3 V, @+ d2 b
  182.     if (_IsCompletelyVis != IsCompletelyVis) {% B  i, Z/ h& P  v- q
  183.       _IsCompletelyVis = IsCompletelyVis;* O2 l8 e5 d/ G3 P2 {  D& ~
  184.       WM_InvalidateWindow(hWin);    /* Only required if content changes if partially hidden */, {$ |7 m. s' T  p) y: Q& p7 Z5 W% z
  185.     }
    3 h( [7 S+ M/ p* |  i( ^7 g1 Z
  186.     break;
    & B, D8 O0 g5 \; f. Z1 |! i; c7 U
  187.   default:$ n! e( V$ d7 H7 l0 J6 i
  188.     WM_DefaultProc(pMsg);
    ) c& C# S- U# `' V' Y8 P- k1 n
  189.   }
    . Z& d" ]$ H1 |4 m6 p
  190. }
    " u8 V: n5 y' @! |6 t* j: ~

  191. & T# I& p0 H. _2 v3 V% Q
  192. /*********************************************************************
    9 r$ n. N/ v" `0 c# T
  193. *, r8 S: s% @( M# J# `
  194. *       _cbFrameWinTest
    : y/ z5 Q; \0 _) P
  195. */) }6 H& O" A" U+ G7 M
  196. static void _cbFrameWinTest(WM_MESSAGE* pMsg) {(7)
    " e) I2 Y# Q9 Z% N" k- T& i* D8 a
  197.   switch (pMsg->MsgId) {3 j6 e: X' ]3 a8 ~4 t3 s
  198.   case WM_PAINT:/ E7 G5 L' I" \3 s9 \7 W
  199.     GUI_SetBkColor(GUI_DARKRED);
    9 v5 ]# w9 ^8 w
  200.     GUI_Clear();
    # P: j# W0 z, H3 ^
  201.     break;5 x& Q( O& \4 B3 j1 i  o
  202.   default:- E7 t  a, h! ?" S* k2 S' q' ~  z# Q
  203.     WM_DefaultProc(pMsg);: r) p3 Q; m3 {# S! w1 n. ?
  204.   }
    ( \5 |: H9 v% X( j1 w
  205. }' b( R/ H7 W8 N! `" R. J0 R

  206. 7 A, Z$ D0 Z* E6 D/ Z! b
  207. /*********************************************************************
    " S4 s! i3 ^7 T3 t" ~; q
  208. *7 S! F0 W; t7 u1 C/ f0 p# u7 B
  209. *       Public code0 ~% C5 c8 y9 n" A+ {# Q
  210. *
    0 W( l( K; r% |$ n
  211. **********************************************************************, @$ Y; x  _8 Z9 \. {5 R4 ~: ^/ h5 K
  212. */7 v7 D$ i2 s3 L' I( u
  213. /*********************************************************************
    " J8 G6 R3 H6 j( ?
  214. *
    * e* ^) E2 m! x! q5 C9 O" w
  215. *       MainTask$ F- p+ B* z/ S2 s
  216. */
    " {, {8 S4 T3 i0 W3 N
  217. void MainTask(void) {
    ) j0 V$ O8 g5 o
  218.   FRAMEWIN_Handle hWinVideo;
    4 k2 A) e( \9 j; ^! Q) ]
  219.   BUTTON_Handle   hBut;
    3 v* e; p. H; E. x8 Q# w
  220.   WM_HWIN         hText;( Y& O4 e% }/ i0 f
  221. % A; @6 f0 c1 @' ~
  222.   GUI_Init();(8); f0 {& `) X$ G$ b  P
  223.   WM_SetCallback(WM_HBKWIN, _cbBkWin);
    4 m+ h4 c) D7 G2 R5 Q7 q2 Y
  224.   hText = TEXT_CreateEx(240,  85, 80, 26, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_TEXT0, "The client\nwindow is");
    / i' f* \0 I6 x. c$ B" V$ m
  225.   TEXT_SetTextColor(hText, GUI_WHITE);
    6 k3 T7 M  X+ @0 s3 X! }+ s% ?
  226.   hText = TEXT_CreateEx(240, 111, 80, 26, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_TEXT1, NULL);
    ) z3 W+ |" f& `$ L1 q! H
  227.   TEXT_SetTextColor(hText, GUI_WHITE);
    5 l5 p4 |% p! f/ O
  228.   //- C1 T$ j/ m: L$ |, \
  229.   // Create buttons
    7 u0 q# c  Y( }6 g
  230.   //
    / e/ J( Z9 [* C, F0 r9 f
  231.   hBut = BUTTON_CreateEx(240,  5, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON0);2 o) O) n0 q# a  B0 J$ T- m
  232.   BUTTON_SetText(hBut, "Create win");$ ]3 Y) U% W* `0 U
  233.   hBut = BUTTON_CreateEx(240, 25, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON1);
    $ e9 P0 Z1 l6 U) d8 Y
  234.   BUTTON_SetText(hBut, "Delete win");# X0 @2 G9 c9 O7 {5 h
  235.   hBut = BUTTON_CreateEx(240, 45, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON2);
    , x- S! x# R1 I( ~6 O
  236.   BUTTON_SetText(hBut, "Show win");+ j' p6 ~/ R7 G7 i% Q
  237.   hBut = BUTTON_CreateEx(240, 65, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON3);& u1 U+ n' f' R: _; m
  238.   BUTTON_SetText(hBut, "Hide win");
    ; v; c& h0 Q; G  A# g( b
  239.   //% H, s  x! P7 R4 c
  240.   // Create framewin video" t! ^; ~5 B7 l
  241.   //  . d) h) ?4 d( h6 u4 c, Z
  242.   hWinVideo = FRAMEWIN_CreateEx(5, 5, 170, 120, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Video window", _cbFrameWinVideo);. w) b# ^% f5 d
  243.   FRAMEWIN_SetClientColor(hWinVideo, GUI_INVALID_COLOR);
    & u* ?1 I, y2 G) }, V) j
  244.   //
    ; B# _! ]# B/ S5 T: ~  f+ k4 ^
  245.   // Create test windows4 T& S" H! F$ c( s  J- v8 B& k
  246.   //
    $ G: V; ^: Z* l1 N3 \( R
  247.   _CreateWindow();
    + n2 T/ j7 E* d  M. Q
  248.   _CreateWindow();( x( Q8 W# X- v  `% c
  249.   _CreateWindow();7 y& R4 v" _/ ^6 f4 p
  250.   while (1) {
    5 Z3 p! D3 I. X4 U
  251.     GUI_Delay(1000);
    , M. }9 p8 }- G/ q$ w3 ~
  252.   }
    * p) {( s/ H* s
  253. }
复制代码
1. 创建FrameWin。
2. 删除FrameWin。
3. 显示FrameWin。
4. 隐藏FrameWin。
5. 桌面窗口回调函数,主要看WM_NOTIFY_PARENT消息,进入后再分为4个button的消息。
6. FrameVideo的回调函数。
7. FrameWinTest的回调函数。
8. (1)创建两个文本控件。
    (2)创建四个按钮,分别实现创建,删除,显示和隐藏窗口。
    (3)创建FrameWin。
这个例子相对要简单很多,下面是这个例子的实际显示效果:
35.7.png
35.4 总结
    本期教程就跟大家讲这么多,希望通过本期教程让大家对窗口管理器有更好的认识,不过还需要大家在模拟器或者开发板上面多做这方面的练习。

+ L3 A# U- Z# T2 f8 [. Y
lkl0305 回答时间:2015-2-15 21:34:43
多谢分享!!
麟狮蕟 回答时间:2015-2-15 22:00:56
。,。。。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版