硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2042|回复: 6
收起左侧

[emWin教程入门篇] 【emWin实战教程V2.0】第38章      窗口管理器官方

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2017-2-18 16:30:23 | 显示全部楼层 |阅读模式
完整65章+12章附件教程下载地址:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=19834




第38章      窗口管理器官方实例简单讲解


    为了帮助大家更好的理解窗口管理器的回调和消息机制,官方也提供了好几个这方面的例子,本章节我们将官方这几个例子也跟大家进行简单讲解,进一步帮助大家更好的学习窗口管理器。
38.1 初学者重要提示
38.2 官方WM_Redraw.c实例讲解
38.3  官方WM_Sample.c实例讲解(含大量窗口API操作)
38.4 官方WM_LateClipping.c实例讲解
38.5 官方WM_Video.c实例讲解
38.6 总结
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-18 16:31:34 | 显示全部楼层
38.1  初学者重要提示


u  通过实例来学习emWin是最佳的学习捷径。
u  本章节讲解的例子中用到的部分功能还没有讲解到,但是不影响大家学习窗口管理器相关的知识。没有讲解到的知识基本都会在后面章节中跟大家讲解。
u  窗口管理器这块的API函数应该是emWin手册所有章节中函数最多的,以后需要用到什么功能了,查询就行,或者看官方的实例,哪个函数不理解了也可以查手册。下图是中文版手册里面API函数位置:
38.1.png


下图是英文版手册里面API函数的位置:
38.2.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-18 16:33:25 | 显示全部楼层
38.2 官方WM_Redraw.c实例讲解


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


主要功能介绍:
        这个例子与第37章37.3小节中的例子相似,分别演示桌面窗口配置了重绘操作和不配置重绘操作下,移动窗口的效果。其实不光在桌面窗口上面移动窗口要重绘,其它创建的窗口上面移动是一样的,也需要设置重绘。如果用户新窗口的窗口回调函数里面没有写重绘消息WM_PAINT,窗口管理器就会按照系统默认的颜色的进行重绘,如果用户写了WM_PAINT消息就会按照用户设置的进行重绘。
下面我们将这个代码分析一下:
  1. #include "GUI.h"
  2. #include "WM.h"
  3. /*********************************************************************
  4. *
  5. *       Defines
  6. *
  7. **********************************************************************
  8. */
  9. //
  10. // Recommended memory to run the sample with adequate performance
  11. //
  12. #define RECOMMENDED_MEMORY (1024L * 5)
  13. /*******************************************************************
  14. *
  15. *       static code
  16. *
  17. ********************************************************************
  18. */
  19. /*******************************************************************
  20. *
  21. *       _cbBkWindow
  22. */
  23. static void _cbBkWindow(WM_MESSAGE* pMsg) {      //--------------(1)
  24.   switch (pMsg->MsgId) {
  25.   case WM_PAINT:
  26.     GUI_ClearRect(0, 50, 319, 239); //--------------(2)
  27.   default:
  28.     WM_DefaultProc(pMsg);
  29.   }
  30. }
  31. /*******************************************************************
  32. *
  33. *       _cbWindow
  34. */
  35. static void _cbWindow(WM_MESSAGE* pMsg) {  //--------------(3)
  36.   GUI_RECT Rect;
  37.   switch (pMsg->MsgId) {
  38.   case WM_PAINT:
  39.     WM_GetInsideRect(&Rect); //--------------(4)
  40.     GUI_SetBkColor(GUI_RED);
  41.     GUI_SetColor(GUI_YELLOW);
  42.     GUI_ClearRectEx(&Rect); //--------------(5)
  43.     GUI_DrawRectEx(&Rect);
  44.     GUI_SetColor(GUI_BLACK);
  45.     GUI_SetFont(&GUI_Font8x16);
  46.     GUI_DispStringHCenterAt("Foreground window", 75, 40);
  47.     break;
  48.   default:
  49.     WM_DefaultProc(pMsg);
  50.   }
  51. }
  52. /*******************************************************************
  53. *
  54. *       _MoveWindow
  55. */
  56. static void _MoveWindow(const char* pText) {
  57.   WM_HWIN hWnd;
  58.   int     i;
  59.   //
  60.   // Create foreground window
  61.   //
  62.   hWnd = WM_CreateWindow(10, 50, 150, 100, WM_CF_SHOW, _cbWindow, 0); //--------------(6)
  63.   GUI_Delay(500);
  64.   //
  65.   // Move foreground window
  66.   //
  67.   for (i = 0; i < 40; i++) {
  68.     WM_MoveWindow(hWnd, 2, 2); //--------------(7)
  69.     GUI_Delay(10);
  70.   }
  71.   //
  72.   // Show text before deleting window if we have one
  73.   //
  74.   if (pText) {
  75.     GUI_DispStringAt(pText, 5, 50);
  76.     GUI_Delay(2500);
  77.   }
  78.   //
  79.   // Delete foreground window
  80.   //
  81.   WM_DeleteWindow(hWnd); //--------------(8)
  82.   WM_Invalidate(WM_HBKWIN); //--------------(9)
  83.   GUI_Exec();
  84. }
  85. /*******************************************************************
  86. *
  87. *       _DemoRedraw
  88. */
  89. static void _DemoRedraw(void) {
  90.   WM_CALLBACK * _cbOldBk;
  91.   GUI_SetBkColor(GUI_BLACK);
  92.   GUI_Clear();
  93.   GUI_SetColor(GUI_WHITE);
  94.   GUI_SetFont(&GUI_Font24_ASCII);
  95.   GUI_DispStringHCenterAt("WM_Redraw - Sample", 160, 5);
  96.   GUI_SetFont(&GUI_Font8x16);
  97.   while(1) {
  98.     //
  99.     // Move a window over background
  100.     //
  101.     _MoveWindow("Background has not been redrawn");  //--------------(10)
  102.     //
  103.     // Clear background
  104.     //
  105.     GUI_ClearRect(0, 50, 319, 239);
  106.     GUI_Delay(1000);
  107.     //
  108.     // Set callback for background window
  109.     //
  110.     _cbOldBk = WM_SetCallback(WM_HBKWIN, _cbBkWindow); //--------------(11)
  111.     //
  112.     // Move a window over background
  113.     //
  114.     _MoveWindow("Background has been redrawn");
  115.     //
  116.     // Delete callback for Background window
  117.     //
  118.     WM_SetCallback(WM_HBKWIN, _cbOldBk); //--------------(12)
  119.   }
  120. }
  121. /*********************************************************************
  122. *
  123. *       Public code
  124. *
  125. **********************************************************************
  126. */
  127. /*********************************************************************
  128. *
  129. *       MainTask
  130. */
  131. void MainTask(void) {
  132.   GUI_Init();
  133.   //
  134.   // Check if recommended memory for the sample is available
  135.   //
  136.   if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  137.     GUI_ErrorOut("Not enough memory available.");
  138.     return;
  139.   }
  140.   _DemoRedraw();
  141. }
