硬汉嵌入式论坛

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

[emWin] 关于创建emwin窗口定时器后无法触发的问题

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2025-11-3 10:29:36 | 显示全部楼层 |阅读模式
自己做了一个工程,移植了RTX5,和emwin;创建WM_CreateTimer后,无法触发回调函数中的case WM_TIMER:,麻烦大佬帮我看看哪里的问题



/* Includes ------------------------------------------------------------------*/
#include "DIALOG.h"
#include "main.h"
/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define ID_GRAPH_0 (GUI_ID_USER + 0x01)

#define FRAME_DIST_U  10  //  上边框距离
#define FRAME_DIST_D  11  //  下边框距离
#define FRAME_DIST_L  70  //  左边框距离
#define FRAME_DIST_R  7  //  右边框距离
#define GRID_DIST_X   90  //  X轴网格线距离
#define GRID_DIST_Y   76  //  Y轴网格线距离
#define SCALE_NUM_DECS 2 //  刻度小数部分位数
#define SCALE_TEXT_FONT GUI_FONT_16_ASCII //  刻度文本颜色
#define SCALE_TEXT_COLOR GUI_YELLOW //  刻度文本颜色
#define SCALE_TICK_DIST GRID_DIST_Y//  刻度编号距离

#define SCALE_Factor  1.0f  //  刻度比例因子

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 },
  { GRAPH_CreateIndirect, "Graph", ID_GRAPH_0, 0, 0, 800, 480, 0, 0x0, 0 },

};


static GRAPH_Handle hGraph;      //Graph 控件
static GRAPH_DATA_Handle hData;      //数据对象
static GRAPH_SCALE_Handle hScaleY;      //刻度对象
static I16 Data1_rand[200] = {0};     //随机数组




static void win_init(WM_MESSAGE *pMsg)
{
    uint32_t cnt = 0;
    char str[32];
    // 设置会话窗口背景颜色
    WINDOW_SetBkColor(pMsg->hWin, GUI_BLACK);
    // 设置GRAPH控件的基本属性
    hGraph = WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0);
    GRAPH_SetColor(hGraph, GUI_TRANSPARENT, GRAPH_CI_BK);       // 设置背景色
    GRAPH_SetColor(hGraph, GUI_BLACK, GRAPH_CI_BORDER);   // 设置边框区域颜色
    GRAPH_SetColor(hGraph, GUI_WHITE, GRAPH_CI_FRAME);    // 设置细框架颜色
    GRAPH_SetColor(hGraph, GUI_GRAY, GRAPH_CI_GRID);      // 设置网格颜色
    GRAPH_SetLineStyleH(hGraph, GUI_LS_DOT);              // 设置水平网格线的线型,圆点样式
    GRAPH_SetLineStyleV(hGraph, GUI_LS_DOT);              // 设置垂直网格线的线型,圆点样式
    GRAPH_SetBorder(hGraph, FRAME_DIST_L, FRAME_DIST_U, FRAME_DIST_R, FRAME_DIST_D);               // 设置边框距离,左上右下
    GRAPH_SetGridVis(hGraph, 1);                         // 设置网格可见性,显示网格
    GRAPH_SetGridDistX(hGraph,GRID_DIST_X );                      // 设置X轴网格间距
    GRAPH_SetGridDistY(hGraph, GRID_DIST_Y);                      // 设置Y轴网格间距

    // 设置Y轴刻度的基本属性
    hScaleY = GRAPH_SCALE_Create(60, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, SCALE_TICK_DIST);
    GRAPH_SCALE_SetFont(hScaleY, SCALE_TEXT_FONT);  // 设置刻度的文本字体
    GRAPH_SCALE_SetNumDecs(hScaleY, SCALE_NUM_DECS);     // 设置小数部分位数
    GRAPH_SCALE_SetTextColor(hScaleY, SCALE_TEXT_COLOR);  // 设置刻度的文本颜色
    GRAPH_SCALE_SetTickDist(hScaleY, SCALE_TICK_DIST);    // 设置编号距离
    GRAPH_SCALE_SetOff(hScaleY, SCALE_TICK_DIST * 3);   // 刻度偏移,用于产生负刻度
    GRAPH_SCALE_SetFactor(hScaleY, SCALE_Factor);   // 设置刻度因子
    // 将刻度附加到GRAPH
    GRAPH_AttachScale(hGraph, hScaleY);

    // 创建数据
    hData = GRAPH_DATA_YT_Create(GUI_GREEN, 700, Data1_rand, 1);
    GRAPH_AttachData(hGraph, hData);      //附加 数据对象
    GRAPH_DATA_YT_SetOffY(hData, 228);      //将数据上移 50 个像素,与刻度对应
    GRAPH_DATA_YT_SetAlign(hData, GRAPH_ALIGN_LEFT);     //设置数据对齐方式
}

/*********************************************************************
*
*       _cbDialog
*/
long dbg_timer;
static void _cbDialog(WM_MESSAGE *pMsg)
{
    WM_HWIN hItem;
    char str[128];
    uint16_t i;
    switch (pMsg->MsgId)
    {
    case WM_INIT_DIALOG:
        win_init(pMsg);
        dbg_timer = WM_CreateTimer(pMsg->hWin, 0, 100, 0);
        break;
    case WM_PAINT:
        break;
    case WM_TIMER:
        for(uint16_t i = 0; i < 200; i++)
        {
            GRAPH_DATA_YT_AddValue(hData, rand() % 50 + 25);
        }
        GUI_Exec();
        WM_RestartTimer(pMsg->Data.v, 50);
        break;
    case WM_DELETE:
        break;
    default:
        WM_DefaultProc(pMsg);
        break;
    }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateWindow
*/
WM_HWIN Window_Test(void);
WM_HWIN Window_Test(void)
{
    WM_HWIN hWin;
    /* 创建一个对话框窗口 */
    hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
    return hWin;
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-11-3 14:39:28 | 显示全部楼层
两个问题

1、不要在WM_TIMER里面调用GUI_Exec,这个属于嵌套调用,本身WM_IIMER的执行就是通过之前的GUI_Exec,GUI_Delay或者WM_Exec调用的。

你仅需在你的主程序里面调用GUI_Delay就会执行emWin的WM_TIMER

2、注意CreateTimer的形参

123.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-21 19:55 , Processed in 0.046447 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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