你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第45章 GRAPH-图形控件

[复制链接]
baiyongbin2009 发布时间:2015-3-3 12:03
本帖最后由 baiyongbin2009 于 2015-3-3 12:06 编辑

特别说明:完整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值的曲线。此数据对象的典型应用是显示测量值连续更新的曲线。

收藏 1 评论11 发布时间:2015-3-3 12:03

举报

11个回答
baiyongbin2009 回答时间:2015-3-3 12:04:51
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


baiyongbin2009 回答时间:2015-3-3 12:05:33
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的实例,大家可以研究下。

lkl0305 回答时间:2015-3-3 20:29:43
多谢分享
埃斯提爱慕 回答时间:2015-3-3 20:49:39
提示: 作者被禁止或删除 内容自动屏蔽
outstanding1573 回答时间:2015-3-4 08:33:13
不错  支持一下
说不定 回答时间:2015-3-4 09:00:26
谢谢分享                  
wyxy163@126.com 回答时间:2015-3-4 15:08:54
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-3-4 15:09:12
提示: 作者被禁止或删除 内容自动屏蔽
梦旺龙 回答时间:2015-3-4 15:35:36
学习学习
cool-366442 回答时间:2016-6-29 16:26:00
就问下,它的实时刷新速度最快能到us级别吗?如果能如何实现?
zhangxu56726 回答时间:2016-7-1 10:23:02
那个STemWin的1-60期教程  的视频,有几期没有

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版