复制代码
1.     桌面窗口回调函数。
2.     在桌面窗口回调函数的WM_PAINT消息中刷一块矩形区域。
3.     另外一个新创建窗口的回调函数。
4.     函数WM_GetInsideRect返回客户区的坐标,即实际可供用户使用的显示区。
5.     调用函数GUI_ClearRectEx清屏一块矩形区。
6.     函数WM_CreateWindow用来创建一个窗口,其中每个参数的含义需要大家详细研究官方手册,这里就不做解释了。
7.     通过函数WM_MoveWindow()实现窗口位置的移动,注意这里移动的是相对距离
8.     删除创建的窗口。
9.     通过函数WM_Invalidate(WM_HBKWIN)使得桌面窗口无效,然后调用函数GUI_Exec()就会通过窗口管理给桌面窗口回调函数发送WM_PAINT消息,从而执行重绘。
10.  执行第一种情况:移动窗口,但是不做桌面窗口的重绘。
11.  给桌面窗口设置专门的回调函数。
12.  执行第二种情况:移动窗口,并执行桌面窗口的重绘。
        这个实例主要演示了两种情况,一种是演示:移动窗口的情况下,但是不做桌面窗口的重绘。另一种是:移动窗口,并执行桌面窗口的重绘。通过这两种情况的演示可以帮助大家对回调函数有一个更好的认识。
第一种情况:没有执行桌面回调函数的显示效果
38.4.png


第二种情况:执行桌面回调函数的显示效果
38.5.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-18 16:35:43 | 显示全部楼层
38.3   官方WM_Sample.c实例讲解(含大量窗口API操作)


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


主要功能介绍:
        这个例子最主要的特点是将大部分窗口管理器的API函数都进行了调用,方便用户查看演示效果。如果那个函数不太会使用了,看这个例子也是比较方便。
下面我们将这个代码分析一下,这里捡几个重要的部分跟大家讲解一下:

