硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第45章 GRAPH-图形控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

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

    本期教程讲解STemWin支持的绘图控件。
    45. 1 绘图件介绍
    45. 2 官方WIDGET_GraphYT实例
    45. 3 使用官方GUIBulder建立Graph控件
    45. 4 总结

45.1 图形控件介绍
    图形控件可用于可视化数据。图形控件的典型应用是显示测量值或函数图形的曲线,可同时显示多条曲线。可使用水平和垂直刻度来标记曲线。可在背景上显示具有不同水平和垂直间距的网格。如果数据阵列不能容纳进图形的可见区域,小工具可自动显示滚动条,从而可在大的数据阵列中进行滚动。

45.1.1 图形控件的结构
    图形控件由不同种类的对象组成:
l 图形控件自身,可以附加数据对象和刻度对象。
l 可选的一个或多个数据对象。
l 可选的一个或多个刻度对象。
    下图显示了图形控件的详细结构:
45.1.png

    截图中每个参数表示的含义如下:

参数

描述

Border

可选边框是图形小工具的一部分。

Frame

数据区四周的细线,是图形小工具的一部分。

Grid

显示在数据区的背景中,是图形小工具的一部分。

Data area

网格和数据对象的显示区域。

Data object(s)

对于每条曲线,应向图形小工具添加一个数据对象。

Appdefined graphic

应用程序定义的一种回调函数,可用于绘制任何应用程序定义的文本和/或图形。

Scrollbar(s)

如果数据对象的范围大于图形小工具的数据区,则图形小工具可自动显示水平和/或垂直滚动条。

Scale object(s)

可附加到图形小工具的水平和垂直刻度。

X-Size

数据区的X尺寸。

Y-Size

数据区的Y尺寸。


45.1.2 创建和删除图形小工具
    创建图形控件的过程如下:
l 创建图形控件并设置所需的属性。
l 创建数据对象。
l 将数据对象附加到图形控件。
l 创建可选的刻度对象。
l 将刻度对象附加到图形控件。
    附加到图形控件后,就不需要通过应用程序来删除数据和刻度对象,而由图形控件完成。
示例
  1. GRAPH_DATA_Handle hData;
  2. GRAPH_SCALE_Handle hScale;
  3. WM_HWIN hGraph;
  4. hGraph = GRAPH_CreateEx(10, 10, 216, 106, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_GRAPH0);
  5. hData = GRAPH_DATA_YT_Create(GUI_DARKGREEN, NumDataItems, aData0, MaxNumDataItems);
  6. GRAPH_AttachData(hGraph, hData);
  7. hScale = GRAPH_SCALE_Create(28, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 20);
  8. GRAPH_AttachScale(hGraph, hScale);
  9. /*
  10. Do something with the widget...
  11. */
  12. WM_DeleteWindow(hGraph);
复制代码



45.1.3 绘制过程
    如前所述,图形控件由不同部分和 “子”对象组成。以下描述了绘制控件的顺序:
1. 用背景色填充背景。
2. 调用可选的回调例程。例如,这样就能绘制用户定义的网格。
3. 绘制网格 (如已启用)。
4. 绘制数据对象和边框区域。
5. 绘制刻度对象。
6. 调用可选的回调例程。例如,这样就能绘制用户定义的刻度,或一些其他的文本和/或图形。

45.1.4 支持的曲线类型
    显示测量值连续更新的曲线的要求不同于显示具有X/Y坐标的函数图形的要求。因此,控件当前支持2种数据对象,如下表所示:
45.2.png

GRAPH_DATA_XY此数据对象用于显示由点阵列组成的曲线,对象数据绘制为折线。此数据对象的典型应用是绘制函数图形。
GRAPH_DATA_YT此数据对象用于显示图形上每个X位置都具有一个Y值的曲线。此数据对象的典型应用是显示测量值连续更新的曲线。

45.2 官方WIDGET_GraphYT实例
    官方的这个实例很好的演示了GraphYT的使用,这个例子在模拟器中的位置:
45.3.png

