微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第34章 窗口管理器实例(一)

第34章 窗口管理器实例(一)

时间:10-02 整理:3721RD 点击:
第34章 窗口管理器实例(一)

    为了帮助大家更好的理解窗口管理器的回调和消息机制,本期教程专门做了三个相关的例子,帮助大家更好的理解。

    34. 1  用户自定义消息类型实例

    34. 2 桌面窗口回调函数实例

    34. 3 官方WM_Redraw.c实例

    34. 4 总结

34.1 用户自定义消息类型实例

    这里用上期教程所介绍的自定义消息类型做一个实例。代码跟上期教程的三个实例类似。实现源码如下(可以直接将代码复制到模拟器或者开发板上面运行)。

  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"

  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"


  18. #define WM_UPDATE  WM_USER + 1(1)
  19. /*********************************************************************
  20. *
  21. *       static data
  22. *
  23. **********************************************************************
  24. */
  25. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
  26. static  char ucBackColor;



  27. /*********************************************************************
  28. *
  29. *       Dialog resource
  30. *
  31. * This table conatins the info required to create the dialog.
  32. * It has been created by ucGUIbuilder.
  33. */

  34. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  35.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  36.     { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          82, 122,162,37, 0,0},
  37.     { BUTTON_CreateIndirect,    "BUTTON1",           GUI_ID_BUTTON1,          357,123,152,35, 0,0}
  38. };

  39. /*****************************************************************
  40. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  41. **      Function: to initialize the Dialog items
  42. **                                                      
  43. **      call this function in _cbCallback --> WM_PAINT
  44. *****************************************************************/

  45. void PaintDialog(WM_MESSAGE * pMsg)
  46. {
  47.     WM_HWIN hWin = pMsg->hWin;
  48. GUI_SetBkColor(_acColor[ucBackColor]);
  49. GUI_Clear();
  50. }

  51. /*****************************************************************
  52. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  53. **      Function: to initialize the Dialog items
  54. **                                                      
  55. **      call this function in _cbCallback --> WM_INIT_DIALOG
  56. *****************************************************************/

  57. void InitDialog(WM_MESSAGE * pMsg)
  58. {
  59.     WM_HWIN hWin = pMsg->hWin;
  60.     //
  61.     //FRAMEWIN
  62.     //
  63.     FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
  64.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  65.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  66.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  67.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  68.     FRAMEWIN_SetTitleHeight(hWin,30);

  69. /* 默认颜色取*/
  70. ucBackColor = 0;
  71. }

  72. /*********************************************************************
  73. *
  74. *       Dialog callback routine
  75. */
  76. static void _cbCallback(WM_MESSAGE * pMsg)
  77. {
  78.     int NCode, Id;
  79.     WM_HWIN hWin = pMsg->hWin;
  80.     switch (pMsg->MsgId)
  81.     {

  82. case WM_UPDATE: (2)
  83. ucBackColor++;
  84. if (ucBackColor == 3)
  85. {
  86. ucBackColor = 0;
  87. }
  88. WM_InvalidateWindow(hWin);
  89. break;
  90. case WM_MOUSEOVER:
  91.             break;
  92. case WM_PAINT:
  93.             PaintDialog(pMsg);
  94.             break;
  95.         case WM_INIT_DIALOG:
  96.             InitDialog(pMsg);
  97.             break;
  98.         case WM_KEY:
  99.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  100.             {
  101.                 case GUI_KEY_ESCAPE:
  102.                     GUI_EndDialog(hWin, 1);
  103.                     break;
  104.                 case GUI_KEY_ENTER:
  105.                     GUI_EndDialog(hWin, 0);
  106.                     break;
  107.             }
  108.             break;
  109.         case WM_NOTIFY_PARENT:
  110.             Id = WM_GetId(pMsg->hWinSrc);
  111.             NCode = pMsg->Data.v;        
  112.             switch (Id)
  113.             {
  114.                 case GUI_ID_OK:
  115.                     if(NCode==WM_NOTIFICATION_RELEASED)
  116.                         GUI_EndDialog(hWin, 0);
  117.                     break;
  118.                 case GUI_ID_CANCEL:
  119.                     if(NCode==WM_NOTIFICATION_RELEASED)
  120.                         GUI_EndDialog(hWin, 0);
  121.                     break;
  122.                 case GUI_ID_BUTTON0:
  123.                     switch(NCode)
  124.                     {
  125.                         case WM_NOTIFICATION_CLICKED:
  126. ucBackColor++;
  127. if (ucBackColor == 3)
  128. {
  129. ucBackColor = 0;
  130. }
  131. WM_InvalidateWindow(hWin);
  132.                             break;
  133.                         case WM_NOTIFICATION_RELEASED:

  134.                             break;
  135.                         case WM_NOTIFICATION_MOVED_OUT:

  136.                             break;
  137.                     }
  138.                     break;
  139.                 case GUI_ID_BUTTON1:
  140.                     switch(NCode)
  141.                     {
  142.                         case WM_NOTIFICATION_CLICKED:
  143. ucBackColor--;
  144. if (ucBackColor < 0)
  145. {
  146. ucBackColor = 2;
  147. }
  148. WM_InvalidateWindow(hWin);
  149.                             break;
  150.                         case WM_NOTIFICATION_RELEASED:

  151.                             break;
  152.                         case WM_NOTIFICATION_MOVED_OUT:

  153.                             break;
  154.                     }
  155.                     break;

  156.             }
  157.             break;
  158.         default:
  159.             WM_DefaultProc(pMsg);
  160.     }
  161. }


  162. /*********************************************************************
  163. *
  164. *       MainTask
  165. *
  166. **********************************************************************
  167. */
  168. void MainTask(void)
  169. {
  170.     WM_HWIN hDlg;

  171. GUI_Init();
  172.     WM_SetDesktopColor(GUI_BLUE);      /* Automacally update desktop window */
  173.     WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
  174. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  175. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  176. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  177. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  178. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  179. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  180. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  181. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  182. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  183. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  184. /* 创建一个对话框 */
  185.     hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  186. while (1)
  187. {
  188. WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_UPDATE); (3)
  189. GUI_Delay(500);
  190. }

  191. }