38.3.1   桌面窗口回调函数自定义消息的使用

  1. #define MSG_CHANGE_TEXT     (WM_USER + 0) //--------------(1)
  2. /*******************************************************************
  3. *
  4. *       _ChangeInfoText
  5. *
  6. * Function description
  7. *   Sends a message to the background window and invalidate it, so
  8. *   the callback of the background window display the new text.
  9. */
  10. static void _ChangeInfoText(char * pStr) { //--------------(2)
  11.   WM_MESSAGE Message;
  12.   Message.MsgId  = MSG_CHANGE_TEXT;
  13.   Message.Data.p = pStr;
  14.   WM_SendMessage(WM_HBKWIN, &Message);
  15.   WM_InvalidateWindow(WM_HBKWIN);
  16. }
  17. /*******************************************************************
  18. *
  19. *       _DrawInfoText
  20. *
  21. * Function description
  22. *   Drawes the info text directly on the display. This function is for
  23. *   the moments when no callback is set.
  24. */
  25. static void _DrawInfoText(char * pStr) { //--------------(3)
  26.   GUI_SetColor(GUI_WHITE);
  27.   GUI_SetFont(&GUI_Font24_ASCII);
  28.   GUI_DispStringHCenterAt("WindowManager - Sample", 160, 5);
  29.   GUI_SetFont(&GUI_Font8x16);
  30.   GUI_DispStringAtCEOL(pStr, 5, 40);
  31. }
  32. /*******************************************************************
  33. *
  34. *       _cbBkWindow
  35. */
  36. static void _cbBkWindow(WM_MESSAGE * pMsg) {
  37.   switch (pMsg->MsgId) {
  38.   case MSG_CHANGE_TEXT: //--------------(4)
  39.     strcpy(_acInfoText, (char const *)pMsg->Data.p); //--------------(5)
  40.   case WM_PAINT:        //--------------(6)
  41.     GUI_SetBkColor(GUI_BLACK);
  42.     GUI_Clear();
  43.     GUI_SetColor(GUI_WHITE);
  44.     GUI_SetFont(&GUI_Font24_ASCII);
  45.     GUI_DispStringHCenterAt("WindowManager - Sample", 160, 5);
  46.     GUI_SetFont(&GUI_Font8x16);
  47.     GUI_DispStringAt(_acInfoText, 5, 40);
  48.     break;
  49.   default:
  50.     WM_DefaultProc(pMsg);
  51.   }
  52. }
复制代码
这部分代码主要学习消息发送函数WM_SendMessage的使用,第37章的37.2小节学习了无参数的消息发送函数WM_SendMessageNoPara,而函数WM_SendMessage是带参数的。
1.     用户自定义的消息ID,使用的时候一定要以WM_USER作为起始值,防止跟系统其他的数值冲突。如果还要实现其它自定义消息,在这个数值的基础上面定义即可。
2.    通过用户自定义的消息实现给桌面窗口的回调函数发送数据。调用了函数WM_SendMessage(WM_HBKWIN, &Message)后会给桌面窗口的回调函数发送数据,再调用了函数WM_Invalidate(WM_HBKWIN)使得桌面窗口无效,然后调用函数GUI_Delay()就会通过窗口管理给桌面窗口回调函数发送WM_PAINT消息,从而执行重绘。

3.     文本显示函数。
4.     用户自定义消息ID。
5.     字符串复制,将Data.p中的数据复制到_acInfoText中。
6.     在WM_PAINT消息中显示文本acInfoText。

38.3.2   Redrawing部分演示

  1. /*******************************************************************
  2. *
  3. *       _LiftUp
  4. */
  5. static void _LiftUp(int dy) {//--------------(1)
  6.   int i;
  7.   int tm;
  8.   for (i = 0; i < (dy/4); i++) {
  9.     tm = GUI_GetTime();
  10.     WM_MoveWindow(_hWindow1, 0, -4);
  11.     WM_MoveWindow(_hWindow2, 0, -4);
  12.     while ((GUI_GetTime() - tm) < 20) {
  13.       WM_Exec();
  14.     }
  15.   }
  16. }
  17. /*******************************************************************
  18. *
  19. *       _LiftDown
  20. */
  21. static void _LiftDown(int dy) { //--------------(2)
  22.   int i;
  23.   int tm;
  24.   for (i = 0; i < (dy/4); i++) {
  25.     tm = GUI_GetTime();
  26.     WM_MoveWindow(_hWindow1, 0, 4);
  27.     WM_MoveWindow(_hWindow2, 0, 4);
  28.     while ((GUI_GetTime() - tm) < 20) {
  29.       WM_Exec();
  30.     }
  31.   }
  32. }
  33. /*******************************************************************
  34. *
  35. *       _DemoRedrawing
  36. *
  37. * Function description
  38. *   Demonstrates how useful can be a callback
  39. */
  40. static void _DemoRedrawing(void) {
  41.   int i;
  42.   int tm;
  43.   int tDiff;
  44.   _ChangeInfoText("Demonstrating redrawing");
  45.   GUI_Delay(SPEED);
  46.   _LiftUp(40);
  47.   GUI_Delay(SPEED/3);
  48.   _ChangeInfoText("Using a callback for redrawing");
  49.   GUI_Delay(SPEED/3);
  50.   for (i = 0; i < 55; i++) {
  51.     tm = GUI_GetTime();
  52.     WM_MoveWindow(_hWindow1,  1,  1);
  53.     WM_MoveWindow(_hWindow2, -1, -1);
  54.     tDiff = 15 - (GUI_GetTime() - tm);
  55.     GUI_Delay(tDiff);
  56.   }
  57.   for (i = 0; i < 55; i++) {
  58.     tm = GUI_GetTime();
  59.     WM_MoveWindow(_hWindow1, -1, -1);
  60.     WM_MoveWindow(_hWindow2,  1,  1);
  61.     tDiff = 15 - (GUI_GetTime() - tm);
  62.     GUI_Delay(tDiff);
  63.   }
  64.   GUI_Delay(SPEED/4);
  65.   _LiftDown(30);
  66.   GUI_Delay(SPEED/2);
  67.   _ChangeInfoText("Without redrawing");
  68.   GUI_Delay(SPEED);
  69.   _LiftUp(30);
  70.   GUI_Delay(SPEED/4);
  71.   WM_SetCallback(WM_HBKWIN, _cbBkWindowOld);
  72.   for (i = 0; i < 55; i++) {
  73.     tm = GUI_GetTime();
  74.     WM_MoveWindow(_hWindow1,  1,  1);
  75.     WM_MoveWindow(_hWindow2, -1, -1);
  76.     tDiff = 15 - (GUI_GetTime() - tm);
  77.     GUI_Delay(tDiff);
  78.   }
  79.   for (i = 0; i < 55; i++) {
  80.     tm = GUI_GetTime();
  81.     WM_MoveWindow(_hWindow1, -1, -1);
  82.     WM_MoveWindow(_hWindow2,  1,  1);
  83.     tDiff = 15 - (GUI_GetTime() - tm);
  84.     GUI_Delay(tDiff);
  85.   }
  86.   GUI_Delay(SPEED/3);
  87.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  88.   _LiftDown(40);
  89.   GUI_Delay(SPEED);
  90. }
