emwin graph 实时显示

本文揭示了如何在GUI编程中通过`WM_SetCreateFlags(WM_CF_MEMDEV)`启用内存设备支持,以实现实时数据在Graph上的动态更新。通过样例代码解析,教你如何配合`CreateWindow()`确保图形界面流畅运行。

在网上找了一大堆关于 graph实时显示的问题,都没有说明到关键地方. 因为使用了样例工程,发现直接调用.

  #if GUI_SUPPORT_MEMDEV
    WM_SetCreateFlags(WM_CF_MEMDEV);
  #endif

保证 GUI_SUPPORT_MEMDEV 宏打开即可.

样例代码如下:


  WM_SetCreateFlags(WM_CF_MEMDEV);//最关键的地方.

  hDlg =CreateWindow();//

while (1)

{

    if( hwin_graph != NULL)
        {
                    temp++;


                    GRAPH_DATA_YT_AddValue(_ahData[0], temp);

         }
         
    GUI_Exec();

}

<think>我们使用emWinGRAPH控件时,默认的坐标轴刻度是数字。但有时我们需要将坐标轴刻度显示为字符(比如星期几、月份等)。这可以通过自定义刻度标签的回调函数来实现。 具体步骤: 1. 创建GRAPH控件。 2. 使用GRAPH_SCALE_Create()创建刻度对象,并关联到GRAPH控件。 3. 设置刻度标签的回调函数,在该回调函数中返回字符串而不是数字。 4. 将刻度对象添加到GRAPH控件。 以下是一个示例代码,假设我们有一个GRAPH控件,其X轴表示星期(0~6),我们希望将0显示为"Sun",1显示为"Mon",以此类推。 注意:这个例子基于emWin的API,通常用于嵌入式系统的GUI开发。</think># emWin GRAPH 控件坐标轴字符显示实现 在 emWin 中,GRAPH 控件的坐标轴默认显示数字刻度,但可以通过自定义回调函数实现字符显示。下面我将详细介绍如何实现这一功能。 ## 解决方案 ### 核心思路 1. 创建 GRAPH 控件并设置基本属性 2. 创建刻度对象(GRAPH_SCALE)并关联到坐标轴 3. 实现自定义标签回调函数,将数值映射为字符 4. 将刻度对象添加到 GRAPH 控件 ### 完整代码实现 ```c #include "GUI.h" #include "GRAPH.h" // 定义星期字符串数组 static const char *weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; // 定义月份字符串数组 static const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; // 自定义标签回调函数 - X轴(星期) static void _cbLabelX(GRAPH_SCALE_Handle hScale, int Value, char *pBuffer, int BufferSize, void *pUserData) { // 确保值在有效范围内 if (Value >= 0 && Value < 7) { GUI_strncpy(pBuffer, weekdays[Value], BufferSize - 1); } else { GUI_snprintf(pBuffer, BufferSize, "%d", Value); } } // 自定义标签回调函数 - Y轴(月份) static void _cbLabelY(GRAPH_SCALE_Handle hScale, int Value, char *pBuffer, int BufferSize, void *pUserData) { // 确保值在有效范围内 if (Value >= 0 && Value < 12) { GUI_strncpy(pBuffer, months[Value], BufferSize - 1); } else { GUI_snprintf(pBuffer, BufferSize, "%d", Value); } } void MainTask(void) { // 初始化GUI GUI_Init(); // 创建窗口 WM_HWIN hWin = WM_CreateWindow(10, 10, 300, 200, WM_CF_SHOW, NULL, 0); // 创建GRAPH控件 GRAPH_Handle hGraph = GRAPH_CreateEx(20, 20, 260, 150, hWin, WM_CF_SHOW, 0, GUI_ID_GRAPH0); // 设置GRAPH背景色 GRAPH_SetBkColor(hGraph, GUI_WHITE); // 创建X轴刻度对象 GRAPH_SCALE_Handle hScaleX = GRAPH_SCALE_Create(25, GUI_TA_BOTTOM, GRAPH_SCALE_CF_HORIZONTAL, 0, 6); // 设置X轴标签回调 GRAPH_SCALE_SetTextCallback(hScaleX, _cbLabelX, NULL); // 设置X轴刻度位置 GRAPH_SCALE_SetPos(hScaleX, 0, 120); // 创建Y轴刻度对象 GRAPH_SCALE_Handle hScaleY = GRAPH_SCALE_Create(25, GUI_TA_LEFT, GRAPH_SCALE_CF_VERTICAL, 0, 11); // 设置Y轴标签回调 GRAPH_SCALE_SetTextCallback(hScaleY, _cbLabelY, NULL); // 设置Y轴刻度位置 GRAPH_SCALE_SetPos(hScaleY, 30, 0); // 将刻度对象添加到GRAPH控件 GRAPH_AttachScale(hGraph, hScaleX); GRAPH_AttachScale(hGraph, hScaleY); // 添加示例数据点 GRAPH_DATA_Handle hData = GRAPH_DATA_YT_Create(GUI_RED, 100, 0, 0); GRAPH_DATA_YT_AddValue(hData, 3); // Wed GRAPH_DATA_YT_AddValue(hData, 7); // Aug GRAPH_DATA_YT_AddValue(hData, 5); // Jun GRAPH_DATA_YT_AddValue(hData, 2); // Tue GRAPH_DATA_YT_AddValue(hData, 10); // Nov GRAPH_AttachData(hGraph, hData); // 主循环 while (1) { GUI_Delay(100); } } ``` ### 代码解释 1. **字符串数组定义** ```c static const char *weekdays[] = {"Sun", "Mon", ...}; static const char *months[] = {"Jan", "Feb", ...}; ``` 定义了两个字符串数组,分别对应X轴(星期)和Y轴(月份)的显示文本。 2. **自定义标签回调函数** ```c static void _cbLabelX(...) { if (Value >= 0 && Value < 7) { GUI_strncpy(pBuffer, weekdays[Value], ...); } else { GUI_snprintf(pBuffer, BufferSize, "%d", Value); } } ``` - 当值在有效范围内时,返回对应的字符串 - 当值超出范围时,显示原始数值作为后备 3. **GRAPH控件创建** ```c GRAPH_Handle hGraph = GRAPH_CreateEx(...); ``` 创建GRAPH控件并指定位置和大小 4. **刻度对象创建与配置** ```c GRAPH_SCALE_Handle hScaleX = GRAPH_SCALE_Create(...); GRAPH_SCALE_SetTextCallback(hScaleX, _cbLabelX, NULL); GRAPH_SCALE_SetPos(hScaleX, 0, 120); ``` - 创建刻度对象 - 设置自定义标签回调函数 - 设置刻度位置 5. **数据添加** ```c GRAPH_DATA_Handle hData = GRAPH_DATA_YT_Create(...); GRAPH_DATA_YT_AddValue(hData, 3); // Wed对应的值 ``` 添加示例数据点,X轴自动递增,Y轴为指定值 ### 效果说明 该程序将显示一个图表: - X轴显示星期(Sun, Mon, Tue等) - Y轴显示月份(Jan, Feb, Mar等) - 包含5个数据点,每个点对应特定的星期和月份 ## 自定义选项 1. **修改显示内容**:只需更改`weekdays`或`months`数组的内容 2. **扩展其他轴**:可同样方法为右侧或顶部坐标轴添加字符标签 3. **动态更新**:可在回调函数中添加逻辑,根据数值动态生成文本 4. **样式调整**:使用`GRAPH_SCALE_SetFont()`和`GRAPH_SCALE_SetTextColor()`调整标签样式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值