复制代码

1. 定义一个用户消息WM_UPDATE。一定要以WM_USER作为起始值,防止跟系统其他的数值冲突。

2. 在回调函数中加入咱们定义的消息WM_UPDATE,实现对话框中背景的更新功能。

3. 通过函数WM_SendMessageNoPara()每隔500ms给对话框发送消息。这里要特别的注意一点,这个函数是给窗口发送消息的,而咱们前面创建的是对话框,所以这里必须得通过函数WM_GetClientWindow得到窗口的句柄。

这个程序的显示效果如下:




34.2 桌面窗口回调函数实例

    这里用上期教程所介绍的自定义消息类型做一个实例。代码跟上期教程的三个实例类似。实现源码如下(可以直接将代码复制到模拟器或者开发板上面运行)。

  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"

  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"


  18. #define WM_UPDATE  WM_USER + 1
  19. /*********************************************************************
  20. *
  21. *       static data
  22. *
  23. **********************************************************************
  24. */
  25. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
  26. static  char ucBackColor;



  27. /*********************************************************************
  28. *
  29. *       Dialog resource
  30. *
  31. * This table conatins the info required to create the dialog.
  32. * It has been created by ucGUIbuilder.
  33. */

  34. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  35.     { FRAMEWIN_CreateIndirect,  "armfly",            0,                       0,  0,  800,480,FRAMEWIN_CF_MOVEABLE,0},
  36.     { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          82, 122,162,37, 0,0},
  37.     { BUTTON_CreateIndirect,    "BUTTON1",           GUI_ID_BUTTON1,          357,123,152,35, 0,0}
  38. };

  39. /*****************************************************************
  40. **      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  41. **      Function: to initialize the Dialog items
  42. **                                                      
  43. **      call this function in _cbCallback --> WM_PAINT
  44. *****************************************************************/

  45. void PaintDialog(WM_MESSAGE * pMsg)
  46. {
  47.     WM_HWIN hWin = pMsg->hWin;
  48. //        GUI_SetBkColor(_acColor[ucBackColor]);
  49. //        GUI_Clear();
  50. }

  51. /*****************************************************************
  52. **      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  53. **      Function: to initialize the Dialog items
  54. **                                                      
  55. **      call this function in _cbCallback --> WM_INIT_DIALOG
  56. *****************************************************************/

  57. void InitDialog(WM_MESSAGE * pMsg)
  58. {
  59.     WM_HWIN hWin = pMsg->hWin;
  60.     //
  61.     //FRAMEWIN
  62.     //
  63.     FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
  64.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  65.     FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  66.     FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  67.     FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  68.     FRAMEWIN_SetTitleHeight(hWin,30);

  69. /* 默认颜色取*/
  70. ucBackColor = 0;
  71. }

  72. /*********************************************************************
  73. *
  74. *       Dialog callback routine
  75. */
  76. static void _cbCallback(WM_MESSAGE * pMsg)
  77. {
  78.     int NCode, Id;
  79.     WM_HWIN hWin = pMsg->hWin;
  80.     switch (pMsg->MsgId)
  81.     {
  82. case WM_PAINT:
  83.             PaintDialog(pMsg);
  84.             break;
  85.         case WM_INIT_DIALOG:
  86.             InitDialog(pMsg);
  87.             break;
  88.         case WM_KEY:
  89.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  90.             {
  91.                 case GUI_KEY_ESCAPE:
  92.                     GUI_EndDialog(hWin, 1);
  93.                     break;
  94.                 case GUI_KEY_ENTER:
  95.                     GUI_EndDialog(hWin, 0);
  96.                     break;
  97.             }
  98.             break;
  99.         case WM_NOTIFY_PARENT:
  100.             Id = WM_GetId(pMsg->hWinSrc);
  101.             NCode = pMsg->Data.v;        
  102.             switch (Id)
  103.             {
  104.                 case GUI_ID_OK:
  105.                     if(NCode==WM_NOTIFICATION_RELEASED)
  106.                         GUI_EndDialog(hWin, 0);
  107.                     break;
  108.                 case GUI_ID_CANCEL:
  109.                     if(NCode==WM_NOTIFICATION_RELEASED)
  110.                         GUI_EndDialog(hWin, 0);
  111.                     break;
  112.                 case GUI_ID_BUTTON0:
  113.                     switch(NCode)
  114.                     {
  115.                         case WM_NOTIFICATION_CLICKED:
  116.                             break;
  117.                         case WM_NOTIFICATION_RELEASED:

  118.                             break;
  119.                         case WM_NOTIFICATION_MOVED_OUT:

  120.                             break;
  121.                     }
  122.                     break;
  123.                 case GUI_ID_BUTTON1:
  124.                     switch(NCode)
  125.                     {
  126.                         case WM_NOTIFICATION_CLICKED:

  127.                             break;
  128.                         case WM_NOTIFICATION_RELEASED:

  129.                             break;
  130.                         case WM_NOTIFICATION_MOVED_OUT:

  131.                             break;
  132.                     }
  133.                     break;

  134.             }
  135.             break;
  136.         default:
  137.             WM_DefaultProc(pMsg);
  138.     }
  139. }

  140. /*********************************************************************
  141. *
  142. *       Dialog callback routine
  143. */
  144. static void _cbBkWindow(WM_MESSAGE * pMsg) (1)
  145. {
  146.     WM_HWIN hWin = pMsg->hWin;

  147.     switch (pMsg->MsgId)
  148.     {
  149. case WM_PAINT:  (2)
  150. GUI_SetBkColor(_acColor[ucBackColor]);
  151. GUI_Clear();
  152.             break;
  153. case WM_UPDATE:(3)
  154. ucBackColor++;
  155. if (ucBackColor == 3)
  156. {
  157. ucBackColor = 0;
  158. }
  159. WM_InvalidateWindow(hWin);
  160.             break;
  161.         default:
  162.             WM_DefaultProc(pMsg);
  163.     }
  164. }

  165. /*********************************************************************
  166. *
  167. *       MainTask
  168. *
  169. **********************************************************************
  170. */
  171. void MainTask(void)
  172. {
  173.     WM_HWIN hDlg;
  174. /*
  175.    使能窗口使用内存设备,这样可以有效避免闪烁 放在GUI_Init前面就包括桌面
  176.    窗口,如果放在后面就不包括桌面窗口。
  177. */
  178. WM_SetCreateFlags(WM_CF_MEMDEV);   (4)
  179. GUI_Init();
  180.     /* 设置桌面窗口回调函数 */
  181. WM_SetCallback(WM_HBKWIN, _cbBkWindow);(5)
  182.     //WM_SetDesktopColor(GUI_BLUE);      /* Automacally update desktop window */ (6)
  183. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  184. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  185. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  186. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  187. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  188. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  189. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  190. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  191. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  192. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  193. /* 创建一个对话框 */
  194.     hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  195. while (1)
  196. {
  197. WM_SendMessageNoPara(WM_HBKWIN, WM_UPDATE);                                                   (7)
  198. GUI_Delay(500);
  199. }

  200. }