复制代码
这部分代码实现了两个窗口在具有重绘和不具有重绘功能时的演示,还有一个重点是学习窗口移动函数WM_MoveWindow的使用,这个函数是实现相对移动,相对于窗口当前所在的位置。另外还一个窗口移动函数WM_MoveTo是绝对位置移动,设置移动到那个坐标点就移动到那个坐标点。
1.     实现两个窗口向上移动。
2.     实现两个窗口向下移动。
显示效果如下:
38.7.png



38.3.3   Resize部分演示

  1. /*******************************************************************
  2. *
  3. *       _DemoResizeWindow
  4. *
  5. * Function description
  6. *   Demonstrates the use of WM_ResizeWindow
  7. */
  8. static void _DemoResizeWindow(void) {
  9.   int i;
  10.   int tm;
  11.   int tDiff;
  12.   _ChangeInfoText("WM_ResizeWindow()");
  13.   GUI_Delay(SPEED);
  14.   _LiftUp(30);
  15.   for (i = 0; i < 20; i++) {
  16.     tm = GUI_GetTime();
  17.     WM_ResizeWindow(_hWindow1,  1,  1);
  18.     WM_ResizeWindow(_hWindow2, -1, -1);
  19.     tDiff = 15 - (GUI_GetTime() - tm);
  20.     GUI_Delay(tDiff);
  21.   }
  22.   for (i = 0; i < 40; i++) {
  23.     tm = GUI_GetTime();
  24.     WM_ResizeWindow(_hWindow1, -1, -1);
  25.     WM_ResizeWindow(_hWindow2,  1,  1);
  26.     tDiff = 15 - (GUI_GetTime() - tm);
  27.     GUI_Delay(tDiff);
  28.   }
  29.   for (i = 0; i < 20; i++) {
  30.     tm = GUI_GetTime();
  31.     WM_ResizeWindow(_hWindow1,  1,  1);
  32.     WM_ResizeWindow(_hWindow2, -1, -1);
  33.     tDiff = 15 - (GUI_GetTime() - tm);
  34.     GUI_Delay(tDiff);
  35.   }
  36.   _LiftDown(30);
  37.   GUI_Delay(SPEED);
  38. }
复制代码
这部分演示主要看窗口加大和减小函数WM_ResizeWindow()的使用,注意这个函数是对窗口的显示大小进行加大和减小,并不是进行放缩,显示效果如下:
38.8.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-18 16:37:21 | 显示全部楼层
38.4官方WM_LateClipping.c实例讲解


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


主要功能介绍:
     这个例子依然主要演示回调函数的重绘机制,作为重绘机制方面的学习,比较有参考价值。