源码如下(程序中进行了详细的注释):
  1. ----------------------------------------------------------------------
  2. File        : WIDGET_Graph.c
  3. Purpose     : Demonstrates the use of the GRAPH widget
  4. ----------------------------------------------------------------------
  5. */

  6. #include <stdlib.h>
  7. #include <string.h>

  8. #include "DIALOG.h"
  9. #include "GRAPH.h"

  10. /*********************************************************************
  11. *
  12. *       Defines
  13. *
  14. **********************************************************************
  15. */
  16. #define MAX_VALUE 180

  17. /*********************************************************************
  18. *
  19. *       Static data
  20. *
  21. **********************************************************************
  22. */
  23. static GRAPH_DATA_Handle  _ahData[3]; /* 定义三种曲线的句柄  */
  24. static GRAPH_SCALE_Handle _hScaleV;   /* 垂直放缩的句柄 */
  25. static GRAPH_SCALE_Handle _hScaleH;   /* 水平放缩的句柄  */

  26. static I16 _aValue[3];
  27. static int _Stop;

  28. /* 三种曲线的显示颜色 */
  29. static GUI_COLOR _aColor[] = {GUI_RED, GUI_GREEN, GUI_LIGHTBLUE};

  30. /* 对话框资源 */
  31. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  32.   { FRAMEWIN_CreateIndirect, "Graph widget demo",  0                ,   0,   0, 320, 240, FRAMEWIN_CF_MOVEABLE },
  33.   { GRAPH_CreateIndirect,     0,                   GUI_ID_GRAPH0    ,   5,   5, 270, 175 },
  34.   { TEXT_CreateIndirect,      "Spacing X:",        0                ,  10, 185,  50,  20 },
  35.   { TEXT_CreateIndirect,      "Spacing Y:",        0                ,  10, 205,  50,  20 },
  36.   { SLIDER_CreateIndirect,    0,                   GUI_ID_SLIDER0   ,  60, 185,  60,  16 },
  37.   { SLIDER_CreateIndirect,    0,                   GUI_ID_SLIDER1   ,  60, 205,  60,  16 },
  38.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK0    , 130, 185,  50,   0 },
  39.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK1    , 130, 205,  50,   0 },
  40.   { TEXT_CreateIndirect,      "Border",            0                , 280,   5,  35,  15 },
  41.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK2    , 280,  20,  35,   0 },
  42.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK3    , 280,  40,  35,   0 },
  43.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK4    , 280,  60,  35,   0 },
  44.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK5    , 280,  80,  35,   0 },
  45.   { TEXT_CreateIndirect,      "Effect",            0                , 280, 100,  35,  15 },
  46.   { RADIO_CreateIndirect,     0,                   GUI_ID_RADIO0    , 275, 115,  35,   0, 0, 3 },
  47.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK6    , 180, 185,  50,   0 },
  48.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK7    , 180, 205,  50,   0 },
  49.   { BUTTON_CreateIndirect,    "Full Screen",       GUI_ID_BUTTON0   , 235, 185,  65,  18 },
  50.   { CHECKBOX_CreateIndirect,  0,                   GUI_ID_CHECK8    , 235, 205,  70,   0 },
  51. };

  52. /*********************************************************************
  53. *
  54. *       _AddValues
  55. *
  56. */
  57. static void _AddValues(WM_HWIN hGraph) {
  58.   int i;
  59.   int Add;
  60.   int Vz;

  61.   /* 通过for语句循环三次给三个数据对象_ahData[i]添加随机数数据 */
  62.   for (i = 0; i < GUI_COUNTOF(_aValue); i++) {
  63.      Add = rand() % (2 + i * i);
  64.      Vz  = ((rand() % 2) << 1) - 1;
  65.     _aValue[i] += Add * Vz;
  66.     if (_aValue[i] > MAX_VALUE) {
  67.       _aValue[i] = MAX_VALUE;
  68.     } else if (_aValue[i] < 0) {
  69.       _aValue[i] = 0;
  70.     }

  71. /*
  72. 下面的这个函数用于把给定的数据值添加到数据对象。如果该数据对象 “已满”,即意味着它包含的数据项与创建时在参
  73. 数MaxNumItems中指定的项数相同,在添加新值前会首先移动一个数据项。因此,向 “已满”对象添加数据项时,第一
  74. 个数据项被移出。
  75. */
  76.     GRAPH_DATA_YT_AddValue(_ahData[i], _aValue[i]);
  77.   }
  78. }

  79. /*********************************************************************
  80. *
  81. *       _UserDraw
  82. *
  83. * 本函数的目的:
  84. *   在绘制之前和绘制之后调用这个函数 ,此函数只是显示字母Temperature
  85. */
  86. static void _UserDraw(WM_HWIN hWin, int Stage) {

  87.    /* 在绘制之后被调用 */
  88.   if (Stage == GRAPH_DRAW_LAST) {
  89.     char acText[] = "Temperature";
  90.     GUI_RECT Rect, RectInvalid;
  91.     int FontSizeY;

  92. /* 设置字体 */
  93.     GUI_SetFont(&GUI_Font13_ASCII);
  94.     FontSizeY = GUI_GetFontSizeY();

  95. /* 得到矩形框的大小 */
  96.     WM_GetInsideRect(&Rect);

  97. /* Returns the invalid rectangle of a window in desktop coordinates */
  98.     WM_GetInvalidRect(hWin, &RectInvalid);
  99.     Rect.x1 = Rect.x0 + FontSizeY;
  100.     GUI_SetColor(GUI_RED);
  101.     GUI_DispStringInRectEx(acText, &Rect, GUI_TA_HCENTER, strlen(acText), GUI_ROTATE_CCW);
  102.   }

  103. }

  104. /*********************************************************************
  105. *
  106. *       _ForEach
  107. *
  108. *   这个函数用于隐藏或者显示所有的窗口,除了button,graph和scroll控件
  109. *   
  110. */
  111. static void _ForEach(WM_HWIN hWin, void * pData) {
  112.   int Id, FullScreenMode;
  113.   FullScreenMode = *(int *)pData;
  114.   Id = WM_GetId(hWin);
  115.   if ((Id == GUI_ID_GRAPH0) || (Id == GUI_ID_BUTTON0) || (Id == GUI_ID_VSCROLL) || (Id == GUI_ID_HSCROLL)) {
  116.     return;
  117.   }
  118.   if (FullScreenMode) {
  119.     WM_HideWindow(hWin);
  120.   } else {
  121.     WM_ShowWindow(hWin);
  122.   }
  123. }

  124. /*********************************************************************
  125. *
  126. *       _ToggleFullScreenMode
  127. *
  128. *   这个函数用于设置进入全屏模式与否,进入相应的模式以后需要放大或者缩小控件
  129. */
  130. static void _ToggleFullScreenMode(WM_HWIN hDlg) {
  131.   static int FullScreenMode;
  132.   static GUI_RECT Rect;
  133.   static unsigned ScalePos;
  134.   WM_HWIN hGraph, hButton;
  135.   hGraph  = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  136.   hButton = WM_GetDialogItem(hDlg, GUI_ID_BUTTON0);

  137.   /* 取反 */
  138.   FullScreenMode ^= 1;

  139.   /* 全屏模式 */
  140.   if (FullScreenMode) {
  141.     /* 进入全屏模式  */
  142.     WM_HWIN hClient;
  143.     GUI_RECT RectInside;
  144.     hClient = WM_GetClientWindow(hDlg);
  145.     BUTTON_SetText(hButton, "Back");

  146. /* 相对移动*/
  147.     WM_MoveWindow(hButton, 0, 11);
  148.     /* 隐藏标题 */
  149.     FRAMEWIN_SetTitleVis(hDlg, 0);
  150. /* 得到用户区的坐标 */
  151.     WM_GetInsideRectEx(hClient, &RectInside);
  152. /* 返回窗口大小 */
  153.     WM_GetWindowRectEx(hGraph, &Rect);
  154. /* 遍历所有的子控件,并且将其隐藏 */
  155.     WM_ForEachDesc(hClient, _ForEach, &FullScreenMode); /* Hide all descendants */
  156.     /* 设置窗口位置  */
  157.     WM_SetWindowPos(hGraph, WM_GetWindowOrgX(hClient), WM_GetWindowOrgX(hClient), RectInside.x1, RectInside.y1);
  158. /* 水平范围值,显示的位置 */
  159. /* 返回的数值是以前的值 */
  160.     ScalePos = GRAPH_SCALE_SetPos(_hScaleH, RectInside.y1 - 20);
  161.   }
  162.   /* 进入正常模式 */
  163.   else {
  164.     /* 返回到正常模式 */
  165.     BUTTON_SetText(hButton, "Full Screen");
  166.     WM_MoveWindow(hButton, 0, -11);
  167.     WM_ForEachDesc(WM_GetClientWindow(hDlg), _ForEach, &FullScreenMode); /* Show all descendants */
  168.     WM_SetWindowPos(hGraph, Rect.x0, Rect.y0, Rect.x1 - Rect.x0 + 1, Rect.y1 - Rect.y0 + 1);
  169.     FRAMEWIN_SetTitleVis(hDlg, 1);
  170.     GRAPH_SCALE_SetPos(_hScaleH, ScalePos);
  171.   }
  172. }

  173. /*********************************************************************
  174. *
  175. *       _cbCallback
  176. *
  177. *  对话框回调函数
  178. */
  179. static void _cbCallback(WM_MESSAGE * pMsg) {
  180.   int i, NCode, Id, Value;
  181.   WM_HWIN hDlg, hItem;
  182.   hDlg = pMsg->hWin;
  183.   switch (pMsg->MsgId) {

  184.   /* 初始化窗口消息  */
  185.   case WM_INIT_DIALOG:

  186. /* 得到相应的句柄 */
  187.     hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  188.     /* 创建三个数据对象_ahData[i] */
  189.     for (i = 0; i < GUI_COUNTOF(_aColor); i++) {
  190.       _aValue[i] = rand() % 180;

  191.       /* 创建成功的话,返回数据句柄 */
  192.   /* 显示的曲线颜色,可以显示的最大数据个数,数据指针,要添加的数据个数 */
  193.       _ahData[i] = GRAPH_DATA_YT_Create(_aColor[i], 500, 0, 0);

  194.   /* 为绘图控件添加数据对象 */
  195.       GRAPH_AttachData(hItem, _ahData[i]);
  196.     }

  197. /* 设置绘图属性 */
  198.     /* 设置垂直栅格的高度 */
  199.     GRAPH_SetGridDistY(hItem, 25);
  200. /* 栅格是否可见 */
  201.     GRAPH_SetGridVis(hItem, 1);

  202. /* 固定X轴的栅格 */
  203.     GRAPH_SetGridFixedX(hItem, 1);
  204.     GRAPH_SetUserDraw(hItem, _UserDraw);

  205. /* 创建和增加垂直范围尺度标签  */
  206. /* 离左边的尺度位置,*/
  207.     _hScaleV = GRAPH_SCALE_Create( 35, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 35);
  208. /* 设置标签字体颜色 */
  209.     GRAPH_SCALE_SetTextColor(_hScaleV, GUI_RED);
  210. /* 将标签添加到垂直方向 */
  211.     GRAPH_AttachScale(hItem, _hScaleV);

  212. /* 创建和增加水平范围尺度标签 */
  213.     _hScaleH = GRAPH_SCALE_Create(155, GUI_TA_HCENTER, GRAPH_SCALE_CF_HORIZONTAL, 50);
  214. /* 设置字体颜色 */
  215.     GRAPH_SCALE_SetTextColor(_hScaleH, GUI_DARKGREEN);
  216.     /* 添加到水平方向 */
  217.     GRAPH_AttachScale(hItem, _hScaleH);

  218.     /* 下面的四个用来设置,上下左右四个边界 */
  219.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK2);
  220.     CHECKBOX_SetText(hItem, "L");
  221. /* 注意,下面的函数将触发回调函数的执行 */
  222.     CHECKBOX_SetState(hItem, 1);
  223.     /* 上边界 */
  224.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK3);
  225.     CHECKBOX_SetText(hItem, "T");
  226.     /* 右边界 */
  227.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK4);
  228.     CHECKBOX_SetText(hItem, "R");
  229.     /* 低边界 */
  230.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK5);
  231.     CHECKBOX_SetText(hItem, "B");


  232.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0);
  233.     CHECKBOX_SetText(hItem, "Stop");

  234.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK1);
  235.     CHECKBOX_SetText(hItem, "Grid");
  236.     CHECKBOX_SetState(hItem, 1);

  237.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK6);
  238.     CHECKBOX_SetText(hItem, "HScroll");
  239.     CHECKBOX_SetState(hItem, 1);

  240.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK7);
  241.     CHECKBOX_SetText(hItem, "VScroll");

  242.     hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK8);
  243.     CHECKBOX_SetText(hItem, "Left align");

  244.     /* 初始化滑动控件 */
  245.     hItem = WM_GetDialogItem(hDlg, GUI_ID_SLIDER0);
  246. /* 设置范围 */
  247.     SLIDER_SetRange(hItem, 0, 10);

  248. /* 特别注意,设置了此函数的话,将自动的触发执行回调  */
  249.     SLIDER_SetValue(hItem, 5);
  250. /* tick的数目:没有实际的意义 */
  251.     SLIDER_SetNumTicks(hItem, 6);

  252.     hItem = WM_GetDialogItem(hDlg, GUI_ID_SLIDER1);
  253. /* 设置范围 */
  254.     SLIDER_SetRange(hItem, 0, 20);
  255.     SLIDER_SetValue(hItem, 5);
  256. /* tick的数目 */
  257.     SLIDER_SetNumTicks(hItem, 6);

  258.     /* 初始化单选按钮控件  */
  259.     hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);
  260.     RADIO_SetText(hItem, "3D", 0);
  261.     RADIO_SetText(hItem, "flat", 1);
  262.     RADIO_SetText(hItem, "-", 2);

  263.     /* 初始化按钮控件 */
  264.     hItem = WM_GetDialogItem(hDlg, GUI_ID_BUTTON0);

  265. /* 保持一直在上层 */
  266.     WM_SetStayOnTop(hItem, 1);
  267.     break;
  268.   case WM_NOTIFY_PARENT:
  269.     Id    = WM_GetId(pMsg->hWinSrc);      /* 控件ID*/
  270.     NCode = pMsg->Data.v;                 /* 通知代码 */
  271.     switch (NCode) {
  272.     case WM_NOTIFICATION_CLICKED:
  273.       switch (Id) {
  274.       case GUI_ID_BUTTON0:
  275.   /* 进入全屏模式 */
  276.         _ToggleFullScreenMode(hDlg);
  277.         break;
  278.       }
  279.       break;
  280.     case WM_NOTIFICATION_VALUE_CHANGED:
  281.       switch (Id) {
  282.       case GUI_ID_CHECK0:
  283.         /* Toggle stop mode */
  284.         /* 翻转 */
  285.         _Stop ^= 1;
  286.         break;
  287.       case GUI_ID_CHECK1:

  288. /* 得到GRAPH0的句柄 */
  289.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  290. /* 方格是否显示 */
  291.         GRAPH_SetGridVis(hItem, CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK1)));
  292.         break;
  293.       case GUI_ID_CHECK2:
  294.       case GUI_ID_CHECK3:
  295.       case GUI_ID_CHECK4:
  296.       case GUI_ID_CHECK5:

  297. /* 设置上下左右的坐标的边界值 */
  298. /* 这里需要注意上面3个没有break */
  299.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  300. /* 设置上,下,左,右边界 */
  301.         GRAPH_SetBorder(hItem,
  302.                         CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK2)) * 40,
  303.                         CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK3)) * 5,
  304.                         CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK4)) * 5,
  305.                         CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK5)) * 5);
  306.         break;
  307.       case GUI_ID_SLIDER0:
  308. /* 设置水平方格间距 */
  309.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  310.         Value = SLIDER_GetValue(pMsg->hWinSrc) * 10;
  311. /* 设置方格的间距 */
  312.         GRAPH_SetGridDistX(hItem, Value);
  313. /* 设置tick的数值 也就是水平的坐标尺度 */
  314.         GRAPH_SCALE_SetTickDist(_hScaleH, Value);
  315.         break;
  316.       case GUI_ID_SLIDER1:
  317.     /* 设置垂直方格间距 */
  318.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  319.         Value = SLIDER_GetValue(pMsg->hWinSrc) * 5;
  320.         GRAPH_SetGridDistY(hItem, Value);
  321.     /* 设置tick的数值 也就是垂直坐标的尺度 */
  322.         GRAPH_SCALE_SetTickDist(_hScaleV, Value);
  323.         break;
  324.       case GUI_ID_RADIO0:
  325. /* 设置空间效果 */
  326.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  327.         switch (RADIO_GetValue(pMsg->hWinSrc)) {
  328.         case 0:
  329.           WIDGET_SetEffect(hItem, &WIDGET_Effect_3D);
  330.           break;
  331.         case 1:
  332.           WIDGET_SetEffect(hItem, &WIDGET_Effect_Simple);
  333.           break;
  334.         case 2:
  335.           WIDGET_SetEffect(hItem, &WIDGET_Effect_None);
  336.           break;
  337.         }
  338.         break;
  339.       case GUI_ID_CHECK6:
  340. /* 由此来触发是否选择滚动条 */
  341.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  342.         if (CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK6))) {
  343. /* 设置滚动条 */
  344.           GRAPH_SetVSizeX(hItem, 500);
  345.         } else {
  346. /* 这里设置为0,就是相当于不再显示滚动条 */
  347.           GRAPH_SetVSizeX(hItem, 0);
  348.         }
  349.         break;
  350.       case GUI_ID_CHECK7:
  351. /* 同上,这里是设置垂直的滚动条 */
  352.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  353.         if (CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK7))) {
  354.           GRAPH_SetVSizeY(hItem, 300);
  355.         } else {
  356.           GRAPH_SetVSizeY(hItem, 0);
  357.         }
  358.         break;
  359.       case GUI_ID_CHECK8:
  360. /* 这里主要是设置对齐方式 */
  361.         hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  362.         for (i = 0; i < GUI_COUNTOF(_aColor); i++) {
  363.           if (CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK8))) {
  364.             GRAPH_DATA_YT_SetAlign(_ahData[i], GRAPH_ALIGN_LEFT);
  365.           } else {
  366.             GRAPH_DATA_YT_SetAlign(_ahData[i], GRAPH_ALIGN_RIGHT);
  367.           }
  368.         }
  369.         break;
  370.       }
  371.       break;
  372.     }
  373.     break;
  374.   default:
  375.     WM_DefaultProc(pMsg);
  376.   }
  377. }

  378. /*********************************************************************
  379. *
  380. *       Public code
  381. *
  382. **********************************************************************
  383. */
  384. /*********************************************************************
  385. *
  386. *       MainTask
  387. */
  388. void MainTask(void) {
  389.   WM_HWIN hDlg, hGraph = 0,hGraph1 = 0;
  390.   GUI_Init();
  391.   GUI_CURSOR_Show();
  392.   WM_SetDesktopColor(GUI_BLACK);

  393.   #if GUI_SUPPORT_MEMDEV
  394.     /* 所以的窗体自动的使用内存设备 */
  395.     WM_SetCreateFlags(WM_CF_MEMDEV);
  396.   #endif

  397.   /* 创建对话框 */
  398.   hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  399.   while (1) {
  400.    #ifdef WIN32
  401.      GUI_Delay(10);
  402.    #endif

  403.     /* 是否设置暂停 */
  404.     if (!_Stop) {
  405.   /* 可以不需要这个,因为下面的添加数值函数没有使用这个句柄 */
  406.       if (!hGraph) {
  407.         hGraph = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
  408.       }
  409.   /* 这里是在添加数值 */
  410.       _AddValues(hGraph);
  411.     }
  412.     GUI_Exec();
  413.   }
  414. }
