硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第44章 FrameWin-框架窗口控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-2 11:26:10 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第44章 FrameWin-框架窗口控件

    本期教程讲解STemWin支持的框架窗口控件。
    44. 1 框架窗口控件介绍
    44. 2 官方WIDGET_FrameWin实例
    44. 3 总结

44.1 框架窗口控件介绍
    框架窗口为您的应用提供一个PC应用程序的窗口外观。这些窗口由周围框架、标题栏和用户区组成。标题栏的颜色改变以显示窗口是否激活,如下图所示:
44.1.png

    如下图所示,可将预定义的按钮附加到标题栏,也可将自己的按钮附加到标题栏:
44.2.png

    设置皮肤后显示效果如下:
44.3.png


44.1.1 框架窗口的结构
    下图显示了框架窗口的详细结构和外观:
44.4.png

    框架窗口实际上由2种窗口组成;主窗口和子窗口。子窗口称为客户端窗口。处理回调函数时意识到此点非常重要:存在具有2种不同回调函数的2种窗口。创建子窗口时,这些子窗口通常作为客户端窗口的子窗口而创建;它们的父窗口因此是客户端窗口。

细节

描述

B

框架窗口的边框尺寸。默认的边框尺寸为3像素。

H

标题栏的高度。取决于标题所用字体的尺寸。

D

标题栏和客户端窗口的间距。(1像素)

标题栏

标题栏是框架窗口的一部分,不是单独的窗口。

客户端窗口

客户端窗口是一个单独的窗口,作为框架窗口的子窗口创建。


44.2 官方WIDGET_FrameWin实例
    官方的这个实例简单的演示了FrameWin的部分功能,这个例子在模拟器中的位置:
44.5.png