下面我们将这个代码分析一下:
  1. #include "GUI.h"
  2. #include "WM.h"
  3. #include "FRAMEWIN.h"
  4. #include "BUTTON.h"
  5. /*********************************************************************
  6. *
  7. *       Defines
  8. *
  9. **********************************************************************
  10. */
  11. //
  12. // Recommended memory to run the sample with adequate performance
  13. //
  14. #define RECOMMENDED_MEMORY (1024L * 5)
  15. /*********************************************************************
  16. *
  17. *       Static data
  18. *
  19. **********************************************************************
  20. */
  21. static WM_HWIN _hWin1;
  22. static WM_HWIN _hWin2;
  23. static WM_HWIN _hBut1;
  24. static WM_HWIN _hBut2;
  25. static int     _PaintCount1;
  26. static int     _PaintCount2;
  27. static GUI_COLOR _aColors[] = {
  28.   0x0000FF, 0x00FF00, 0xFF0000, 0x00FFFF, 0xA000A0, 0xFFFF00
  29. };
  30. /*********************************************************************
  31. *
  32. *       Static code
  33. *
  34. **********************************************************************
  35. */
  36. /*********************************************************************
  37. *
  38. *       _cbBkWin
  39. */
  40. static void _cbBkWin(WM_MESSAGE* pMsg) { //--------------(1)
  41.   switch(pMsg->MsgId) {
  42.   case WM_PAINT:     //--------------(2)
  43.     GUI_SetBkColor(GUI_BLACK);
  44.     GUI_Clear();
  45.     GUI_SetColor(0x0060FF);
  46.     GUI_DispStringAt("PaintCount (Early):", 0, 0);
  47.     GUI_DispDecAt(_PaintCount1, 120, 0, 5);
  48.     GUI_SetColor(0x00FFC0);
  49.     GUI_DispStringAt("PaintCount (Late):", 0, 12);
  50.     GUI_DispDecAt(_PaintCount2, 120, 12, 5);
  51.     break;
  52.   case WM_NOTIFY_PARENT:
  53.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
  54.       if (pMsg->hWinSrc == _hBut1) { //--------------(3)
  55.         WM_InvalidateWindow(_hWin1);
  56.         WM_InvalidateWindow(_hWin2);
  57.       } else if (pMsg->hWinSrc == _hBut2) { //--------------(4)
  58.         _PaintCount1 = 0;
  59.         _PaintCount2 = 0;
  60.         WM_InvalidateWindow(pMsg->hWin);
  61.       }
  62.     }
  63.     break;
  64.   default:
  65.     WM_DefaultProc(pMsg);
  66.   }
  67. }
  68. /*********************************************************************
  69. *
  70. *       _cbTop
  71. */
  72. static void _cbTop(WM_MESSAGE* pMsg) { //--------------(5)
  73.   switch(pMsg->MsgId) {
  74.   case WM_PAINT:
  75.     GUI_SetBkColor(GUI_MAGENTA);
  76.     GUI_Clear();
  77.     break;
  78.   default:
  79.     WM_DefaultProc(pMsg);
  80.   }
  81. }
  82. /*********************************************************************
  83. *
  84. *       _cbFrameWin1
  85. */
  86. static void _cbFrameWin1(WM_MESSAGE* pMsg) { //--------------(6)
  87.   switch(pMsg->MsgId) {
  88.   case WM_PAINT:
  89.     GUI_SetBkColor(_aColors[_PaintCount1 % 6]);
  90.     GUI_Clear();
  91.     GUI_SetColor(0x0060FF);
  92.     GUI_FillCircle(25, 25, 15);
  93.     GUI_SetColor(GUI_BLACK);
  94.     GUI_DrawCircle(25, 25, 15);
  95.     _PaintCount1++;
  96.     WM_InvalidateWindow(WM_HBKWIN);
  97.     break;
  98.   default:
  99.     WM_DefaultProc(pMsg);
  100.   }
  101. }
  102. /*********************************************************************
  103. *
  104. *       _cbFrameWin2
  105. */
  106. static void _cbFrameWin2(WM_MESSAGE* pMsg) { //--------------(7)
  107.   switch(pMsg->MsgId) {
  108.   case WM_PAINT:
  109.     GUI_SetBkColor(_aColors[_PaintCount2 % 6]);
  110.     GUI_Clear();
  111.     GUI_SetColor(0x00FFC0);
  112.     GUI_FillCircle(25, 25, 15);
  113.     GUI_SetColor(GUI_BLACK);
  114.     GUI_DrawCircle(25, 25, 15);
  115.     _PaintCount2++;
  116.     WM_InvalidateWindow(WM_HBKWIN);
  117.     break;
  118.   default:
  119.     WM_DefaultProc(pMsg);
  120.   }
  121. }
  122. /*********************************************************************
  123. *
  124. *       _ShowDemo
  125. */
  126. static void _ShowDemo(void) {
  127.   WM_HWIN hWin0;
  128.   WM_HWIN hWin1;
  129.   WM_HWIN hWin2;
  130.   WM_HWIN hFrame1;
  131.   WM_HWIN hFrame2;
  132.   WM_HWIN hClient1;
  133.   WM_HWIN hClient2;
  134.   WM_SetCallback(WM_HBKWIN, _cbBkWin); //--------------(8)
  135.   hFrame1  = FRAMEWIN_CreateEx( 10, 30, 140, 140, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Early Clipping", _cbFrameWin1);
  136.   hFrame2  = FRAMEWIN_CreateEx(170, 30, 140, 140, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Late Clipping",
  137. _cbFrameWin2);
  138.   hClient1 = WM_GetClientWindow(hFrame1);
  139.   hClient2 = WM_GetClientWindow(hFrame2);
  140.   _hWin1  = WM_CreateWindowAsChild(0, 0, WM_GetWindowSizeX(hClient1), WM_GetWindowSizeY(hClient1), hClient1,
  141. WM_CF_SHOW, _cbFrameWin1, 0);
  142.   _hWin2  = WM_CreateWindowAsChild(0, 0, WM_GetWindowSizeX(hClient2), WM_GetWindowSizeY(hClient2), hClient2,
  143. WM_CF_SHOW | WM_CF_LATE_CLIP, _cbFrameWin2, 0);
  144.   _hBut1  = BUTTON_CreateEx(10, 210, 140, 20, 0, WM_CF_SHOW, 0, 1);
  145.   _hBut2  = BUTTON_CreateEx(170, 210, 140, 20, 0, WM_CF_SHOW, 0, 2);
  146.   hWin0 = FRAMEWIN_CreateEx(60,  80, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 0",
  147. _cbTop);
  148.   hWin1 = FRAMEWIN_CreateEx(220, 80, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 1",
  149. _cbTop);
  150.   hWin2 = FRAMEWIN_CreateEx(140,170, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 2",
  151. _cbTop);
  152.   FRAMEWIN_SetResizeable(hWin0, 1);
  153.   FRAMEWIN_SetResizeable(hWin1, 1);
  154.   FRAMEWIN_SetResizeable(hWin2, 1);
  155.   BUTTON_SetText(_hBut1, "Invalidate");
  156.   BUTTON_SetText(_hBut2, "Reset counters");
  157.   while(1) {
  158.     GUI_Delay(50);
  159.   }
  160. }
  161. /*********************************************************************
  162. *
  163. *       Public code
  164. *
  165. **********************************************************************
  166. */
  167. /*********************************************************************
  168. *
  169. *       MainTask
  170. */
  171. void MainTask(void) {
  172.   GUI_Init();
  173.   //
  174.   // Check if recommended memory for the sample is available
  175.   //
  176.   if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  177.     GUI_ErrorOut("Not enough memory available.");
  178.     return;
  179.   }
  180.   while(1) {
  181.     _ShowDemo();
  182.   }
  183. }