复制代码

实际显示效果如下:
45.4.png


45.3 使用官方GUIBulder建立Graph控件
    使用官方提供的GUIBulder5.22也可以建立Graph控件,但是不完善,只能将其添加到窗口上,下面的截图就是用GUIBulder5.22设计的。
45.5.png

    添加了Graph控件以后,当前的GUIBulder5.22版本仅支持下面两个功能(在这个控件上鼠标右击即可显示)
45.6.png

    下面我们将设置“Set boedr sizes”参数如下:
45.7.png
     设置后的显示效果如下:
45.8.png

    现在GUIBuder5.22仅支持这些功能。大家有兴趣的可以在这个的基础上面建立一个Graph控件并在模拟器或者开发板上显示出来。

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

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-3-22 22:26:08 | 显示全部楼层
/* Returns the invalid rectangle of a window in desktop coordinates */     WM_GetInvalidRect(hWin, &RectInvalid);
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-3-22 22:27:03 | 显示全部楼层
/* Returns the invalid rectangle of a window in desktop coordinates */   
WM_GetInvalidRect(hWin, &RectInvalid);                 //这个函数是干嘛额的  不理解什么是无效矩形区域
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-3-23 02:50:41 | 显示全部楼层
wx_tl3LELl8 发表于 2019-3-22 22:27
/* Returns the invalid rectangle of a window in desktop coordinates */   
WM_GetInvalidRect(hWin,  ...

这个有更简单的办法,如果你要在Graph控件上面显示文本,你仅需在对话框资源里面里面将文本控件的创建放在Graph控件后面即可。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 05:17 , Processed in 0.173468 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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