源代码如下:
  1. #include <stddef.h>
  2. #include <string.h>
  3. #include "GUI.h"
  4. #include "FRAMEWIN.h"
  5. /*********************************************************************
  6. *
  7. *       Defines
  8. *
  9. **********************************************************************
  10. */
  11. #define SPEED   1200
  12. #define MSG_CHANGE_MAIN_TEXT (WM_USER + 0) (1)
  13. /*********************************************************************
  14. *
  15. *       Static data
  16. *
  17. **********************************************************************
  18. */
  19. static FRAMEWIN_Handle  _hFrame;
  20. static WM_CALLBACK*     _pcbOldFrame;
  21. static char             _acMainText[100];
  22. static int              _LockClose = 1;
  23. /*******************************************************************
  24. *
  25. *       Static code
  26. *
  27. ********************************************************************
  28. */
  29. /*******************************************************************
  30. *
  31. *       _ChangeMainText
  32. *
  33. *  Sends a message to the background window and invalidate it, so
  34. *  the callback of the background window display the new text.
  35. */
  36. static void _ChangeMainText(char* pStr, int Delay) {(2)
  37.   WM_MESSAGE Message;
  38.   Message.MsgId  = MSG_CHANGE_MAIN_TEXT;
  39.   Message.Data.p = pStr;
  40.   GUI_Delay(Delay);
  41.   WM_SendMessage(WM_HBKWIN, &Message);
  42.   WM_InvalidateWindow(WM_HBKWIN);
  43.   GUI_Delay(Delay/3);
  44. }
  45. /*******************************************************************
  46. *
  47. *       _cbChild
  48. */
  49. static void _cbChild(WM_MESSAGE * pMsg) {(3)
  50.   WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);
  51.   switch (pMsg->MsgId) {
  52.   case WM_PAINT:
  53.     //
  54.     // Handle the paint message
  55.     //
  56.     GUI_SetBkColor(GUI_WHITE);
  57.     GUI_SetColor(GUI_BLACK);
  58.     GUI_SetFont(&GUI_FontComic24B_ASCII);
  59.     GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
  60.     GUI_Clear();
  61.     GUI_DispStringHCenterAt("Client window",
  62.                             WM_GetWindowSizeX(hWin) / 2,
  63.                             WM_GetWindowSizeY(hWin) / 2);
  64.     break;
  65.   default:
  66.     WM_DefaultProc(pMsg);
  67.   }
  68. }
  69. /*******************************************************************
  70. *
  71. *       _cbFrame
  72. */
  73. static void _cbFrame(WM_MESSAGE * pMsg) {  (4)
  74.   switch (pMsg->MsgId) {
  75.   case WM_NOTIFY_PARENT:
  76.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
  77.       int Id = WM_GetId(pMsg->hWinSrc);      // Id of widget
  78.       if (Id == GUI_ID_CLOSE) {
  79.         if (_LockClose) {
  80.           return;
  81.         }
  82.         _hFrame = 0;
  83.       }
  84.     }
  85.     break;
  86.   }
  87.   if (_pcbOldFrame) {
  88.     (*_pcbOldFrame)(pMsg);
  89.   }
  90. }
  91. /*******************************************************************
  92. *
  93. *       _cbBkWindow
  94. *
  95. * Function description
  96. *   This callback is necessary to redraw the background when
  97. *   frame window is moved
  98. */
  99. static void _cbBkWindow(WM_MESSAGE * pMsg) {(5)
  100.   switch (pMsg->MsgId) {
  101.     case MSG_CHANGE_MAIN_TEXT:
  102.       strcpy(_acMainText, (char const *)pMsg->Data.p);
  103.       WM_InvalidateWindow(pMsg->hWin);
  104.       break;
  105.     case WM_PAINT:
  106.       GUI_SetBkColor(GUI_BLACK);
  107.       GUI_Clear();
  108.       GUI_SetColor(GUI_WHITE);
  109.       GUI_SetFont(&GUI_Font24_ASCII);
  110.       GUI_DispStringHCenterAt("WIDGET_FrameWin - Sample", 160, 5);
  111.       GUI_SetFont(&GUI_Font8x16);
  112.       GUI_DispStringHCenterAt(_acMainText, 160, 40);
  113.       GUI_SetFont(&GUI_Font6x8);
  114.       GUI_DispStringHCenterAt("The function FRAMEWIN_Create creates both the\n"
  115. "frame window and the client window.", 160, 190);
  116.       break;
  117.     default:
  118.       WM_DefaultProc(pMsg);
  119.   }
  120. }
  121. /*******************************************************************
  122. *
  123. *       _DemoFramewin
  124. *
  125. * Function description
  126. *   Creates the frame window and sets the callback for frame, child
  127. *   and background window
  128. */
  129. static void _DemoFramewin(void) {(6)
  130.   int i;
  131.   char acInfoText[] = "-- sec to play with window";
  132.   WM_HWIN hChild;
  133.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  134.   //
  135.   // Create and configure frame window
  136.   //
  137.   _ChangeMainText("FRAMEWIN_Create", SPEED);
  138.   _hFrame = FRAMEWIN_Create("Frame window", 0, WM_CF_SHOW, 50, 75, 220, 100);(7)
  139.   _pcbOldFrame = WM_SetCallback(_hFrame, _cbFrame);(8)
  140.   hChild = WM_GetClientWindow(_hFrame);(9)
  141.   WM_SetCallback(hChild, _cbChild);(10)
  142.   FRAMEWIN_SetMoveable(_hFrame, 1);(11)
  143.   //
  144.   // Create buttons
  145.   //
  146.   FRAMEWIN_AddCloseButton(_hFrame, FRAMEWIN_BUTTON_LEFT, 0);(12)
  147.   FRAMEWIN_AddMaxButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 0);
  148.   FRAMEWIN_AddMinButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 2);
  149.   //
  150.   // Modify frame window attributes
  151.   //
  152.   _ChangeMainText("FRAMEWIN_SetActive", SPEED);
  153.   FRAMEWIN_SetActive(_hFrame, 1);(13)
  154.   _ChangeMainText("FRAMEWIN_SetFont", SPEED);
  155.   FRAMEWIN_SetFont(_hFrame, &GUI_Font16B_ASCII); (14)
  156.   FRAMEWIN_SetTitleHeight(_hFrame, 20);
  157.   _ChangeMainText("FRAMEWIN_SetTextColor", SPEED);
  158.   FRAMEWIN_SetTextColor(_hFrame, GUI_YELLOW); (15)
  159.   _ChangeMainText("FRAMEWIN_SetTextAlign", SPEED);
  160.   FRAMEWIN_SetTextAlign(_hFrame, GUI_TA_HCENTER);(16)
  161.   _ChangeMainText("FRAMEWIN_Minimize", SPEED);
  162.   FRAMEWIN_Minimize(_hFrame);(17)
  163.   _ChangeMainText("FRAMEWIN_Maximize", SPEED);
  164.   FRAMEWIN_Maximize(_hFrame);  (18)
  165.   _ChangeMainText("FRAMEWIN_Restore", SPEED);
  166.   FRAMEWIN_Restore(_hFrame);(19)
  167.   _ChangeMainText("FRAMEWIN_SetTitleVis", SPEED);
  168.   for (i = 0; i < 5; i++) {
  169.     FRAMEWIN_SetTitleVis(_hFrame, 0);  (20)
  170.     GUI_Delay(200);
  171.     FRAMEWIN_SetTitleVis(_hFrame, 1);
  172.     GUI_Delay(200);
  173.   }
  174.   //
  175.   // Time to play with frame window
  176.   //
  177.   _LockClose = 0;
  178.   for (i = 250; (i > 0) && _hFrame; i--) {
  179.     acInfoText[0] = '0' + ((i + 9) / 100);
  180.     acInfoText[1] = '0' + (((i + 9) / 10) % 10);
  181.     _ChangeMainText(acInfoText, 0);
  182.     GUI_Delay(100);
  183.   }
  184.   if (_hFrame) {
  185.     _ChangeMainText("FRAMEWIN_Delete", SPEED);
  186.     FRAMEWIN_Delete(_hFrame);(21)
  187.   } else {
  188.     _ChangeMainText("", 50);
  189.   }
  190. }
  191. /*********************************************************************
  192. *
  193. *       Public code
  194. *
  195. **********************************************************************
  196. */
  197. /*********************************************************************
  198. *
  199. *       MainTask
  200. */
  201. void MainTask(void) {
  202.   GUI_Init();
  203.   WM_EnableMemdev(WM_HBKWIN); (22)
  204.   while(1) {
  205. _DemoFramewin();
  206.   }
  207. }
