硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第46章 HEADER-标题控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-3 11:49:58 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第46章 HEADER-标题控件

    本期教程讲解STemWin支持的标题控件。
    46. 1 标题控件介绍
    46. 2 官方WIDGET_Header实例
    46. 3 使用官方GUIBulder建立HEADER控件
    46. 4 总结

46.1 标题控件介绍
    HEADER控件用于标记表格的列:
46.1.png

    如果使用了指针输入设备 (PID),可通过使用PID拖动分隔线来调节标题项目的宽度。
使用鼠标时的特性
    如果鼠标支持已启用,则光标出现并且PID在分隔线附近移动时,光标就会变成信号,可以在当前位置拖动分隔线。
使用触屏时的特性
   如果在分隔线附近按下该小工具,光标出现并变成信号,此时即可拖动分隔线。
可拖动分隔线的屏幕截图
46.2.png

预定义的光标
    2种预定义光标如下所示:
46.3.png

    在使用HEADER小工具的时候,也可以创建并使用自己的光标。
    如果设置皮肤的话,显示效果如下:
46.4.png


46.2 官方WIDGET_Header实例
    官方的这个实例很好的演示了Header的使用,这个例子在模拟器中的位置:
46.5.png
源代码如下(在程序中进行了详细的注释)
  1. ----------------------------------------------------------------------
  2. File        : WIDGET_Header.c
  3. Purpose     : Demonstrates the use of header widgets
  4. ---------------------------END-OF-HEADER------------------------------
  5. */
  6. #include <stddef.h>
  7. #include <string.h>
  8. #include "GUI.h"
  9. #include "HEADER.h"
  10. #include "FRAMEWIN.h"
  11. /*********************************************************************
  12. *
  13. *       Defines
  14. *
  15. **********************************************************************
  16. */
  17. /* 自定义回调函数的消息类型 */
  18. #define MSG_CHANGE_MAIN_TEXT (WM_USER + 0)
  19. #define MSG_CHANGE_INFO_TEXT (WM_USER + 1)
  20. /*********************************************************************
  21. *
  22. *       Static data
  23. *
  24. **********************************************************************
  25. */
  26. static HEADER_Handle _hHeader;
  27. static char _acMainText[100];
  28. static char _acInfoText[100];
  29. /*********************************************************************
  30. *
  31. *       Static code
  32. *
  33. **********************************************************************
  34. */
  35. /*******************************************************************
  36. *
  37. *       _ChangeMainText
  38. *
  39. *  给背景窗口发送消息,然后使其无效,这样就可以执行桌面窗口的回调函数的WM_PAINT消息
  40. */
  41. static void _ChangeMainText(char* pStr) {
  42.   WM_MESSAGE Message;
  43.   Message.MsgId  = MSG_CHANGE_MAIN_TEXT;
  44.   Message.Data.p = pStr;
  45.   /* 向桌面窗口发送消息 */
  46.   WM_SendMessage(WM_HBKWIN, &Message);
  47.   /* 使桌面窗口无效 */
  48.   WM_InvalidateWindow(WM_HBKWIN);
  49. }
  50. /*******************************************************************
  51. *
  52. *       _ChangeInfoText
  53. *
  54. *  给背景窗口发送消息,然后使其无效,这样就可以执行桌面窗口的回调函数的WM_PAINT消息
  55. */
  56. static void _ChangeInfoText(char* pStr) {
  57.   WM_MESSAGE Message;
  58.   Message.MsgId  = MSG_CHANGE_INFO_TEXT;
  59.   Message.Data.p = pStr;
  60.   /* 向桌面窗口发送消息 */
  61.   WM_SendMessage(WM_HBKWIN, &Message);
  62.   /* 使桌面窗口无效 */
  63.   WM_InvalidateWindow(WM_HBKWIN);
  64. }
  65. /*******************************************************************
  66. *
  67. *       _cbBkWindow
  68. *     桌面窗口的回调函数
  69. */
  70. static void _cbBkWindow(WM_MESSAGE* pMsg) {
  71.   switch (pMsg->MsgId) {
  72.     case MSG_CHANGE_MAIN_TEXT:
  73.       strcpy(_acMainText, pMsg->Data.p);
  74.       /* 使其无效,从而得到重绘 */
  75.       WM_InvalidateWindow(pMsg->hWin);
  76.       break;
  77.     case MSG_CHANGE_INFO_TEXT:
  78.       strcpy(_acInfoText, pMsg->Data.p);
  79.       WM_InvalidateWindow(pMsg->hWin);
  80.       break;
  81. /* 重绘消息 */
  82.     case WM_PAINT:
  83.       GUI_SetBkColor(GUI_BLACK);
  84.       GUI_Clear();
  85.       GUI_SetColor(GUI_WHITE);
  86.       GUI_SetFont(&GUI_Font24_ASCII);
  87.       GUI_DispStringHCenterAt("HEADER Widget - Sample", 160, 5);
  88.       GUI_SetFont(&GUI_Font8x16);
  89.       GUI_DispStringAt(_acMainText, 5, 40);
  90.       GUI_SetFont(&GUI_Font8x8);
  91.       GUI_DispStringAt(_acInfoText, 5, 60);
  92.       break;
  93.     default:
  94.       WM_DefaultProc(pMsg);
  95.   }
  96. }
  97. /*********************************************************************
  98. *
  99. *       _OnPaint
  100. */
  101. static void _OnPaint(void) {
  102.   int xPos = 0;
  103.   GUI_RECT Rect;
  104.   /* 设置背景颜色 */
  105.   GUI_SetBkColor(GUI_GRAY);
  106.   GUI_Clear();
  107.   /* 得到用户区 */
  108.   WM_GetClientRect(&Rect);
  109.   /* 得到第一个HEADER的宽度和下面区域的颜色 */
  110.   Rect.x1 = HEADER_GetItemWidth(_hHeader, 0);
  111.   GUI_SetColor(GUI_RED);
  112.   GUI_FillRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1);
  113.   /* 得到第二个HEADER的宽度和下面区域的颜色 */
  114.   Rect.x0 = Rect.x1;
  115.   Rect.x1 += HEADER_GetItemWidth(_hHeader, 1);
  116.   GUI_SetColor(GUI_GREEN);
  117.   GUI_FillRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1);
  118.   /* 得到第三个HEADER的宽度和下面区域的颜色 */
  119.   Rect.x0 = Rect.x1;
  120.   Rect.x1 += HEADER_GetItemWidth(_hHeader, 2);
  121.   GUI_SetColor(GUI_BLUE);
  122.   GUI_FillRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1);
  123. }
  124. /*********************************************************************
  125. *
  126. *       cbWindow
  127. */
  128. static void _cbWindow(WM_MESSAGE * pMsg) {
  129.   WM_HWIN hWin = pMsg->hWin;
  130.   switch (pMsg->MsgId) {
  131.     case WM_PAINT:
  132.       _OnPaint();
  133.       break;
  134.   }
  135.   WM_DefaultProc(pMsg);
  136. }
  137. /*********************************************************************
  138. *
  139. *       _Demo
  140. */
  141. static void _Demo(void) {
  142.   int Key = 0;
  143.   int Cnt = 10;
  144.   char acInfoText[] = "-- sec to play with header control";
  145.   _ChangeInfoText("HEADER_AddItem");
  146.   /*
  147. The Width-parameter can be 0. If  Width = 0 the width
  148.   of the new item will be calcu-lated by the given text and by the default
  149.   value of the horizontal spacing.
  150. */
  151.   /* 注意宽度的设置 */
  152.   HEADER_AddItem(_hHeader, 100, "Red"  , GUI_TA_VCENTER | GUI_TA_HCENTER);
  153.   HEADER_AddItem(_hHeader,   0, "Green", GUI_TA_VCENTER | GUI_TA_HCENTER);
  154.   HEADER_AddItem(_hHeader,   0, ":-)"  , GUI_TA_VCENTER | GUI_TA_HCENTER);
  155.   GUI_Delay(750);
  156.   /* 设置第二的宽度  60*/
  157.   _ChangeInfoText("HEADER_SetItemWidth");
  158.   HEADER_SetItemWidth(_hHeader, 1, 60);
  159.   /* 设置第三的宽度  100*/
  160.   _ChangeInfoText("HEADER_SetItemText");
  161.   HEADER_SetItemWidth(_hHeader, 2, 100);
  162.   HEADER_SetItemText(_hHeader, 2, "Blue");
  163.   GUI_Delay(750);
  164.   /* 设置字体 */
  165.   _ChangeInfoText("HEADER_SetFont");
  166.   HEADER_SetFont(_hHeader, &GUI_Font8x8);
  167.   GUI_Delay(750);
  168.   /* 设置已有Header的高度 */
  169.   _ChangeInfoText("HEADER_SetHeight");
  170.   HEADER_SetHeight(_hHeader, 50);
  171.   GUI_Delay(750);
  172.   /* 设置字体颜色 */
  173.   _ChangeInfoText("HEADER_SetTextColor");
  174.   HEADER_SetTextColor(_hHeader, GUI_YELLOW);
  175.   GUI_Delay(750);
  176.   /* 设置背景颜色 */
  177.   _ChangeInfoText("HEADER_SetBkColor");
  178.   HEADER_SetBkColor(_hHeader, GUI_DARKGRAY);
  179.   GUI_Delay(750);
  180.   /* 设置对齐方式 */
  181.   /* 等待有按键按下 */
  182.   _ChangeInfoText("HEADER_SetTextAlign");
  183.   HEADER_SetTextAlign(_hHeader, 0, GUI_TA_HCENTER);
  184.   while (!Key && (Cnt > 0)) {
  185.     acInfoText[0] = '0' + (Cnt / 10);
  186.     acInfoText[1] = '0' + (Cnt-- % 10);
  187.     _ChangeInfoText(acInfoText);
  188.     GUI_Delay(1000);
  189.     Key = GUI_GetKey();
  190.   }
  191. }
  192. /*********************************************************************
  193. *
  194. *       _DemoHeaderFrameWin
  195. */
  196. static void _DemoHeaderFrameWin(void) {
  197.   FRAMEWIN_Handle hFrameWin;
  198.   _ChangeMainText("HEADER control inside a FRAMEWIN");
  199.   /* 创建框架窗口 */
  200.   hFrameWin = FRAMEWIN_Create("Title", _cbWindow, WM_CF_SHOW, 10, 80, 300, 140);
  201.   /* 激活框架窗口 */
  202.   FRAMEWIN_SetActive(hFrameWin, 1);
  203.   /* 将标题控件添加到框架窗口中 */
  204.   _hHeader = HEADER_CreateAttached(WM_GetClientWindow(hFrameWin), 1234, 0);
  205.   _Demo();
  206.   /* 删除 */
  207.   FRAMEWIN_Delete(hFrameWin);
  208.   while (1)
  209.   {
  210.   }
  211. }
  212. /*********************************************************************
  213. *
  214. *       _DemoHeaderWin
  215. */
  216. static void _DemoHeaderWin(void) {
  217.   WM_HWIN hWin;
  218.   _ChangeMainText("HEADER control inside a window");
  219.   /* 创建窗口 */
  220.   hWin = WM_CreateWindow(10, 80, 300, 140, WM_CF_SHOW, _cbWindow, 0);
  221.   /*
  222. Creates a HEADER widget which is attached to an existing window.
  223. An attached HEADER widget is essentially a  child window which will position itself on
  224.      the parent window and operate accordingly
  225. */
  226.   /* 中间的是ID号,后面的一个参数是保留的 */
  227.   _hHeader = HEADER_CreateAttached(hWin, 1234, 0);
  228.   _Demo();
  229.   /* 删除 */
  230.   WM_DeleteWindow(hWin);
  231. }
  232. /*********************************************************************
  233. *
  234. *       _DemoHeader
  235. */
  236. static void _DemoHeader(void) {
  237.   _ChangeMainText("HEADER control without parent");
  238.    /* 创建标题控件 */
  239.   _hHeader = HEADER_Create(10, 80, 300, 0, 0, 1234, WM_CF_SHOW, 0);
  240.   _Demo();
  241.   HEADER_Delete(_hHeader);
  242. }
  243. /*********************************************************************
  244. *
  245. *       MainTask
  246. *
  247. **********************************************************************
  248. */
  249. void MainTask(void) {
  250.   GUI_Init();
  251.   /* 主要是在重绘的时候 使用存储设备 */
  252.   WM_EnableMemdev(WM_HBKWIN);
  253.   WM_SetCreateFlags(WM_CF_MEMDEV);
  254.   /* 设置桌面函数的回调 */
  255.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  256.   GUI_CURSOR_Show();
  257.   while(1) {
  258.     _DemoHeaderFrameWin();
  259.     _DemoHeaderWin();
  260.     _DemoHeader();
  261.   }
  262. }
复制代码
这个实例很好的演示了在框架窗口,普通窗口和桌面窗口上面创建标题控件,演示的方法是一样的,只是在三种窗口上分别进行了演示。
实际显示效果如下:
46.6.png


46.3 使用官方GUIBulder建立HEADER控件
    官方的GUIBulder5.22版本支持HEADER控件的建立,前面说的uCGUIBulder4.0不支持HEADER控件的建立,下面使用GUIBulder5.22建立一个如下效果的界面(480*272分辨率):
46.7.png

    HERDER控件参数的设置在这里:
46.8.png
    下面我们将生成的源代码在模拟器或者开发板上面运行(生成的代码在本期教程配套的例子中),实际显示效果如下:
46.9.png


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 01:02 , Processed in 0.216483 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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