复制代码

1. 桌面窗口的回调函数(桌面窗口是emWin最底层的窗口,是初始化后自动创建的)。

2. 重绘消息,用于实现桌面颜色的重绘。

3. 这个是自定义消息,功能和上面34.1小节讲的一样。

4. 使能窗口使用内存设备,这样可以有效的避免闪烁。

5. 通过函数WM_SetCallback来设置桌面窗口的回调函数。

6. 函数WM_SetDesktopColor可以实现桌面窗口颜色的自动重绘。

7. 这里要尤其的注意,系统消息由GUI库发送。请勿从用户应用程序向窗口或小工具发送系统定义的消息。要不会出现异常的。也就是说我们不能发WM_PAINT消息,但是可以发自定义消息,进而来触发重绘。

这个DEMO的功能就是每隔500ms改变一次桌面窗口的颜色,实际显示效果如下:




34.3 官方WM_Redraw.c实例

    这个DEMO在模拟器中的位置:



下面我们将这个代码分析一下:

  1. #include "GUI.h"
  2. #include "WM.h"

  3. /*******************************************************************
  4. *
  5. *       static code
  6. *
  7. ********************************************************************
  8. */
  9. /*******************************************************************
  10. *
  11. *       _cbBkWindow
  12. */
  13. static void _cbBkWindow(WM_MESSAGE* pMsg) {(1)
  14.   switch (pMsg->MsgId) {
  15.   case WM_PAINT:
  16.     GUI_ClearRect(0, 50, 319, 239);(2)
  17.   default:
  18.     WM_DefaultProc(pMsg);
  19.   }
  20. }

  21. /*******************************************************************
  22. *
  23. *       _cbWindow
  24. */
  25. static void _cbWindow(WM_MESSAGE* pMsg) {(3)
  26.   GUI_RECT Rect;

  27.   switch (pMsg->MsgId) {
  28.   case WM_PAINT:
  29.     WM_GetInsideRect(&Rect);(4)
  30.     GUI_SetBkColor(GUI_RED);
  31.     GUI_SetColor(GUI_YELLOW);
  32.     GUI_ClearRectEx(&Rect);(5)
  33.     GUI_DrawRectEx(&Rect);
  34.     GUI_SetColor(GUI_BLACK);
  35.     GUI_SetFont(&GUI_Font8x16);
  36.     GUI_DispStringHCenterAt("Foreground window", 75, 40);
  37.     break;
  38.   default:
  39.     WM_DefaultProc(pMsg);
  40.   }
  41. }

  42. /*******************************************************************
  43. *
  44. *       _MoveWindow
  45. */
  46. static void _MoveWindow(const char* pText) {
  47.   WM_HWIN hWnd;
  48.   int     i;

  49.   //
  50.   // Create foreground window
  51.   //
  52.   hWnd = WM_CreateWindow(10, 50, 150, 100, WM_CF_SHOW, _cbWindow, 0);(6)
  53.   GUI_Delay(500);
  54.   //
  55.   // Move foreground window
  56.   //
  57.   for (i = 0; i < 40; i++) {
  58.     WM_MoveWindow(hWnd, 2, 2);(7)
  59.     GUI_Delay(10);
  60.   }
  61.   //
  62.   // Show text before deleting window if we have one
  63.   //
  64.   if (pText) {
  65.     GUI_DispStringAt(pText, 5, 50);
  66.     GUI_Delay(2500);
  67.   }
  68.   //
  69.   // Delete foreground window
  70.   //
  71.   WM_DeleteWindow(hWnd);(8)
  72.   WM_Invalidate(WM_HBKWIN);(9)
  73.   GUI_Exec();
  74. }

  75. /*******************************************************************
  76. *
  77. *       _DemoRedraw
  78. */
  79. static void _DemoRedraw(void) {
  80.   WM_CALLBACK * _cbOldBk;

  81.   GUI_SetBkColor(GUI_BLACK);
  82.   GUI_Clear();
  83.   GUI_SetColor(GUI_WHITE);
  84.   GUI_SetFont(&GUI_Font24_ASCII);
  85.   GUI_DispStringHCenterAt("WM_Redraw - Sample", 160, 5);
  86.   GUI_SetFont(&GUI_Font8x16);
  87.   while(1) {
  88.     //
  89.     // Move a window over background
  90.     //
  91.     _MoveWindow("Background has not been redrawn");(10)
  92.     //
  93.     // Clear background
  94.     //
  95.     GUI_ClearRect(0, 50, 319, 239);
  96.     GUI_Delay(1000);
  97.     //
  98.     // Set callback for background window
  99.     //
  100.     _cbOldBk = WM_SetCallback(WM_HBKWIN, _cbBkWindow);(11)
  101.     //
  102.     // Move a window over background
  103.     //
  104.     _MoveWindow("Background has been redrawn");
  105.     //
  106.     // Delete callback for Background window
  107.     //
  108.     WM_SetCallback(WM_HBKWIN, _cbOldBk);(12)
  109.   }
  110. }

  111. /*********************************************************************
  112. *
  113. *       Public code
  114. *
  115. **********************************************************************
  116. */
  117. /*********************************************************************
  118. *
  119. *       MainTask
  120. */
  121. void MainTask(void) {
  122.   GUI_Init();
  123.   _DemoRedraw();
  124. }

复制代码

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 总结

    本期教程就跟大家讲这么多,希望通过本期教程让大家对窗口管理器有更好的认识,不过还需要大家在模拟器或者开发板上面多做这方面的练习。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top