复制代码
1.     桌面窗口回调函数。
2.     桌面窗口回调函数中重绘消息WM_PAINT。
3.     由于两个按钮是创建在桌面窗口上面的,所以按钮的WM_NOTIFICATION_RELEASED(通知代码消息类型)是在桌面窗口的回调函数中。这个按钮按下后将窗口_hWin1和窗口_hWin2无效,从而会执行这两个窗口的背景重绘功能。
4.     同上,只不过这里实现的功能是将两个计数值清零,并使桌面窗口无效,从而执行桌面窗口的重绘消息。
5.     此函数同时是hWin0,hWin1,hWin2三个框架窗口的回调函数。
6.     此函数是框架窗口hFrame1的回调函数,回调函数中主要实现了重绘消息,重绘消息中记录了重绘的次数,并根据重绘次数修改背景颜色。
7.     此函数是框架窗口hFrame2的回调函数,回调函数中主要实现了重绘消息,重绘消息中记录了重绘的次数,并根据重绘次数修改背景颜色。
8.     (1) 先创建两个框架窗口hFrame1和hFrame2。
        (2) 分别在这两个框架窗口中创建两个子窗口_hWin1和_hWin2。
        (3) 创建两个按钮_hBut1和_hBut2。
        (4) 创建三个框架窗口hWin0,hWin1和hWin2。
这个例子对于研究回调函数函数还是非常好的,大家可以在这个例子的基础上做一些修改,实现一些功能,显示效果如下:
38.10.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-18 16:38:56 | 显示全部楼层
38.5 官方WM_Video.c实例讲解


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


主要功能介绍:
         这个例子主要演示框架窗口的创建,删除,隐藏和显示,关于框架窗口暂时还没有讲到,后面章节会专门讲解,跟普通窗口差不多,只是多了一个标题栏,所以将其放在本章节进行讲解也是可以的,用来学习窗口相关的API函数操作。