复制代码
1. 自定义的一个回调消息类型。
2. 用于给桌面窗口发送自定义的回调函数消息类型。发送后将桌面窗口变得无效,然后系统就会去执行桌面窗口回调函数中的WM_PAINT消息。
3. 框架窗口中客户窗口的回调函数。
4. 框架窗口的回调函数。
5. 桌面窗口的回调函数。
6. 框架窗口中部分API函数的演示函数。
7. 创建框架窗口。
8. 设置框架窗口的回调函数。
9. 得到框架窗口中客户端窗口句柄。
10. 设置客户端窗口的回调函数。
11. 设置框架窗口可移动。
12. 为框架窗口添加最小化,最大化和关闭按钮。
13. 激活框架窗口。
14. 设置框架窗口中标题的字体。
15. 设置框架窗口中标题的颜色。
16. 设置框架窗口中标题文本的对齐。
17. 最小化框架窗口。
18. 最大化框架窗口。
19. 恢复最小化或最大化的框架窗口。
20. 设置框架窗口的标题可见。
21. 删除框架窗口。
22. 使能桌面窗口的内存设备。
    这个例子中变量_LockClose的作用也很重要,它的主要作用就是在演示框架窗口时锁住关闭按钮,防止在演示的时候,用户点击了关闭按钮。大家也特别注意框架窗口回调函数_cbFrame的处理。
实际显示效果如下:
44.6.png


44.3 总结
   本期教程主要是跟大家讲解了框架窗口的使用,希望大家可以把本期教程中讲的这个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的框架窗口API,其它的API大家都可以试试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 14:37 , Processed in 0.263122 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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