硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第35章 窗口管理器实例(二)

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-14 19:29:36 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第35章 窗口管理器实例(二)

    为了帮助大家更好的理解窗口管理器的回调和消息机制,本期教程专门做了三个相关的例子,这三个例子全部来自官方。
    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)
  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. }
复制代码
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. /*******************************************************************
  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. }
复制代码
这部分代码实现了两个窗口在具有重绘和不具有重绘功能时的演示。
1. 实现两个窗口向上移动。
2. 实现两个窗口向下移动。
显示效果如下:
35.2.png


35.1.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(),注意这个函数里面的参数是相对值。显示效果如下:
35.3.png


35.2 官方WM_LateClipping.c实例
    这个Demo中涉及到了BOTTON和FrameWin的创建及其使用,如果初学的同学不理解这部分内容没有关系,后面的教程中会跟大家详细的讲解这部分知识。这里大家重点是看回调函数。Demo所在位置:
35.4.png

源代码如下:
  1. #include "GUI.h"
  2. #include "WM.h"
  3. #include "FRAMEWIN.h"
  4. #include "BUTTON.h"
  5. /*********************************************************************
  6. *
  7. *       Static data
  8. *
  9. **********************************************************************
  10. */
  11. static WM_HWIN _hWin1;
  12. static WM_HWIN _hWin2;
  13. static WM_HWIN _hBut1;
  14. static WM_HWIN _hBut2;
  15. static int     _PaintCount1;
  16. static int     _PaintCount2;
  17. static GUI_COLOR _aColors[] = {
  18.   0x0000FF, 0x00FF00, 0xFF0000, 0x00FFFF, 0xA000A0, 0xFFFF00
  19. };
  20. /*********************************************************************
  21. *
  22. *       Static code
  23. *
  24. **********************************************************************
  25. */
  26. /*********************************************************************
  27. *
  28. *       _cbBkWin
  29. */
  30. static void _cbBkWin(WM_MESSAGE* pMsg) {(1)
  31.   switch(pMsg->MsgId) {
  32.   case WM_PAINT:(2)
  33.     GUI_SetBkColor(GUI_BLACK);
  34.     GUI_Clear();
  35.     GUI_SetColor(0x0060FF);
  36.     GUI_DispStringAt("PaintCount (Early):", 0, 0);
  37.     GUI_DispDecAt(_PaintCount1, 120, 0, 5);
  38.     GUI_SetColor(0x00FFC0);
  39.     GUI_DispStringAt("PaintCount (Late):", 0, 12);
  40.     GUI_DispDecAt(_PaintCount2, 120, 12, 5);
  41.     break;
  42.   case WM_NOTIFY_PARENT:
  43.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
  44.       if (pMsg->hWinSrc == _hBut1) {(3)
  45.         WM_InvalidateWindow(_hWin1);
  46.         WM_InvalidateWindow(_hWin2);
  47.       } else if (pMsg->hWinSrc == _hBut2) {(4)
  48.         _PaintCount1 = 0;
  49.         _PaintCount2 = 0;
  50.         WM_InvalidateWindow(pMsg->hWin);
  51.       }
  52.     }
  53.     break;
  54.   default:
  55.     WM_DefaultProc(pMsg);
  56.   }
  57. }
  58. /*********************************************************************
  59. *
  60. *       _cbTop
  61. */
  62. static void _cbTop(WM_MESSAGE* pMsg) {(5)
  63.   switch(pMsg->MsgId) {
  64.   case WM_PAINT:
  65.     GUI_SetBkColor(GUI_MAGENTA);
  66.     GUI_Clear();
  67.     break;
  68.   default:
  69.     WM_DefaultProc(pMsg);
  70.   }
  71. }
  72. /*********************************************************************
  73. *
  74. *       _cbFrameWin1
  75. */
  76. static void _cbFrameWin1(WM_MESSAGE* pMsg) { (6)
  77.   switch(pMsg->MsgId) {
  78.   case WM_PAINT:
  79.     GUI_SetBkColor(_aColors[_PaintCount1 % 6]);
  80.     GUI_Clear();
  81.     GUI_SetColor(0x0060FF);
  82.     GUI_FillCircle(25, 25, 15);
  83.     GUI_SetColor(GUI_BLACK);
  84.     GUI_DrawCircle(25, 25, 15);
  85.     _PaintCount1++;
  86.     WM_InvalidateWindow(WM_HBKWIN);
  87.     break;
  88.   default:
  89.     WM_DefaultProc(pMsg);
  90.   }
  91. }
  92. /*********************************************************************
  93. *
  94. *       _cbFrameWin2
  95. */
  96. static void _cbFrameWin2(WM_MESSAGE* pMsg) {(7)
  97.   switch(pMsg->MsgId) {
  98.   case WM_PAINT:
  99.     GUI_SetBkColor(_aColors[_PaintCount2 % 6]);
  100.     GUI_Clear();
  101.     GUI_SetColor(0x00FFC0);
  102.     GUI_FillCircle(25, 25, 15);
  103.     GUI_SetColor(GUI_BLACK);
  104.     GUI_DrawCircle(25, 25, 15);
  105.     _PaintCount2++;
  106.     WM_InvalidateWindow(WM_HBKWIN);
  107.     break;
  108.   default:
  109.     WM_DefaultProc(pMsg);
  110.   }
  111. }
  112. /*********************************************************************
  113. *
  114. *       _ShowDemo
  115. */
  116. static void _ShowDemo(void) {
  117.   WM_HWIN hWin0;
  118.   WM_HWIN hWin1;
  119.   WM_HWIN hWin2;
  120.   WM_HWIN hFrame1;
  121.   WM_HWIN hFrame2;
  122.   WM_HWIN hClient1;
  123.   WM_HWIN hClient2;
  124.   WM_SetCallback(WM_HBKWIN, _cbBkWin);(8)
  125.   hFrame1  = FRAMEWIN_CreateEx( 10, 30, 140, 140, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Early Clipping", _cbFrameWin1);
  126.   hFrame2  = FRAMEWIN_CreateEx(170, 30, 140, 140, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Late Clipping", _cbFrameWin2);
  127.   hClient1 = WM_GetClientWindow(hFrame1);
  128.   hClient2 = WM_GetClientWindow(hFrame2);
  129.   _hWin1   = WM_CreateWindowAsChild(0, 0, WM_GetWindowSizeX(hClient1), WM_GetWindowSizeY(hClient1), hClient1, WM_CF_SHOW, _cbFrameWin1, 0);
  130.   _hWin2   = WM_CreateWindowAsChild(0, 0, WM_GetWindowSizeX(hClient2), WM_GetWindowSizeY(hClient2), hClient2, WM_CF_SHOW | WM_CF_LATE_CLIP, _cbFrameWin2, 0);
  131.   _hBut1   = BUTTON_CreateEx( 10, 210, 140, 20, 0, WM_CF_SHOW, 0, 1);
  132.   _hBut2   = BUTTON_CreateEx(170, 210, 140, 20, 0, WM_CF_SHOW, 0, 2);
  133.   hWin0    = FRAMEWIN_CreateEx( 60,  80, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 0", _cbTop);
  134.   hWin1    = FRAMEWIN_CreateEx(220,  80, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 1", _cbTop);
  135.   hWin2    = FRAMEWIN_CreateEx(140, 170, 40, 40, 0, WM_CF_SHOW | WM_CF_STAYONTOP, FRAMEWIN_CF_MOVEABLE, 0, "Top 2", _cbTop);
  136.   FRAMEWIN_SetResizeable(hWin0, 1);
  137.   FRAMEWIN_SetResizeable(hWin1, 1);
  138.   FRAMEWIN_SetResizeable(hWin2, 1);
  139.   BUTTON_SetText(_hBut1, "Invalidate");
  140.   BUTTON_SetText(_hBut2, "Reset counters");
  141.   while(1) {
  142.     GUI_Delay(50);
  143.   }
  144. }
  145. /*********************************************************************
  146. *
  147. *       Public code
  148. *
  149. **********************************************************************
  150. */
  151. /*********************************************************************
  152. *
  153. *       MainTask
  154. */
  155. void MainTask(void) {
  156.   GUI_Init();
  157.   while(1) {
  158.     _ShowDemo();
  159.   }
  160. }
复制代码
1. 桌面窗口回调函数。
2. 回调函数中重绘部分的代码。
3. 由于两个按钮是创建在桌面窗口上面的,所以按钮的WM_NOTIFICATION_RELEASED(通知代码消息类型)是在桌面窗口的回调函数中。这个按钮按下后将_hWin1_hWin2无效。从而会执行这两个窗口的背景重绘功能。
4. 同上,只不过这里实现的功能是将两个计数值清零,并使桌面窗口无效,从而执行桌面窗口的重绘消息。
5. 这个是hWin0hWin1,hWin2的回调函数。
6. 这个是hFrame1的回调函数。回调函数中主要实现了重绘消息。重绘消息中记录了重绘的次数,并根据重绘次数修改背景颜色。
7. 这个是hFrame2的回调函数。回调函数中主要实现了重绘消息。重绘消息中记录了重绘的次数,并根据重绘次数修改背景颜色。
8. (1) 先创建两个FrameWin
    (2) 分别在这两个FrameWin中创建两个子窗口。
    (3) 创建两个按钮。
    (4) 创建三个FrameWin。
9. 这个Demo还有一个控件剪切问题,后面会专门抽一期教程专门跟大家讲解这个。
这个例子对于研究回调函数函数还是非常好的,大家可以在这个例子的基础上做一些修改,实现一些功能,这个Demo的显示效果如下:
35.5.png

35.3 官方WM_Video.c实例
    这个例子所在位置:
35.6.png

源代码如下:
  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. *
  18. *       Static data
  19. *
  20. **********************************************************************
  21. */
  22. static WM_HWIN _ahWin[MAX_WINDOWS];
  23. static char    _IsCompletelyVis;
  24. /*********************************************************************
  25. *
  26. *       Static code
  27. *
  28. **********************************************************************
  29. */
  30. /*********************************************************************
  31. *
  32. *       _CreateWindow
  33. */
  34. static void _CreateWindow(void) { (1)
  35.   unsigned i;
  36.   WM_HWIN  hWin;
  37.   char     ac[32];
  38.   int      j;
  39.   for (i = 0; i < MAX_WINDOWS; i++) {
  40.     if (_ahWin[i] == 0) {
  41.       j = i + 1;
  42.       sprintf(ac, "Test window %d", j);
  43.       hWin = FRAMEWIN_CreateEx(5 + 10 * i, 135 + 10 * i, 120, 60, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, ac, _cbFrameWinTest);
  44.       FRAMEWIN_SetClientColor(hWin, GUI_INVALID_COLOR);
  45.       _ahWin[i] = hWin;
  46.       break;
  47.     }
  48.   }
  49. }
  50. /*********************************************************************
  51. *
  52. *       _DeleteWindow
  53. */
  54. static void _DeleteWindow(void) { (2)
  55.   unsigned i;
  56.   for (i = 0; i < MAX_WINDOWS; i++) {
  57.     if (WM_IsVisible(_ahWin[i])) {
  58.       WM_DeleteWindow(_ahWin[i]);
  59.       _ahWin[i] = 0;
  60.       break;
  61.     }
  62.   }
  63. }
  64. /*********************************************************************
  65. *
  66. *       _ShowWindow
  67. */
  68. static void _ShowWindow(void) {     (3)
  69.   unsigned i;
  70.   for (i = 0; i < MAX_WINDOWS; i++) {
  71.     if (_ahWin[i] != 0) {
  72.       if (WM_IsVisible(_ahWin[i]) == 0) {
  73.         WM_ShowWindow(_ahWin[i]);
  74.         break;
  75.       }
  76.     }
  77.   }
  78. }
  79. /*********************************************************************
  80. *
  81. *       _HideWindow
  82. */
  83. static void _HideWindow(void) {(4)
  84.   unsigned i;
  85.   for (i = 0; i < MAX_WINDOWS; i++) {
  86.     if (WM_IsVisible(_ahWin[i])) {
  87.       WM_HideWindow(_ahWin[i]);
  88.       break;
  89.     }
  90.   }
  91. }
  92. /*********************************************************************
  93. *
  94. *       Static code, callbacks
  95. *
  96. **********************************************************************
  97. */
  98. /*********************************************************************
  99. *
  100. *       _cbBkWin
  101. */
  102. static void _cbBkWin(WM_MESSAGE* pMsg) {   (5)
  103.   int Id;
  104.   switch (pMsg->MsgId) {
  105.   case WM_PAINT:
  106.     GUI_SetBkColor(GUI_BLACK);
  107.     GUI_Clear();
  108.     break;
  109.   case WM_NOTIFY_PARENT:
  110.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
  111.       Id = WM_GetId(pMsg->hWinSrc);
  112.       switch (Id) {
  113.       case GUI_ID_BUTTON0:
  114.         _CreateWindow();
  115.         break;
  116.       case GUI_ID_BUTTON1:
  117.         _DeleteWindow();
  118.         break;
  119.       case GUI_ID_BUTTON2:
  120.         _ShowWindow();
  121.         break;
  122.       case GUI_ID_BUTTON3:
  123.         _HideWindow();
  124.         break;
  125.       }
  126.     }
  127.     break;
  128.   default:
  129.     WM_DefaultProc(pMsg);
  130.   }
  131. }
  132. /*********************************************************************
  133. *
  134. *       _cbFrameWinVideo
  135. */
  136. static void _cbFrameWinVideo(WM_MESSAGE* pMsg) {(6)
  137.   WM_HWIN hWin;
  138.   WM_HWIN hText;
  139.   int     IsCompletelyVis;
  140.   int     IsCompletelyCovered;
  141.   switch (pMsg->MsgId) {
  142.   case WM_PAINT:
  143.     if (_IsCompletelyVis) {
  144.       GUI_SetBkColor(GUI_DARKGREEN);
  145.       GUI_Clear();
  146.       GUI_SetColor(GUI_WHITE);
  147.       GUI_DispStringAt("Completely visible", 5, 5);
  148.     } else {
  149.       GUI_SetBkColor(GUI_GRAY);
  150.       GUI_Clear();
  151.       GUI_SetColor(GUI_WHITE);
  152.       GUI_DispStringAt("Not completely visible", 5, 5);
  153.     }
  154.     break;
  155.   case WM_NOTIFY_VIS_CHANGED:
  156.     hText = WM_GetDialogItem(WM_HBKWIN, GUI_ID_TEXT1);
  157.     hWin  = WM_GetClientWindow(pMsg->hWin);
  158.     IsCompletelyVis     = WM_IsCompletelyVisible(hWin);
  159.     IsCompletelyCovered = WM_IsCompletelyCovered(hWin);
  160.     if (IsCompletelyCovered) {
  161.       TEXT_SetText(hText, "completely\ncovered");
  162.     } else {
  163.       TEXT_SetText(hText, "not completely\ncovered");
  164.     }
  165.     if (_IsCompletelyVis != IsCompletelyVis) {
  166.       _IsCompletelyVis = IsCompletelyVis;
  167.       WM_InvalidateWindow(hWin);    /* Only required if content changes if partially hidden */
  168.     }
  169.     break;
  170.   default:
  171.     WM_DefaultProc(pMsg);
  172.   }
  173. }
  174. /*********************************************************************
  175. *
  176. *       _cbFrameWinTest
  177. */
  178. static void _cbFrameWinTest(WM_MESSAGE* pMsg) {(7)
  179.   switch (pMsg->MsgId) {
  180.   case WM_PAINT:
  181.     GUI_SetBkColor(GUI_DARKRED);
  182.     GUI_Clear();
  183.     break;
  184.   default:
  185.     WM_DefaultProc(pMsg);
  186.   }
  187. }
  188. /*********************************************************************
  189. *
  190. *       Public code
  191. *
  192. **********************************************************************
  193. */
  194. /*********************************************************************
  195. *
  196. *       MainTask
  197. */
  198. void MainTask(void) {
  199.   FRAMEWIN_Handle hWinVideo;
  200.   BUTTON_Handle   hBut;
  201.   WM_HWIN         hText;
  202.   GUI_Init();(8)
  203.   WM_SetCallback(WM_HBKWIN, _cbBkWin);
  204.   hText = TEXT_CreateEx(240,  85, 80, 26, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_TEXT0, "The client\nwindow is");
  205.   TEXT_SetTextColor(hText, GUI_WHITE);
  206.   hText = TEXT_CreateEx(240, 111, 80, 26, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_TEXT1, NULL);
  207.   TEXT_SetTextColor(hText, GUI_WHITE);
  208.   //
  209.   // Create buttons
  210.   //
  211.   hBut = BUTTON_CreateEx(240,  5, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON0);
  212.   BUTTON_SetText(hBut, "Create win");
  213.   hBut = BUTTON_CreateEx(240, 25, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON1);
  214.   BUTTON_SetText(hBut, "Delete win");
  215.   hBut = BUTTON_CreateEx(240, 45, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON2);
  216.   BUTTON_SetText(hBut, "Show win");
  217.   hBut = BUTTON_CreateEx(240, 65, 75, 18, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON3);
  218.   BUTTON_SetText(hBut, "Hide win");
  219.   //
  220.   // Create framewin video
  221.   //  
  222.   hWinVideo = FRAMEWIN_CreateEx(5, 5, 170, 120, 0, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, "Video window", _cbFrameWinVideo);
  223.   FRAMEWIN_SetClientColor(hWinVideo, GUI_INVALID_COLOR);
  224.   //
  225.   // Create test windows
  226.   //
  227.   _CreateWindow();
  228.   _CreateWindow();
  229.   _CreateWindow();
  230.   while (1) {
  231.     GUI_Delay(1000);
  232.   }
  233. }
复制代码
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 总结
    本期教程就跟大家讲这么多,希望通过本期教程让大家对窗口管理器有更好的认识,不过还需要大家在模拟器或者开发板上面多做这方面的练习。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 05:53 , Processed in 0.155120 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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