下面我们将这个代码分析一下:
  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include "WM.h"
  4. #include "GUI.h"
  5. #include "FRAMEWIN.h"
  6. #include "BUTTON.h"
  7. #include "TEXT.h"
  8. static void _cbFrameWinTest(WM_MESSAGE * pMsg);
  9. /*********************************************************************
  10. *
  11. *       Defines
  12. *
  13. **********************************************************************
  14. */
  15. #define MAX_WINDOWS   50
  16. //
  17. // Recommended memory to run the sample with adequate performance
  18. //
  19. #define RECOMMENDED_MEMORY (1024L * 5)
  20. /*********************************************************************
  21. *
  22. *       Static data
  23. *
  24. **********************************************************************
  25. */
  26. static WM_HWIN _ahWin[MAX_WINDOWS];
  27. static char    _IsCompletelyVis;
  28. /*********************************************************************
  29. *
  30. *       Static code
  31. *
  32. **********************************************************************
  33. */
  34. /*********************************************************************
  35. *
  36. *       _CreateWindow
  37. */
  38. static void _CreateWindow(void) {  //--------------(1)
  39.   unsigned i;
  40.   WM_HWIN  hWin;
  41.   char     ac[32];
  42.   int      j;
  43.   for (i = 0; i < MAX_WINDOWS; i++) {
  44.     if (_ahWin[i] == 0) {
  45.       j = i + 1;
  46.       sprintf(ac, "Test window %d", j);
  47.       hWin = FRAMEWIN_CreateEx(5 + 10 * i, 135 + 10 * i, 120, 60, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, ac,
  48. _cbFrameWinTest);
  49.       FRAMEWIN_SetClientColor(hWin, GUI_INVALID_COLOR);
  50.       _ahWin[i] = hWin;
  51.       break;
  52.     }
  53.   }
  54. }
  55. /*********************************************************************
  56. *
  57. *       _DeleteWindow
  58. */
  59. static void _DeleteWindow(void) {  //--------------(2)
  60.   unsigned i;
  61.   for (i = 0; i < MAX_WINDOWS; i++) {
  62.     if (WM_IsVisible(_ahWin[i])) {
  63.       WM_DeleteWindow(_ahWin[i]);
  64.       _ahWin[i] = 0;
  65.       break;
  66.     }
  67.   }
  68. }
  69. /*********************************************************************
  70. *
  71. *       _ShowWindow
  72. */
  73. static void _ShowWindow(void) {  //--------------(3)
  74.   unsigned i;
  75.   for (i = 0; i < MAX_WINDOWS; i++) {
  76.     if (_ahWin[i] != 0) {
  77.       if (WM_IsVisible(_ahWin[i]) == 0) {
  78.         WM_ShowWindow(_ahWin[i]);
  79.         break;
  80.       }
  81.     }
  82.   }
  83. }
  84. /*********************************************************************
  85. *
  86. *       _HideWindow
  87. */
  88. static void _HideWindow(void) {  //--------------(4)
  89.   unsigned i;
  90.   for (i = 0; i < MAX_WINDOWS; i++) {
  91.     if (WM_IsVisible(_ahWin[i])) {
  92.       WM_HideWindow(_ahWin[i]);
  93.       break;
  94.     }
  95.   }
  96. }
  97. /*********************************************************************
  98. *
  99. *       Static code, callbacks
  100. *
  101. **********************************************************************
  102. */
  103. /*********************************************************************
  104. *
  105. *       _cbBkWin
  106. */
  107. static void _cbBkWin(WM_MESSAGE* pMsg) {  //--------------(5)
  108.   int Id;
  109.   switch (pMsg->MsgId) {
  110.   case WM_PAINT:
  111.     GUI_SetBkColor(GUI_BLACK);
  112.     GUI_Clear();
  113.     break;
  114.   case WM_NOTIFY_PARENT:
  115.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
  116.       Id = WM_GetId(pMsg->hWinSrc);
  117.       switch (Id) {
  118.       case GUI_ID_BUTTON0:
  119.         _CreateWindow();
  120.         break;
  121.       case GUI_ID_BUTTON1:
  122.         _DeleteWindow();
  123.         break;
  124.       case GUI_ID_BUTTON2:
  125.         _ShowWindow();
  126.         break;
  127.       case GUI_ID_BUTTON3:
  128.         _HideWindow();
  129.         break;
  130.       }
  131.     }
  132.     break;
  133.   default:
  134.     WM_DefaultProc(pMsg);
  135.   }
  136. }
  137. /*********************************************************************
  138. *
  139. *       _cbFrameWinVideo
  140. */
  141. static void _cbFrameWinVideo(WM_MESSAGE* pMsg) {  //--------------(6)
  142.   WM_HWIN hWin;
  143.   WM_HWIN hText;
  144.   int     IsCompletelyVis;
  145.   int     IsCompletelyCovered;
  146.   switch (pMsg->MsgId) {
  147.   case WM_PAINT:
  148.     if (_IsCompletelyVis) {
  149.       GUI_SetBkColor(GUI_DARKGREEN);
  150.       GUI_Clear();
  151.       GUI_SetColor(GUI_WHITE);
  152.       GUI_DispStringAt("Completely visible", 5, 5);
  153.     } else {
  154.       GUI_SetBkColor(GUI_GRAY);
  155.       GUI_Clear();
  156.       GUI_SetColor(GUI_WHITE);
  157.       GUI_DispStringAt("Not completely visible", 5, 5);
  158.     }
  159.     break;
  160.   case WM_NOTIFY_VIS_CHANGED:
  161.     hText = WM_GetDialogItem(WM_HBKWIN, GUI_ID_TEXT1);
  162.     hWin  = WM_GetClientWindow(pMsg->hWin);
  163.     IsCompletelyVis     = WM_IsCompletelyVisible(hWin);
  164.     IsCompletelyCovered = WM_IsCompletelyCovered(hWin);
  165.     if (IsCompletelyCovered) {
  166.       TEXT_SetText(hText, "completely\\ncovered");
  167.     } else {
  168.       TEXT_SetText(hText, "not completely\\ncovered");
  169.     }
  170.     if (_IsCompletelyVis != IsCompletelyVis) {
  171.       _IsCompletelyVis = IsCompletelyVis;
  172.       WM_InvalidateWindow(hWin);    /* Only required if content changes if partially hidden */
  173.     }
  174.     break;
  175.   default:
  176.     WM_DefaultProc(pMsg);
  177.   }
  178. }
  179. /*********************************************************************
  180. *
  181. *       _cbFrameWinTest
  182. */
  183. static void _cbFrameWinTest(WM_MESSAGE* pMsg) {  //--------------(7)
  184.   switch (pMsg->MsgId) {
  185.   case WM_PAINT:
  186.     GUI_SetBkColor(GUI_DARKRED);
  187.     GUI_Clear();
  188.     break;
  189.   default:
  190.     WM_DefaultProc(pMsg);
  191.   }
  192. }
  193. /*********************************************************************
  194. *
  195. *       Public code
  196. *
  197. **********************************************************************
  198. */
  199. /*********************************************************************
  200. *
  201. *       MainTask
  202. */
  203. void MainTask(void) {
  204.   FRAMEWIN_Handle hWinVideo;
  205.   BUTTON_Handle   hBut;
  206.   WM_HWIN         hText;
  207.   GUI_Init();
  208.   //
  209.   // Check if recommended memory for the sample is available
  210.   //
  211.   if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  212.     GUI_ErrorOut("Not enough memory available.");
  213.     return;
  214.   }
  215.   WM_SetCallback(WM_HBKWIN, _cbBkWin);
  216.   //--------------(8)
  217.   hText = TEXT_CreateEx(240,  85, 80, 26, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_TEXT0, "The client\\nwindow is");
  218.   TEXT_SetTextColor(hText, GUI_WHITE);
  219.   hText = TEXT_CreateEx(240, 111, 80, 26, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_TEXT1, NULL);
  220.   TEXT_SetTextColor(hText, GUI_WHITE);
  221.   //
  222.   // Create buttons
  223.   //
  224.   hBut = BUTTON_CreateEx(240,  5, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON0);
  225.   BUTTON_SetText(hBut, "Create win");
  226.   hBut = BUTTON_CreateEx(240, 25, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON1);
  227.   BUTTON_SetText(hBut, "Delete win");
  228.   hBut = BUTTON_CreateEx(240, 45, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON2);
  229.   BUTTON_SetText(hBut, "Show win");
  230.   hBut = BUTTON_CreateEx(240, 65, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON3);
  231.   BUTTON_SetText(hBut, "Hide win");
  232.   //
  233.   // Create framewin video
  234.   //
  235.   hWinVideo = FRAMEWIN_CreateEx(5, 5, 170, 120, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Video window",
  236. _cbFrameWinVideo);
  237.   FRAMEWIN_SetClientColor(hWinVideo, GUI_INVALID_COLOR);
  238.   //
  239.   // Create test windows
  240.   //
  241.   _CreateWindow();
  242.   _CreateWindow();
  243.   _CreateWindow();
  244.   while (1) {
  245.     GUI_Delay(1000);
  246.   }
  247. }
复制代码
1.     创建FrameWin。
2.     删除FrameWin,主要是函数WM_DeleteWindow的使用。
3.     显示FrameWin,主要是函数WM_IsVisible和WM_ShowWindow的使用。
4.     隐藏FrameWin,主要是函数WM_HideWindow的使用。
5.     桌面窗口回调函数,主要看WM_NOTIFY_PARENT消息,进入后再分为4个button的消息,分别实现框架窗口的创建,删除,显示和隐藏。
6.     框架窗口FrameVideo的回调函数。
7.     函数_CreateWindow里面所创建框架窗口的回调函数。
8.     (1)创建两个文本控件。
        (2)创建四个按钮,分别实现创建,删除,显示和隐藏窗口。
        (3)创建框架窗口hWinVideo。
这个例子相对要简单很多,下面是这个例子的实际显示效果:
38.12.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-18 16:39:32 | 显示全部楼层
38.6  总结


本期教程就跟大家讲这么多,官方提供的这几个例子还是比较有参考价值的,希望初学者把这几个例子研究下,并在模拟器或者开发板上面多做这方面的练习。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 06:00 , Processed in 0.250761 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表