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

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

[复制链接]
baiyongbin2009 发布时间:2015-2-14 20:12
特别说明:完整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 用户自定义消息类型实例
    这里用上期教程所介绍的自定义消息类型做一个实例。代码跟上期教程的三个实例类似。实现源码如下(可以直接将代码复制到模拟器或者开发板上面运行)。
  1. #include <stddef.h>3 c2 K1 ?& F* k
  2. #include "GUI.h": y" q' v, N- f4 y8 j  p
  3. #include "DIALOG.h"
    - a' y9 I$ p- v  S

  4. 7 [  v7 r% L# `( D) u8 c; W! _
  5. #include "WM.h"8 P+ }( N4 }3 H) Y5 z7 c! }! t2 ~
  6. #include "BUTTON.h"  o! T  i* x( m+ ?7 U! c5 N
  7. #include "CHECKBOX.h"% |, K- X/ c+ }2 j. u
  8. #include "DROPDOWN.h"* d1 e& x/ J7 O' k: m
  9. #include "EDIT.h"
    2 ^/ q, l8 T/ Z: e/ l
  10. #include "FRAMEWIN.h"' i! _/ W' r$ C% Q7 v% S
  11. #include "LISTBOX.h"
    % }& a3 r. G* {# `
  12. #include "MULTIEDIT.h": s7 S6 S7 e$ Y7 A$ I) W' h8 m
  13. #include "RADIO.h"/ I- n: D/ j8 @5 X2 d
  14. #include "SLIDER.h"; U7 [. H: r$ P) n
  15. #include "TEXT.h"
    ( y2 ?* I7 k/ v
  16. #include "PROGBAR.h"& n. b6 V8 U. }7 f
  17. #include "SCROLLBAR.h"
    , N& E+ r% K: c4 H8 g
  18. #include "LISTVIEW.h"" w, }+ F' D' S. Y2 `* c" l
  19. 8 @6 }; U5 w* ~; F: Y' \" ?3 v1 x

  20. * q% k$ Q0 E" Z& t
  21. #define WM_UPDATE  WM_USER + 1(1)
    + Y: C  {' d: D
  22. /*********************************************************************5 f1 @, C/ E& F
  23. *( d: [8 U# e$ i8 V% @& C& N' {
  24. *       static data" I4 d/ W4 k/ t. x- s; ~
  25. *
    5 x7 F  u: K$ v* B3 h4 F+ A3 b* [: x
  26. **********************************************************************2 t# Y( K5 x- w& k
  27. */  u5 I$ |" R4 G, ?' b
  28. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};) E3 I+ B7 D5 k9 d
  29. static  char ucBackColor;
    7 X# d$ `- A. r$ v& |

  30. $ [4 ]  |9 K+ d* B) b) s  [7 L
  31. 1 P+ x4 o) Q' s6 n$ I3 T1 e
  32. $ `+ y4 W: a# |$ I
  33. /*********************************************************************
    , t4 B/ y+ [! A2 [! Z/ ^
  34. *
    ' I! r: x# a: A; D2 i0 M* U, n
  35. *       Dialog resource2 w) v" ^& n0 V* E. o. I
  36. *
    & b+ q: f% s" z
  37. * This table conatins the info required to create the dialog.
    ; H' m, I( G/ k3 Q: a/ n7 ?
  38. * It has been created by ucGUIbuilder.# q* _+ Q5 w. y( Z3 U* s9 w
  39. */5 W/ z) e$ Z1 ], l% |
  40. : T5 v, e! V, V9 m5 a/ V1 h
  41. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {9 H1 T) N! K: R0 M/ S) q# D
  42.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
    2 g2 d( j5 M- Y
  43.     { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          82, 122,162,37, 0,0},+ h* \- K  Y8 K6 A% N, H; w7 b
  44.     { BUTTON_CreateIndirect,    "BUTTON1",           GUI_ID_BUTTON1,          357,123,152,35, 0,0}
    ( y9 f4 Y+ k7 P
  45. };8 m  F9 r$ `0 z& O; r0 _1 E1 h" m

  46. 1 T' u/ I* U$ `5 h) H6 i2 O4 u
  47. /*****************************************************************
    : o8 V  K* d1 N* u- Y; }
  48. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)) ^% G2 }+ k- y! T5 S" V
  49. **      Function: to initialize the Dialog items
    2 J% a8 i) {' B  _: G" T
  50. **                                                      
    3 J  d. ?, ^% {3 G  ?6 {
  51. **      call this function in _cbCallback --> WM_PAINT1 V  q& ~! {$ W& v7 B3 O9 r
  52. *****************************************************************/- h* s. y; @8 V/ ~9 a8 \

  53. 2 y2 H+ |  A3 l9 c8 I- V
  54. void PaintDialog(WM_MESSAGE * pMsg): W, @( d+ y& d4 g9 |# e+ s0 w" L
  55. {- l" Z  H# z  ?+ O, Z4 A. ~! L/ e
  56.     WM_HWIN hWin = pMsg->hWin;: a" G3 G3 H* B/ C0 ^5 ]
  57. GUI_SetBkColor(_acColor[ucBackColor]);5 i) l% J+ j- q. ^4 X
  58. GUI_Clear();  W6 r% W- t& U. N+ s
  59. }
    4 Q8 f7 w  Z4 I1 _2 B$ V& k5 l$ ^

  60. : q+ e* c3 ~+ `( c  m3 u( `6 |4 P, t
  61. /*****************************************************************" _: X3 }6 d& |8 M6 {
  62. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)9 i& j: ?% R2 X+ i2 l
  63. **      Function: to initialize the Dialog items
    ) f$ ?# u' g% @# Y! @( @- Q2 A
  64. **                                                      
    " ?, G' r6 S5 B# ~
  65. **      call this function in _cbCallback --> WM_INIT_DIALOG
    ! t& y  H$ `, r6 o% F
  66. *****************************************************************/
    ( D& Q- `7 J. p8 r; V& E
  67. # B+ p: |5 U: R5 W  n0 g2 q( W
  68. void InitDialog(WM_MESSAGE * pMsg)$ I8 T! @9 L9 P9 `4 h5 ]; ?
  69. {
    ( ~* b1 m5 W% H  w) R3 a
  70.     WM_HWIN hWin = pMsg->hWin;
    - g0 p  s7 Q9 [7 v. u. U
  71.     //; o# Q- F. b$ L! d$ b3 o" N4 S
  72.     //FRAMEWIN  M- P  I6 \% B$ d* v5 c* Z+ a: g/ U: p
  73.     //! |# K' u- F: `% v8 ]  z5 ^$ f
  74.     FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
    5 A3 B0 p/ A- A* |
  75.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);0 R4 k/ f/ M! |3 g; v8 r
  76.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
    ! q' D/ V4 E" v
  77.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
    ) j5 g* q+ @3 j  Q4 o9 H- }9 ~% S
  78.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
    " _& V0 k; q% v" K6 f9 P7 |
  79.     FRAMEWIN_SetTitleHeight(hWin,30);
    ) B: l0 o; c; d5 S+ ?3 I+ B7 K

  80. % N7 d% l$ l0 e4 C( x. p  r/ y
  81. /* 默认颜色取*/# ]/ {. G$ O6 A
  82. ucBackColor = 0;
    . Y/ G  y( o# `6 x
  83. }
    - C" F8 ]  o% @7 K8 E

  84. $ n5 Z, j* W) Y! E
  85. /*********************************************************************
    ' B5 A# r2 r% v4 L2 o( I  {2 G
  86. *
    9 U! Q3 y9 l; C  Z2 Q0 B
  87. *       Dialog callback routine
    + @: F$ s1 s: r3 l: S
  88. */
    9 D& N) W" G) _' c9 K$ ^
  89. static void _cbCallback(WM_MESSAGE * pMsg) & I9 C0 H  T: X! {0 P
  90. {
    - [. Q8 ~2 g+ k. v) p
  91.     int NCode, Id;# [/ O- \7 K  d/ E
  92.     WM_HWIN hWin = pMsg->hWin;
    6 N' H: w; N& d# e, `
  93.     switch (pMsg->MsgId) 7 y- |( t" a/ d6 i- l. s% Z3 U3 }
  94.     {- g$ V0 F) `/ {; P9 I' f

  95. 9 F* A/ t/ @' [! r
  96. case WM_UPDATE: (2)
    2 ~8 O- H' @; j, P' h
  97. ucBackColor++;
    2 r- R9 p2 a. {+ l
  98. if (ucBackColor == 3)4 u' c4 x7 Z0 f8 Y8 c
  99. {, s! D% g. j4 w* U, @
  100. ucBackColor = 0;0 I- k! m7 }. B
  101. }" l& w/ \5 \; m) G: Y
  102. WM_InvalidateWindow(hWin);
    & f6 b  E% m3 Y! I6 ?- a
  103. break;
    " z: J: E& a1 L
  104. case WM_MOUSEOVER:
    6 d0 @1 L' S" d$ e9 n4 a$ F
  105.             break;4 J( n# E* v& G
  106. case WM_PAINT:5 ^. ^5 c7 J9 G
  107.             PaintDialog(pMsg);
    " y- @& R% b+ p+ ]( Q
  108.             break;- _; p. S1 ?1 V- k7 A1 M1 b- M
  109.         case WM_INIT_DIALOG:
    : s1 \# b% [8 x' Y; i+ O
  110.             InitDialog(pMsg);$ }& F+ D( V2 b! u9 f2 D* }$ n
  111.             break;% O  \+ c6 m" u0 k8 M  X
  112.         case WM_KEY:
    $ _+ r5 g+ k# @9 R6 G
  113.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) : m+ d" X8 M) R* A, [
  114.             {) {8 W2 W+ P1 i" }" V+ P3 B& E
  115.                 case GUI_KEY_ESCAPE:
    * F0 ?. I( Q7 [7 [0 _
  116.                     GUI_EndDialog(hWin, 1);+ j  ^% ~3 j. b( M
  117.                     break;" k) i* y( |) L
  118.                 case GUI_KEY_ENTER:1 q  R3 |; x9 W& `# o
  119.                     GUI_EndDialog(hWin, 0);! u- @: s1 }3 R- V5 B
  120.                     break;  _  V9 b& ?0 e; Z
  121.             }
    & h- L3 D8 C! A/ p$ V) z
  122.             break;
    + b2 C4 W: T; `
  123.         case WM_NOTIFY_PARENT:; n/ n, h1 B0 X- z8 J# y' ~
  124.             Id = WM_GetId(pMsg->hWinSrc);
    , e# d6 n3 M) h( J2 L: D6 K! d4 C9 e
  125.             NCode = pMsg->Data.v;        
    % ?6 T! v' O; r* A( n8 K( I! u% V4 p
  126.             switch (Id) . v6 D) r6 v: P, T: x( Q) A+ u' \
  127.             {
    7 p1 Q5 q) _7 ]) Q! i
  128.                 case GUI_ID_OK:
    $ Z& S3 w# }: z
  129.                     if(NCode==WM_NOTIFICATION_RELEASED)5 g3 |: d5 A5 e" j* v7 H
  130.                         GUI_EndDialog(hWin, 0);; S; [- a. A( K
  131.                     break;  ?, S+ `7 S6 D9 b
  132.                 case GUI_ID_CANCEL:
    ' F' {2 c% R* l) R& ~. E+ u
  133.                     if(NCode==WM_NOTIFICATION_RELEASED)
    * N# q4 P" k3 Q9 o" C: n. Y
  134.                         GUI_EndDialog(hWin, 0);& |: z9 U  I* g* b
  135.                     break;+ i! `( a# h+ M, ]5 {
  136.                 case GUI_ID_BUTTON0:
      Q, _5 g& E, E! I
  137.                     switch(NCode)7 H3 J' d" g# o( w5 Q
  138.                     {" K( L0 i, E/ n  Y! h# W
  139.                         case WM_NOTIFICATION_CLICKED:
    . W; V& i! \3 I2 B! j: R
  140. ucBackColor++;- z( `. `& J2 n8 M7 ~1 U" M2 F, \
  141. if (ucBackColor == 3)
    ' y4 [+ m5 w0 Z1 ~$ L
  142. {
    * m- C+ E) f6 a0 x& T
  143. ucBackColor = 0;# a: i: U& N% n) T; h) }# o/ Q
  144. }, t+ }5 c6 Y2 J$ K
  145. WM_InvalidateWindow(hWin);( T0 @" C% S% t: S3 E
  146.                             break;
    ' F" M3 ]1 ]+ i' K% W
  147.                         case WM_NOTIFICATION_RELEASED:
    ) D: {" E0 D  {9 g

  148. 4 L# b0 T1 o9 m
  149.                             break;
    . g4 U7 U4 ]" ^7 V5 j+ s
  150.                         case WM_NOTIFICATION_MOVED_OUT:
    7 [- ~, u. V  J) h# v4 k  D# m+ \
  151. & K& i5 T6 }. S& c2 s
  152.                             break;
    3 `7 D4 _8 @( P4 r- E6 Z" V- \
  153.                     }  q  _$ L7 K" v% D1 Y
  154.                     break;2 V: z- E1 D0 G. \. t/ L/ X
  155.                 case GUI_ID_BUTTON1:
    9 w/ X7 B! E3 D& I- T( e
  156.                     switch(NCode)% L. `& D' t, Y8 |: o  s
  157.                     {6 r2 q! s4 r$ v- H. O& t
  158.                         case WM_NOTIFICATION_CLICKED:
    0 J. i! }2 o/ m0 Q+ _
  159. ucBackColor--;
    # a6 c4 e4 Z7 n5 O: V
  160. if (ucBackColor < 0)
    , {/ ^3 E, ]- l% G9 @% U4 M
  161. {
    3 k! Q* Q' R( m0 r
  162. ucBackColor = 2;
    1 L) k" S. a7 Z3 D! O; m/ n* r
  163. }
    " e, O# `! v* W0 B5 F1 @
  164. WM_InvalidateWindow(hWin);# c, `7 `7 X2 v# U- b, [
  165.                             break;
    6 J0 z* l# p* g6 e# T! x
  166.                         case WM_NOTIFICATION_RELEASED:. e9 B' \4 l) V# \

  167. 4 `2 k% w- N) P
  168.                             break;
    : P& j5 g- b. b7 M+ G( z3 K0 a
  169.                         case WM_NOTIFICATION_MOVED_OUT:
    ; Z3 j+ J! k, a4 Z

  170. 3 J7 n) j- S9 a0 t
  171.                             break;
    % \- h' o" N3 w8 S  H& T
  172.                     }
    8 \$ b; i: C4 O4 s
  173.                     break;
    9 Y! ~' m1 I5 }4 p& _# c
  174. * U- F3 y1 l! O* s
  175.             }# ~) z: D8 R3 @) H9 H9 H" P8 c2 y# q
  176.             break;
    ! ~/ c  E& G! U& m
  177.         default:
    ( y& ^* P8 U4 v+ z8 U, d! b# o
  178.             WM_DefaultProc(pMsg);$ r! w: U( Q+ G9 a
  179.     }
    + B9 }% f8 p& v9 C
  180. }+ a5 F! {. ^' T% @' X" U

  181. ! Q. Q; \1 F  ?
  182. 5 k+ a: ^, e, d! |$ k+ i4 _) l+ [
  183. /*********************************************************************7 p5 V3 K! h3 x' S/ @$ f
  184. *9 W8 @3 O" p6 \/ R7 K
  185. *       MainTask) V" [1 [, A$ Z4 a' s( m
  186. *
    + }* a' D. C+ B( ?" f8 j9 n* x- ]' a5 \
  187. **********************************************************************; Q+ \  a: A) h0 K3 k
  188. */
    & E# q# C8 V+ Q2 V: x
  189. void MainTask(void) % Q) U* Y8 E; V( Z2 w7 k9 B5 w' V
  190. { " C4 T9 z% \7 o0 E- g8 i
  191.     WM_HWIN hDlg;
    1 }8 Z7 N2 M4 I* B5 n* s
  192.   J6 k- y" y9 [  U& l  R! b9 S' {
  193. GUI_Init();$ L1 ^& q. i1 _3 \  W, T/ y% ?# H5 @
  194.     WM_SetDesktopColor(GUI_BLUE);      /* Automacally update desktop window */
    3 i2 }+ P8 @# }# D! N
  195.     WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
    6 p: }& w% h0 a* L- s
  196. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);; y; O7 c1 y! ]( w( S! T" K& ?
  197. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
    ! J2 b0 z' u$ l) R* V+ S, d1 P
  198. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);5 ^$ v/ \( o6 @9 b. `+ Q
  199. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
    8 s* q) N- q  E4 V
  200. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);, A, \+ W8 y2 O0 O- y- W
  201. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);* f$ E6 ]" W: f6 r5 Y
  202. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
    : M$ F' u4 r9 p3 M) n: E. ]/ G8 i( |
  203. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);* ~, K/ k* G, R7 o3 h
  204. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);2 x. p8 P+ Y; y! H' z" U& S
  205. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
    " I0 n5 f. I& M4 r5 Z8 F4 @
  206. /* 创建一个对话框 */
    8 g' P, x7 Y7 H- e
  207.     hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);9 o" X. B! E) t0 V
  208. while (1)
    # o$ k$ s' {- Y6 y. N
  209. {
    . V( b+ ~0 D! i' Q- a; l. K
  210. WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_UPDATE); (3)
    + L! X9 G% w) ?; Q* B& `" R
  211. GUI_Delay(500);. U, v% ~+ ~% Q" o- C
  212. }1 o9 w! a! D& Z  b1 W
  213. # G5 ~; W9 ~8 h' P# j
  214. }
复制代码
1. 定义一个用户消息WM_UPDATE。一定要以WM_USER作为起始值,防止跟系统其他的数值冲突。
2. 在回调函数中加入咱们定义的消息WM_UPDATE,实现对话框中背景的更新功能。
3. 通过函数WM_SendMessageNoPara()每隔500ms给对话框发送消息。这里要特别的注意一点,这个函数是给窗口发送消息的,而咱们前面创建的是对话框,所以这里必须得通过函数WM_GetClientWindow得到窗口的句柄。
这个程序的显示效果如下:
34.1.png

9 i) j, r( C' F- T0 @3 ^, [
赞 收藏 1 评论5 发布时间:2015-2-14 20:12

举报

5个回答
baiyongbin2009 回答时间:2015-2-14 20:13:18
34.2 桌面窗口回调函数实例
    这里用上期教程所介绍的自定义消息类型做一个实例。代码跟上期教程的三个实例类似。实现源码如下(可以直接将代码复制到模拟器或者开发板上面运行)。
  1. #include <stddef.h>3 f+ E: U2 }4 t) a% o% E" ]  Q0 }) s# D
  2. #include "GUI.h"
    4 I* f! q) h/ u0 }) Z
  3. #include "DIALOG.h"
    ; S, O" ]" i7 _  C! U
  4. + V" V: z( |$ o) q5 V. Z: V
  5. #include "WM.h"! I; W3 Q& P# V6 O7 y$ Q
  6. #include "BUTTON.h"
    - _, u/ `7 D: a4 `2 B
  7. #include "CHECKBOX.h"
    0 S) L% M1 ^! t' h& w! z2 A
  8. #include "DROPDOWN.h"
    * V: Y7 ]7 r+ _
  9. #include "EDIT.h"* v+ ~0 E3 \1 m% v- e1 `
  10. #include "FRAMEWIN.h"- }/ ^. D8 x! G( o9 n3 M
  11. #include "LISTBOX.h". W7 w6 {  v% Y# E$ `5 k2 [
  12. #include "MULTIEDIT.h"
    5 x) f8 h$ Z# Z/ D! N" N. X
  13. #include "RADIO.h"
    " y, ?: e3 s5 w, J' U2 h$ ^. Z
  14. #include "SLIDER.h"/ T( ?) R* u8 {% `% a9 r
  15. #include "TEXT.h"9 [3 x/ G7 e/ c( @# {+ S, s
  16. #include "PROGBAR.h"
    8 y3 {  G# S4 x! y9 R, Z1 F
  17. #include "SCROLLBAR.h"% K% W/ a" I( c# _) n* B
  18. #include "LISTVIEW.h"
    " R% f/ {) P5 M0 m: e' N
  19. & c  o( d6 W8 s6 q

  20. % U  `0 U1 x7 A; c2 v% K7 ^
  21. #define WM_UPDATE WM_USER + 1
    5 U( R( t, E! D/ g  M
  22. /*********************************************************************
    ' T% p5 |$ N7 y) R" u6 @
  23. *% `% R& _, g0 ?/ i
  24. * static data; F! k& ~( j. }, v1 l) d8 f
  25. *
    $ G; i$ B$ Z6 f/ q; E# i( v! p/ V0 `* z
  26. **********************************************************************
    , M1 s. D# E' [5 ?
  27. */. j3 N2 l$ R* ^6 C5 A; _: G1 W" y) I
  28. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
    * K5 L5 j( M/ Y% ]$ e
  29. static char ucBackColor;   h3 Z/ A  [+ d, j% J& q4 T

  30. ! K& f) Q* @8 m/ m

  31. 2 ^- b+ T* V* d! [, Q8 W4 l

  32. 8 x$ \0 b1 E) {" g0 V8 T* C  {( w& E
  33. /*********************************************************************  b& x# _/ B7 B# m' A
  34. *
    0 _  p' `( o+ [3 K0 v& t
  35. * Dialog resource
    ! U2 a5 H; z0 `2 ^3 i* g
  36. *4 W+ P: j" x- q6 o7 k( i* h2 Q5 {" o( R
  37. * This table conatins the info required to create the dialog.4 G: j* m: _- p3 V
  38. * It has been created by ucGUIbuilder.
    9 f$ q5 [; Q, K3 ^! a
  39. */
    / C4 k# j4 G+ c& D) |! S

  40. ; _6 B& n) h* j8 M- q% y/ s5 i
  41. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {/ t' f7 y1 _2 ?% e
  42. { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},
    ) D: l" q+ ]! A0 M
  43. { BUTTON_CreateIndirect, "BUTTON0", GUI_ID_BUTTON0, 82, 122,162,37, 0,0},7 v" h9 |0 x6 Z$ y2 \: t& l
  44. { BUTTON_CreateIndirect, "BUTTON1", GUI_ID_BUTTON1, 357,123,152,35, 0,0}6 I" U0 a7 r2 l1 P0 `' n
  45. };
    3 l: w- q4 W! [0 y# V: s
  46. 6 T: I2 e3 C9 P0 o4 ]! Z, X
  47. /*****************************************************************
    $ n- }' _, _* \% q6 i8 a. \
  48. ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg)/ ^- S, M) l) p; i2 o
  49. ** Function: to initialize the Dialog items
    2 l2 F/ s5 H2 O- e0 Z/ ?3 Q
  50. **
    , F  e* q  K' z4 x1 A1 I
  51. ** call this function in _cbCallback --> WM_PAINT' k8 ~- `3 Q$ S+ H1 a6 Q9 P- R4 ^: Y
  52. *****************************************************************/
      ]( V- n4 G9 I$ Z9 x0 S- Y, |

  53. 0 h$ _" Q" u" H( h1 Q
  54. void PaintDialog(WM_MESSAGE * pMsg)
    ; {  P5 k6 R7 A/ e" R" t* x
  55. {: E; q2 ?. i6 i3 K
  56. WM_HWIN hWin = pMsg->hWin;- l# J, J# U6 G
  57. //        GUI_SetBkColor(_acColor[ucBackColor]);
    0 O& q# O- E3 e5 |+ y" F: y8 v
  58. //        GUI_Clear();) d8 e. g7 D* @
  59. }& k( A, E+ V+ y9 H& m+ X

  60.   R9 N% c6 b1 s" g4 ]
  61. /*****************************************************************) L+ e: G. t& d
  62. ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)
    0 e9 l& }0 [* B6 q1 @( _4 w
  63. ** Function: to initialize the Dialog items% b$ `# t' {: y/ F" I% e
  64. ** , e& H: \" M9 ^" l
  65. ** call this function in _cbCallback --> WM_INIT_DIALOG
    4 n$ c/ k' g- `' X6 a' I( a
  66. *****************************************************************/8 w4 S; Z4 M( {9 @; n  X

  67. " L" A* Q8 t$ _5 I/ T- ~# |5 a# P
  68. void InitDialog(WM_MESSAGE * pMsg)
    : [# w, j1 r9 M
  69. {1 b- k1 j) h3 O! h# o5 K) j  ^+ M
  70. WM_HWIN hWin = pMsg->hWin;% e6 }: J, J' h. n
  71. //
    6 D2 u1 q& P/ P* ~
  72. //FRAMEWIN
    8 j$ b# e8 V- m2 G4 [2 q
  73. //
    6 g! ]; U8 @) l2 V- V1 i9 t
  74. FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
    - E8 Y: a% c* ]- v9 E
  75. FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
    , U- B4 {% Q$ B* q% w9 ^
  76. FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
    ) ^2 c- Q  \+ M5 U
  77. FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
    9 r$ W  c8 g/ |2 E4 e
  78. FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);! i+ ~5 G2 l' o7 u5 B: ^+ `
  79. FRAMEWIN_SetTitleHeight(hWin,30);3 I  ~+ V# B! {) f/ V

  80. ; a1 B. T# Z) L+ i6 I: j$ f
  81. /* 默认颜色取*/4 E2 h) k+ F/ u" [* n/ ^' w$ H2 G4 a
  82. ucBackColor = 0;
    8 A4 n2 r5 u' D2 l( g  B
  83. }6 C1 P  T& {3 [6 g! h7 J+ Z
  84. 1 P4 A2 F" f9 b  [' G
  85. /*********************************************************************; m1 H. ^$ r( q  z$ t  d0 y
  86. *
    7 @; g. }7 I# z% _: G
  87. * Dialog callback routine
    ; C; |1 ~& y8 P; ?. O4 H
  88. */
    / K4 q6 l% T, n/ t2 ]! U
  89. static void _cbCallback(WM_MESSAGE * pMsg) 2 X1 f- K) T  }' {  C: b3 z' h* H
  90. {6 V  O$ d, R) k* |- K8 d7 H% K' |8 R
  91. int NCode, Id;* @6 q5 U6 y) Y/ r9 |
  92. WM_HWIN hWin = pMsg->hWin;( O% K  r6 z" w; ~
  93. switch (pMsg->MsgId)
    3 D% a0 {! h, I7 V, U- ?
  94. {0 u0 B% v+ u# M3 X+ P' p
  95. case WM_PAINT:! J" h% w" j4 y3 h5 Q: a
  96. PaintDialog(pMsg);* ^! o6 o4 ~2 r* Y4 z
  97. break;
    1 Q% H+ t* W" v  N% K) g& p
  98. case WM_INIT_DIALOG:. _; Y, C7 A( r9 s  k! s! G
  99. InitDialog(pMsg);
    6 c/ t$ y5 ~8 S: V. l7 F( y
  100. break;5 a$ T! m& n) x0 }7 T
  101. case WM_KEY:9 j* P7 d2 _) t% P
  102. switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
    " [& d: `/ X0 L# p" n- M
  103. {
      ?! j( a; s/ L/ C# d! B
  104. case GUI_KEY_ESCAPE:
    ' {# z. N0 p  c' m
  105. GUI_EndDialog(hWin, 1);
    % O) R5 q! `( Y& Z) I
  106. break;
    7 V$ v3 [1 `( R  O' {. C$ y1 {: V
  107. case GUI_KEY_ENTER:
    5 I; a9 D( I; A3 @& K+ @
  108. GUI_EndDialog(hWin, 0);
    ! ]# }3 [2 h. j- c* F1 w3 ~
  109. break;. e6 ~* a3 x: p( v) d' k. C/ C1 l% g
  110. }- X9 y- R; t) e$ h1 g
  111. break;8 d, c+ l* l) k  M" ^' ]
  112. case WM_NOTIFY_PARENT:
    7 v9 n1 c7 ~6 n
  113. Id = WM_GetId(pMsg->hWinSrc); ; [# x% ]. i& A- w2 Z& K/ Z# ?
  114. NCode = pMsg->Data.v;
    $ n2 s' ]' I' \" T, r5 E
  115. switch (Id) " \0 \% j& c3 x
  116. {
    & [; C, H; ^8 s6 P& `2 ]9 }; G
  117. case GUI_ID_OK:
      T: k3 h8 O! F1 x
  118. if(NCode==WM_NOTIFICATION_RELEASED)* E: ~7 c3 q. m( B) e) h0 A9 s) ~( z. l
  119. GUI_EndDialog(hWin, 0);# Y$ p  L+ G, Y/ _% i+ B. B; J3 d+ Y
  120. break;
    9 H, v( ?. _/ X. n
  121. case GUI_ID_CANCEL:
    * N* t' ^9 D( j$ A6 A) @
  122. if(NCode==WM_NOTIFICATION_RELEASED)
    ' g0 ?; @& R/ E# H/ X& p
  123. GUI_EndDialog(hWin, 0);! x7 ~4 Q  x. }9 F& S" w
  124. break;/ J/ P: V+ c4 n
  125. case GUI_ID_BUTTON0:
    5 b" j1 t& Q2 Z' l
  126. switch(NCode)
    " Q* T; e$ {0 W+ t) P8 b
  127. {
    : j7 Q1 r5 v$ q0 X/ c" i+ D  n; O
  128. case WM_NOTIFICATION_CLICKED:% K$ {7 i  T- c1 _" O
  129. break;$ `) f7 j0 @/ W6 E
  130. case WM_NOTIFICATION_RELEASED:; r4 C* [& S* \4 h
  131. 0 U% o$ _* o& v
  132. break;0 o& T) w. l+ Z
  133. case WM_NOTIFICATION_MOVED_OUT:
    3 X+ u2 d, J+ N! _# O
  134. 4 m1 _2 E! J* j4 a; J6 m/ [7 y$ P
  135. break;
    9 I' L% L% D3 z# I
  136. }, G. s; X& v8 B: N- r& }; j, q  Y3 K+ d
  137. break;
    & r6 z0 `6 e) f/ \! F# w
  138. case GUI_ID_BUTTON1:8 j# H4 w2 U, e, @* A  `. r
  139. switch(NCode)# s4 _6 G  Y7 k# |
  140. {, @/ b. f. ?9 D; m6 D% G
  141. case WM_NOTIFICATION_CLICKED:9 j: F2 D8 _, C( ^/ i
  142. , B3 t/ R7 D( A
  143. break;
    4 j% `0 l6 m% O4 v; o# a" L" z
  144. case WM_NOTIFICATION_RELEASED:
    / Q" W4 u, s% e5 c

  145. 6 O) A, o% j3 Z  F. _7 f' Q
  146. break;
    - g) d- }% W6 ^) a* M  ~5 k
  147. case WM_NOTIFICATION_MOVED_OUT:
    3 m- [+ ]. s4 Z5 l

  148. 8 ]* x* F. h& ~% P; p
  149. break;
    - I' {2 Y; d( E+ E2 g
  150. }
    ( C6 w" z: D( x
  151. break;
    + U$ M- v  B( {9 J" h* s( z. Q

  152. * k- B6 |8 H' `
  153. }( W/ z) F+ W; A% O  i
  154. break;+ w/ F' H: l3 o* ^" b3 J
  155. default:- b& X1 e/ u3 L4 A- @; Q
  156. WM_DefaultProc(pMsg);
    % n8 t; t' v- W. V$ E) M5 T
  157. }7 N+ C" X0 e% `- B7 \- J
  158. }4 y% z( {/ o/ o* P" _) w9 `  Q

  159. - q3 H! V4 w5 Q  ^4 D- V& J! n
  160. /*********************************************************************
    + o9 \& p/ e3 t
  161. *$ A, p: r  D* i. k
  162. * Dialog callback routine# x7 q7 r1 n& u( T+ k2 g  k
  163. */
    ( [( o( D0 p. U4 z# Q8 G% U# C
  164. static void _cbBkWindow(WM_MESSAGE * pMsg) (1)( w- q) ^. b$ O; O: D1 M" r
  165. {, ]% {# R! g* B0 V
  166. WM_HWIN hWin = pMsg->hWin;
    * e; m5 w/ B4 U* w- z/ W) Z

  167. ' p! C2 {1 V8 ~; [
  168. switch (pMsg->MsgId) 6 ?( {% x7 S5 E; J# q
  169. {
    8 ~7 I( O" S( M0 z- f0 h
  170. case WM_PAINT: (2)) ]/ z6 h5 ~4 M& ?% o+ {2 p% Q
  171. GUI_SetBkColor(_acColor[ucBackColor]);5 k1 m2 r( J4 U4 O/ Y
  172. GUI_Clear();
    % f$ u" r8 [' s- a
  173. break;
    - I( L( P% e9 C2 V5 O
  174. case WM_UPDATE:(3)
    0 V& q& P  \3 n6 G
  175. ucBackColor++;
    / R' h( K! l: m4 R* T* h& g/ }. ?
  176. if (ucBackColor == 3)! B, V6 G4 }; o0 U7 D/ f4 A
  177. {
    / [  V0 o8 k) v' Q; ?5 y5 J' L6 r; ?
  178. ucBackColor = 0;
    $ s9 }$ i- |6 D: P/ c
  179. }
    % [9 n. p& H4 J: ~9 u
  180. WM_InvalidateWindow(hWin);) M+ _- f+ u( e
  181. break;
    / F4 Q- \7 h2 F, W3 B# i
  182. default:
    $ V& K. F0 J0 ]0 l' a! p" g3 C
  183. WM_DefaultProc(pMsg);, M0 U9 |1 x4 ~
  184. }. f8 D6 g8 S; `! f3 l1 }
  185. }
    2 P$ {& N/ X# F5 Q) d
  186. 0 a. U  B( p% \, R6 t9 f: ]4 C
  187. /*********************************************************************) a. t1 H/ `5 M; l6 S+ h2 D
  188. */ l8 U3 o1 i. ~# u' s% t
  189. * MainTask5 o$ E4 d4 K0 o) F6 P% I$ B/ X# l
  190. *& s5 N( B& z) F' D6 t' Q
  191. **********************************************************************# V$ `- T1 Y+ {
  192. */; _' X- ]: r- S
  193. void MainTask(void) 2 k& U8 R1 H: H* B! f( Q9 d9 O
  194. { ( U( O! s' E8 X: H. d2 M, f
  195. WM_HWIN hDlg;5 q- h/ D! ]4 ]6 {2 P
  196. /*
    ( T( Z; s6 \" o
  197. 使能窗口使用内存设备,这样可以有效避免闪烁 放在GUI_Init前面就包括桌面: [% }% d( s3 ~" x- L3 \( }  F1 K
  198. 窗口,如果放在后面就不包括桌面窗口。
    * c3 y9 x2 \8 h3 x5 e5 b
  199. */
    * F2 C# }- N- z3 X  d2 B+ t, g
  200. WM_SetCreateFlags(WM_CF_MEMDEV); (4)
    : O6 `: I2 P/ }+ |  u* ^1 z6 C
  201. GUI_Init();  z) |) `7 ^/ B" v
  202. /* 设置桌面窗口回调函数 */
    1 J0 F: L+ \+ G
  203. WM_SetCallback(WM_HBKWIN, _cbBkWindow);(5)2 i( J4 |- X- l% B4 H, r+ b4 [
  204. //WM_SetDesktopColor(GUI_BLUE); /* Automacally update desktop window */ (6)
    ! N* D8 }& _# s+ `  X
  205. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);7 P0 `/ e8 F! q* n
  206. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
    3 p: r3 s' v6 Y: T+ e" n
  207. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);9 n( x$ j1 a* A! R/ ~- T
  208. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
    & [% Y4 Z" Y, `$ M
  209. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
    * P% R& [3 N/ c# L% A$ G' _
  210. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);8 Q, Z& b1 X9 H) j2 c& C5 v
  211. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
    1 v( g" @# ~/ W6 @( c9 v; e
  212. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
    % O! e: \9 d- g9 p4 g$ y1 J5 L+ e
  213. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);! {  b/ a  b3 [; C/ D4 y
  214. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);) L& s- H; E+ U1 O$ V' A5 Q
  215. /* 创建一个对话框 */
    ' h  F1 i3 u$ X6 B: V+ N
  216. hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);. v& c6 N2 y  ?8 x" {) k8 K3 j( O
  217. while (1)6 W! N5 f" y0 R" m1 E* U
  218. {( N) W. ^6 C8 O& ~8 F; a
  219. WM_SendMessageNoPara(WM_HBKWIN, WM_UPDATE); (7), \: b' r+ d$ o5 m+ n7 z" W
  220. GUI_Delay(500);$ B  T. R# f2 f1 Q
  221. }5 l( N0 f1 U8 F/ r
  222. ; `* n3 F1 a. s
  223. }
复制代码
1. 桌面窗口的回调函数(桌面窗口是emWin最底层的窗口,是初始化后自动创建的)。
2. 重绘消息,用于实现桌面颜色的重绘。
3. 这个是自定义消息,功能和上面34.1小节讲的一样。
4. 使能窗口使用内存设备,这样可以有效的避免闪烁。
5. 通过函数WM_SetCallback来设置桌面窗口的回调函数。
6. 函数WM_SetDesktopColor可以实现桌面窗口颜色的自动重绘。
7. 这里要尤其的注意,系统消息由GUI库发送。请勿从用户应用程序向窗口或小工具发送系统定义的消息。要不会出现异常的。也就是说我们不能发WM_PAINT消息,但是可以发自定义消息,进而来触发重绘。
这个DEMO的功能就是每隔500ms改变一次桌面窗口的颜色,实际显示效果如下:
34.2.png
0 g- m( ]1 [5 N9 ]
7 y' A2 o) x( v
baiyongbin2009 回答时间:2015-2-14 20:14:02
34.3 官方WM_Redraw.c实例
    这个DEMO在模拟器中的位置:
34.3.png
下面我们将这个代码分析一下:
  1. #include "GUI.h"' [7 v+ m) J3 v# X' U5 Z
  2. #include "WM.h"+ G2 j) U6 C) Y4 }! L: Q7 ~; m
  3. 6 s3 y0 U, y9 h6 M9 ]: G# [, @1 O9 r
  4. /*******************************************************************
    ) |$ f' R; P8 J5 o1 B+ G
  5. *3 k( K  }+ d, D2 ]. z8 @
  6. * static code+ {$ J: O5 k3 J# l, \( ^/ u
  7. *
    # X$ X  N: ~: A5 P8 D' k/ T9 b- m
  8. ********************************************************************
    , l  R. Z# w7 g  L5 y
  9. */1 \8 h) r7 J) c
  10. /*******************************************************************
    9 y8 [# j( }& d! C& m+ k$ O" {
  11. *
    8 P( u  Y' b6 h$ ^; J) Z4 Y; i
  12. * _cbBkWindow
    8 D" i; E1 ~, N. B% _% Z% s
  13. */9 I% h# G% ?! x( r
  14. static void _cbBkWindow(WM_MESSAGE* pMsg) {(1)5 l1 J" K; o. l. J9 t5 a% V; [
  15. switch (pMsg->MsgId) {& @) J4 M* d1 l+ d3 G9 P
  16. case WM_PAINT:1 ?  W4 m4 h% R9 ^- ^* s* A4 c0 M
  17. GUI_ClearRect(0, 50, 319, 239);(2)
    " B" A% \8 F+ N! V! [
  18. default:- m0 c2 P5 C2 g& h/ k8 a
  19. WM_DefaultProc(pMsg);
    / k' m# v8 g& f* Z  }* I
  20. }: t# X$ O4 X6 M1 O% ?! W5 N
  21. }3 X0 }' O  ~9 c9 p

  22. * s: V3 w; c6 _2 a; W
  23. /*******************************************************************% p3 M/ d- Z+ j- M' w) @* `
  24. *
    8 |# i7 o) p! \, b$ i: [1 H
  25. * _cbWindow/ D8 n% B. w  L% u
  26. */
    ( w: q' D, C4 z, z0 ^5 \! ]# q
  27. static void _cbWindow(WM_MESSAGE* pMsg) {(3)
    8 N* r1 j* B/ w, }' _
  28. GUI_RECT Rect;
    : c, J) u' f# G; Z

  29. , G$ L$ |& x- R# d9 {' O5 |+ @( s# V
  30. switch (pMsg->MsgId) {
    / i0 L/ w& o+ C  {* l
  31. case WM_PAINT:- y6 d0 f( g% Q6 ?; D
  32. WM_GetInsideRect(&Rect);(4)
    2 G. q1 o& m0 {: q5 ?& P
  33. GUI_SetBkColor(GUI_RED);
    6 i( o4 a. t3 V, |
  34. GUI_SetColor(GUI_YELLOW);0 D( }4 p: D) O8 E
  35. GUI_ClearRectEx(&Rect);(5)' l0 ~# `7 `: n+ l) [
  36. GUI_DrawRectEx(&Rect);7 D4 J6 X5 w) n6 l
  37. GUI_SetColor(GUI_BLACK);
    ; g* P: e7 e/ z9 d' |9 G- P
  38. GUI_SetFont(&GUI_Font8x16);
    2 S2 v( a% v. T: h
  39. GUI_DispStringHCenterAt("Foreground window", 75, 40);
    1 n- y" f8 q$ W3 \" u- ~
  40. break;2 ?7 H+ G6 V2 N# R7 \! K
  41. default:
    / G4 Z$ ^, c" q* O! w- c
  42. WM_DefaultProc(pMsg);
    " \+ M# M' B! E  N2 G6 [" E, O
  43. }  Y% r" m: q  I; K1 w( [8 W
  44. }" H6 D- N9 `) x

  45. & w( y/ D0 G7 `9 J1 o$ @% |3 L
  46. /*******************************************************************; F- x3 w0 ], N- I1 W4 L
  47. *
    " l* \8 @' w& Z0 y
  48. * _MoveWindow5 K& n3 ~# l6 P  ~0 k1 d
  49. */, b1 g0 }+ f" r* e% s
  50. static void _MoveWindow(const char* pText) {
    2 j8 O( ~6 U$ O9 L% p2 n' P7 i
  51. WM_HWIN hWnd;1 n+ f) I4 `3 P/ w2 X" }. b
  52. int i;; J) |0 S  L- g1 J( [
  53. 9 @3 k2 v3 `1 q2 a) p! v
  54. //
      \+ Y$ u& d; B1 _) `' L
  55. // Create foreground window7 J; A, \( O* J  q
  56. //
    7 ~7 c/ j1 g6 a. F8 D
  57. hWnd = WM_CreateWindow(10, 50, 150, 100, WM_CF_SHOW, _cbWindow, 0);(6)
    ! M- C! W3 J# l. {
  58. GUI_Delay(500);/ l: m% y* J5 @
  59. //  i# {( p, Y8 n( z, X6 O
  60. // Move foreground window
    # o) ?2 x" j' c. Q4 g3 B& O
  61. //
    $ a9 |+ W5 d2 ]4 x: M
  62. for (i = 0; i < 40; i++) {7 i" D- \; y; G; D9 L) Y
  63. WM_MoveWindow(hWnd, 2, 2);(7)* m# n5 l8 F# g. e
  64. GUI_Delay(10);7 {8 z- n. t/ z9 k( F! K# G& Y) M6 @
  65. }, D# F0 y/ N' R# L- H2 V3 t8 |( s. x
  66. //0 {) ^: \, i7 E, J5 V9 v- L  U
  67. // Show text before deleting window if we have one
    7 x. _+ w. k, U! D" F3 H- E& _
  68. //4 z! W! m- N$ B. N2 N% k& l9 _. j
  69. if (pText) {
    1 Y4 k4 I5 c4 |- c8 W* G7 _
  70. GUI_DispStringAt(pText, 5, 50);
    # Q2 W; v+ ^+ S. [6 w
  71. GUI_Delay(2500);, x2 [7 @' z+ d7 _) L* p
  72. }
      a- r" V0 x9 k+ U& F3 u9 q
  73. //
    - H( g2 j8 K9 `+ |7 V* l
  74. // Delete foreground window
      u' X3 D" P. F  I; Q# Y
  75. //6 O) z  u% K6 l
  76. WM_DeleteWindow(hWnd);(8)
      B/ L' N7 s7 s  A" E: f' Q
  77. WM_Invalidate(WM_HBKWIN);(9)" \& c! A' _* C9 K8 N. l
  78. GUI_Exec();$ T. Z$ k5 M& a7 e2 _6 l+ Q
  79. }
    7 S/ I! K/ Q& n7 I* X
  80. % O/ o; b% r6 e
  81. /*******************************************************************
    : I3 ^& i$ S9 E- `: I# o" J$ ^. ^
  82. *
    8 i( H$ V& {1 J: G
  83. * _DemoRedraw! }' A$ y  L) w6 }5 |
  84. */( `4 c" s8 n0 c8 w/ [& p
  85. static void _DemoRedraw(void) {
    3 ^% I6 ~8 O" E5 ?" n' `* {5 O
  86. WM_CALLBACK * _cbOldBk;
    1 o6 p9 g6 r0 I4 z, {
  87. - G2 l% m' ?1 N7 z
  88. GUI_SetBkColor(GUI_BLACK);4 x2 z8 Q$ ^4 Q4 M
  89. GUI_Clear();6 B. o3 k) }6 c! C
  90. GUI_SetColor(GUI_WHITE);2 ]" }- X+ w- u" b. C7 @6 h
  91. GUI_SetFont(&GUI_Font24_ASCII);
    0 h1 u# z  v9 u/ I
  92. GUI_DispStringHCenterAt("WM_Redraw - Sample", 160, 5);3 D6 M3 c" k# T( r7 s
  93. GUI_SetFont(&GUI_Font8x16);
    0 m1 R" l, R- t) C* j! ^6 z
  94. while(1) {
    - P' A) j3 T) O
  95. //
    ! a+ r, Z& {( }5 R
  96. // Move a window over background. r. Q! V6 j$ J
  97. //9 X( @3 y$ H: |: Q" G3 E: X
  98. _MoveWindow("Background has not been redrawn");(10)( X4 o' Q5 \( ]. C
  99. //
    1 a1 H* l* ~& q1 W
  100. // Clear background
    & o4 c+ n  p1 q8 m
  101. //
    9 r3 _) q1 K$ E7 U
  102. GUI_ClearRect(0, 50, 319, 239);
    4 I9 o( E0 Z- V& V: ^1 x; n
  103. GUI_Delay(1000);3 U+ h: `* S& \, b2 P$ f+ w
  104. //
    9 h1 i& A/ @# Q
  105. // Set callback for background window4 T$ g" V( K( q+ f" r, G
  106. //
    7 l5 r# B( `. X- y) ^& {1 R" c
  107. _cbOldBk = WM_SetCallback(WM_HBKWIN, _cbBkWindow);(11)% ]; W% _7 S; x9 b# T/ r/ E* U
  108. //
    0 @" c3 r  ~6 p6 G3 d# }& r
  109. // Move a window over background# I$ z  ]" n) e7 d
  110. //# F5 s. D5 J( P: [3 I
  111. _MoveWindow("Background has been redrawn");
    5 \. ?% T( x. r7 ~2 ~
  112. //
    0 a4 h9 [3 Y: L) b$ f
  113. // Delete callback for Background window
    4 P2 k3 H) n3 N# F6 r, Z
  114. //
    8 s* ?0 a+ S: P- h$ c- i8 q
  115. WM_SetCallback(WM_HBKWIN, _cbOldBk);(12)+ d9 k; X" ^, t* o1 ^
  116. }( ~9 j# w. a4 L, G# J( J
  117. }
    8 y. E, }! Q* g! g# _; F2 C
  118. # {% r8 ?. L  ~% `* n  F
  119. /*********************************************************************
      B% j6 [; ~* \4 Z( B# t
  120. *8 R! h- F, |. V5 Z- H
  121. * Public code. T5 {$ h, B4 |# Z/ q
  122. *+ L) S+ g) E* U6 L) H" D
  123. **********************************************************************
    . H: R$ W( w0 \( \' ~" N4 S  u$ U
  124. */1 A2 \- M; z7 i( m0 k' |! h
  125. /*********************************************************************
    7 o8 c* n( B) V7 d* B3 |. [7 ~
  126. *
    2 ?) w( c2 C5 O; V, A* [7 g
  127. * MainTask
    4 {! n# [1 G+ a5 \+ b* p$ ^& j
  128. */) X1 {' P! }$ j6 C, m
  129. void MainTask(void) {
    0 Z6 B9 A$ U% f% M
  130. GUI_Init();
      d% f& D# Y6 ?+ t! c
  131. _DemoRedraw();
    7 J* u5 }& {; \* E3 X
  132. }
复制代码
1. 桌面窗口回调函数。
2. 在回调函数的WM_PAINT消息中清除一块区域。
3. 另一个创建窗口的回调函数。
4. 函数WM_GetInsideRect返回客户区的坐标,该区域由活动小工具尺寸减去边界尺寸确定。此函数向活动窗口发送一条消息,检索内部矩形。如果小工具不处理此消息(也即意味着小工具没有边界),则需使用WM_GetClientRect函数计算出矩形。结果通过窗口坐标给出。也即,GUI_RECT结构中的x0和y0相当于x和y的边界尺寸,x1和y1相当于窗口尺寸减去边界尺寸-1。
5. 调用函数GUI_ClearRectEx清除部分区域。
6. 函数WM_CreateWindow中每个参数的含义需要大家详细研究下官方手册,这里就不做解释了。
7. 通过函数WM_MoveWindow()实现窗口位置的移动,注意这里移动的是相对距离。
8. 删除这个创建的窗口。
9. 通过函数WM_Invalidate(WM_HBKWIN)使得桌面窗口无效,然后调用函数GUI_Exec()就会执行重绘。
10. 执行第一种情况:移动窗口,但是不做桌面窗口的重绘。
11. 给桌面窗口设置专门的回调函数。
12. 执行第二种情况:移动窗口,并执行桌面窗口的重绘。
   这个演示实例的主要功能就是两种情况,一种是演示:移动窗口的情况下,但是不做桌面窗口的重绘。另一种是:移动窗口,并执行桌面窗口的重绘。通过这两种情况的演示可以帮助大家对回调函数有一个更好的认识。
第一幅:没有执行桌面回调函数的情况:
34.4.png
第二幅:执行桌面回调函数的情况:
34.5.png
34.4 总结
    本期教程就跟大家讲这么多,希望通过本期教程让大家对窗口管理器有更好的认识,不过还需要大家在模拟器或者开发板上面多做这方面的练习。
: f  s, |0 Z* H* J) p/ W' H8 }3 L
feel-376797 回答时间:2015-2-14 21:20:13
谢谢分享
lkl0305 回答时间:2015-2-14 21:32:45
多谢分享
_ilikerome_ 回答时间:2015-2-15 08:33:17
继续跟着学习,谢谢!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版