硬汉嵌入式论坛

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

[emWin] 切换页面时先关闭graph出现问题

[复制链接]

5

主题

6

回帖

21

积分

新手上路

积分
21
发表于 2024-4-17 15:21:32 | 显示全部楼层 |阅读模式
#include "graphyt.h"
#include "DIALOG.h"
#include "AFE4400.h"
#include "malloc.h"
#include "exti.h"
#include "led.h"
extern GUI_CONST_STORAGE GUI_FONT GUI_Fontfont28;
extern GUI_CONST_STORAGE GUI_FONT GUI_Fontfont24;
extern GUI_CONST_STORAGE GUI_FONT GUI_Fontfont18;
_oscill_dev oscilldev;
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//STemwin GRAPH控件使用   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2016/3/19
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////        

//控件ID
#define ID_FRAMEWIN_0         (GUI_ID_USER + 0x00)
#define ID_TEXT_0 (GUI_ID_USER + 0x02)
#define ID_TEXT_1 (GUI_ID_USER + 0x06)
#define ID_TEXT_2 (GUI_ID_USER + 0x07)
#define ID_TEXT_3 (GUI_ID_USER + 0x08)
#define ID_TEXT_4 (GUI_ID_USER + 0x09)
#define ID_GRAPH_0                 (GUI_ID_USER + 0x01)
#define ID_GRAPH_1                 (GUI_ID_USER + 0x03)
#define ID_GRAPH_2                 (GUI_ID_USER + 0x04)
#define ID_GRAPH_3                 (GUI_ID_USER + 0x05)
#define ID_LISTVIEW_0 (GUI_ID_USER + 0x0D)

#define BORDER_TOP                7
#define BORDER_BOTTOM             20
#define BORDER_LEFT               40
#define BORDER_RIGHT              10


static GRAPH_SCALE_Handle hScaleV;           //垂直刻度句柄
static GRAPH_SCALE_Handle hScaleH;           //水平刻度句柄


//_oscill_dev oscilldev;

GUI_COLOR LineColor[]={GUI_RED,GUI_BLACK,GUI_WHITE,GUI_YELLOW,GUI_BLUE,GUI_DARKMAGENTA};
GUI_COLOR BackColor[]={GUI_BLACK,GUI_LIGHTRED,GUI_DARKMAGENTA,GUI_WHITE,GUI_GREEN};
//对话框资源表
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{
        { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800, 480, 0, 0, 0},
        { TEXT_CreateIndirect, "Text0", ID_TEXT_0, 2, 1, 159, 40, 0, 100, 0 },
        { TEXT_CreateIndirect, "Text1", ID_TEXT_1, 340, 50, 30, 150, 0, 100, 0 },
        { TEXT_CreateIndirect, "Text2", ID_TEXT_2, 408, 50, 30, 150, 0, 100, 0 },
        { TEXT_CreateIndirect, "Text3", ID_TEXT_3, 340, 232, 30, 150, 0, 100, 0 },
        { TEXT_CreateIndirect, "Text4", ID_TEXT_4, 408, 232, 30, 150, 0, 100, 0 },
        { LISTVIEW_CreateIndirect, "Listview0", ID_LISTVIEW_0, 408, 232, 1, 1, 0, 0, 0 },
        { GRAPH_CreateIndirect, "Graph0", ID_GRAPH_0, 75, 35, 253, 180, 0, 0x0, 0},
        { GRAPH_CreateIndirect, "Graph1", ID_GRAPH_1, 450, 35, 253, 180, 0, 0x0, 0},
        { GRAPH_CreateIndirect, "Graph2", ID_GRAPH_2, 75, 217, 253, 180, 0, 0x0, 0},
        { GRAPH_CreateIndirect, "Graph3", ID_GRAPH_3, 450, 217, 253, 180, 0, 0x0, 0},
};

//对话框回调函数
static void _cbDialog(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        WM_HWIN hGraph0;
        WM_HWIN hGraph1;
        WM_HWIN hGraph2;
        WM_HWIN hGraph3;
        GUI_UC_SetEncodeUTF8();
        switch (pMsg->MsgId)
        {
                case WM_INIT_DIALOG:
                        //初始化FRAMEWIN
               
                hItem = pMsg->hWin;
    FRAMEWIN_SetTitleHeight(hItem, 80);
          FRAMEWIN_SetText(hItem, "参数曲线");
    FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    FRAMEWIN_SetFont(hItem, &GUI_Fontfont28);
    FRAMEWIN_SetTextColor(hItem, 0x00000000);
                //
    // Initialization of 'Text0'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetText(hItem, "上下键翻页");
    TEXT_SetTextColor(hItem, 0x00000000);
    TEXT_SetFont(hItem, &GUI_Fontfont18);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                //
    // Initialization of 'Text1'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
    TEXT_SetText(hItem, "高\n压\n曲\n线");
    TEXT_SetTextColor(hItem, 0x00000000);
    TEXT_SetFont(hItem, &GUI_Fontfont24);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                //
    // Initialization of 'Text2'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
    TEXT_SetText(hItem, "脉\n搏\n波");
    TEXT_SetTextColor(hItem, 0x00000000);
    TEXT_SetFont(hItem, &GUI_Fontfont24);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                //
    // Initialization of 'Text3'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_3);
    TEXT_SetText(hItem, "低\n压\n曲\n线");
    TEXT_SetTextColor(hItem, 0x00000000);
    TEXT_SetFont(hItem, &GUI_Fontfont24);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                //
    // Initialization of 'Text4'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_4);
    TEXT_SetText(hItem, "脉\n率\n曲\n线");
    TEXT_SetTextColor(hItem, 0x00000000);
    TEXT_SetFont(hItem, &GUI_Fontfont24);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                        //初始化GRAPH_0,高压曲线
                        hGraph0=WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0);
                        oscilldev.linecolorindex=0;                //线条默认红色
                        oscilldev.backcolorindex=3;                //背景默认白色
                        oscilldev.linecolor=LineColor[oscilldev.linecolorindex];
                        oscilldev.backcolor=BackColor[oscilldev.backcolorindex];
                        GRAPH_SetColor(hGraph0,oscilldev.backcolor,GRAPH_CI_BK);//设置GRAPH背景颜色
                        oscilldev.graphdata0=GRAPH_DATA_YT_Create(oscilldev.linecolor,200,0,0);  //创建YT数据对象
                        GRAPH_AttachData(hGraph0,oscilldev.graphdata0);                                    //将数据对象添加到GRAPH控件中
                        GRAPH_SetBorder(hGraph0,BORDER_LEFT,BORDER_TOP,BORDER_RIGHT,BORDER_BOTTOM);//设置边界
      GRAPH_SetGridDistX(hGraph0,40);                //设置水平网格间距
                        GRAPH_SetGridDistY(hGraph0,25);                //设置垂直网格间距
                        GRAPH_SetGridVis(hGraph0,0);                        //设置网格可见
               
                        hScaleV=GRAPH_SCALE_Create(35,GUI_TA_RIGHT,GRAPH_SCALE_CF_VERTICAL,25); //绘制垂直刻度
                        GRAPH_SCALE_SetTextColor(hScaleV,GUI_BLACK);
                        GRAPH_AttachScale(hGraph0,hScaleV);   //将刻度对象附加到图形小工具
      GRAPH_SCALE_SetFactor(hScaleV,0.4);  //设置刻度系数
      GRAPH_SCALE_SetOff(hScaleV,-225);    //垂直刻度向上移动200个像素点,这样垂直刻度会有负值
                        GRAPH_SCALE_SetFont(hScaleV, GUI_FONT_24B_ASCII);
                       
                        hScaleH=GRAPH_SCALE_Create(160,GUI_TA_HCENTER,GRAPH_SCALE_CF_HORIZONTAL,40);//绘制水平刻度
                        GRAPH_SCALE_SetTextColor(hScaleH,GUI_DARKGREEN);
                        GRAPH_AttachScale(hGraph0,hScaleH);   //将刻度对象附加到图形小工具
                        GRAPH_SCALE_SetFactor(hScaleH,0.175);
                        GRAPH_SCALE_SetFont(hScaleH, GUI_FONT_20B_ASCII);
                       
                        //初始化GRAPH_1,脉搏波曲线
                        hGraph1=WM_GetDialogItem(pMsg->hWin, ID_GRAPH_1);
                        oscilldev.linecolorindex=1;                //线条默认黑色
                        oscilldev.backcolorindex=3;                //背景默认白色
                        oscilldev.linecolor=LineColor[oscilldev.linecolorindex];
                        oscilldev.backcolor=BackColor[oscilldev.backcolorindex];
                        GRAPH_SetColor(hGraph1,oscilldev.backcolor,GRAPH_CI_BK);//设置GRAPH背景颜色
                        oscilldev.graphdata1=GRAPH_DATA_YT_Create(oscilldev.linecolor,200,0,0);  //创建YT数据对象
                        GRAPH_AttachData(hGraph1,oscilldev.graphdata1);                                    //将数据对象添加到GRAPH控件中
                        GRAPH_SetBorder(hGraph1,BORDER_LEFT,BORDER_TOP,BORDER_RIGHT,BORDER_BOTTOM);//设置边界
      GRAPH_SetGridDistX(hGraph1,40);                //设置水平网格间距
                        GRAPH_SetGridDistY(hGraph1,25);                //设置垂直网格间距
                        GRAPH_SetGridVis(hGraph1,0);                        //设置网格可见
               
                        hScaleV=GRAPH_SCALE_Create(35,GUI_TA_RIGHT,GRAPH_SCALE_CF_VERTICAL,25); //绘制垂直刻度
                        GRAPH_SCALE_SetTextColor(hScaleV,GUI_BLACK);
                        GRAPH_AttachScale(hGraph1,hScaleV);   //将刻度对象附加到图形小工具
      GRAPH_SCALE_SetFactor(hScaleV,0.4);  //设置刻度系数
      GRAPH_SCALE_SetOff(hScaleV,-225);    //垂直刻度向上移动200个像素点,这样垂直刻度会有负值
                        GRAPH_SCALE_SetFont(hScaleV, GUI_FONT_24B_ASCII);
                       
                        hScaleH=GRAPH_SCALE_Create(160,GUI_TA_HCENTER,GRAPH_SCALE_CF_HORIZONTAL,40);//绘制水平刻度
                        GRAPH_SCALE_SetTextColor(hScaleH,GUI_DARKGREEN);
                        GRAPH_AttachScale(hGraph1,hScaleH);   //将刻度对象附加到图形小工具
                        GRAPH_SCALE_SetFactor(hScaleH,0.175);
                        GRAPH_SCALE_SetFont(hScaleH, GUI_FONT_20B_ASCII);
                        break;
                case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                                                                case GUI_KEY_INSERT:
                                                                                GRAPH_DetachData(hGraph0,oscilldev.graphdata0);
                                                                                GRAPH_DetachScale(hGraph0,hScaleV);
                                                                                GRAPH_DetachScale(hGraph0,hScaleH);//分离后的数据对象和刻度对象依然占用内存,需要手动删除
                                                                                GRAPH_DATA_YT_Delete(oscilldev.graphdata0);
                                                                                WM_DeleteWindow(hGraph0);
                                                                                GRAPH_DetachData(hGraph1,oscilldev.graphdata1);
                                                                                GRAPH_DetachScale(hGraph1,hScaleV);
                                                                                GRAPH_DetachScale(hGraph1,hScaleH);//分离后的数据对象和刻度对象依然占用内存,需要手动删除
                                                                                GRAPH_DATA_YT_Delete(oscilldev.graphdata1);
                                                                                WM_DeleteWindow(hGraph1);
                                                                                GUI_EndDialog(pMsg->hWin,0);
                                                                                User1_historicaldata();
                                                                                break;
                                                                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(pMsg->hWin,0);
                                                                                CreateFramewin1();
                    break;
            }
                                                break;
               
                default:
                        WM_DefaultProc(pMsg);
                        break;
  }
}

//__IO u8 graph_fre=0; //图形刷新频率统计器

WM_HWIN Graphyt_demo(void);
//图形显示demo
WM_HWIN Graphyt_demo(void)
{
        WM_HWIN hWin,ClientWin;
        int Graph_xSize,Graph_ySize;               
        int i;

        //WM_SetCallback(WM_HBKWIN,_cbBkWindow);    //设置背景窗口回调函数
        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, WM_HBKWIN,10,9);
        ClientWin = WM_GetDialogItem(hWin, ID_GRAPH_0);
        Graph_xSize=WM_GetWindowSizeX(ClientWin);
        Graph_ySize=WM_GetWindowSizeY(ClientWin);
       
        oscilldev.dataxsize=Graph_xSize-BORDER_LEFT-BORDER_RIGHT-3;
        oscilldev.dataysize=Graph_ySize-BORDER_TOP-BORDER_BOTTOM-3;       

        oscilldev.buffer0=mymalloc(SRAMIN,oscilldev.dataxsize*4);        //申请内存
        oscilldev.buffer1=mymalloc(SRAMIN,oscilldev.dataxsize*4);        //申请内存
        //oscilldev.buffer2=mymalloc(SRAMIN,oscilldev.dataxsize*4);        //申请内存
        //oscilldev.buffer3=mymalloc(SRAMIN,oscilldev.dataxsize*4);        //申请内存
                for(i=0;i<200;i++)
                        {
                //向GRAPH图形小工具添加数据,注意要缩20倍,因为垂直坐标扩大(缩放)20倍,
                //并且还要加200,因为垂直坐标上移了200个像素点
                                        oscilldev.buffer0=90+i*0.5;
                                        oscilldev.buffer1=90+i*0.5;
                                        //oscilldev.buffer2=90+i*0.5;
                                        //oscilldev.buffer3=90+i*0.5;
                                        GRAPH_DATA_YT_AddValue(oscilldev.graphdata0,oscilldev.buffer0/0.4-225);
                                        GRAPH_DATA_YT_AddValue(oscilldev.graphdata1,oscilldev.buffer1/0.4-225);
                                        //GRAPH_DATA_YT_AddValue(oscilldev.graphdata2,oscilldev.buffer2/0.4-225);
                                        //GRAPH_DATA_YT_AddValue(oscilldev.graphdata3,oscilldev.buffer3i]/0.4-225);
                                       
                        }
                        GUI_Exec();
        /*while(1)
        {
               
                if(oscilldev.adflag==1)
                {       
            GRAPH_DATA_YT_Clear(oscilldev.graphdata); //清除上一次显示
                        for(i=0;i<oscilldev.dataxsize;i++)
                        {
                //向GRAPH图形小工具添加数据,注意要缩20倍,因为垂直坐标扩大(缩放)20倍,
                //并且还要加200,因为垂直坐标上移了200个像素点
                                GRAPH_DATA_YT_AddValue(oscilldev.graphdata,oscilldev.buffer/20+200);
                        }
                        memset(oscilldev.buffer,0,oscilldev.dataxsize);        //清空buffer
                        oscilldev.adflag=0;       
                }
    graph_fre++;
                GUI_Delay(10);
                GUI_Exec();
        }*/
        return hWin;
}

想按下按键后先释放graph再切换页面,但是在红色部分进入了HardFault?
请问硬汉怎么解决?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106718
QQ
发表于 2024-4-18 09:04:42 | 显示全部楼层
这个是局部变量,有问题,退出函数后会释放。

   WM_HWIN hGraph0;
        WM_HWIN hGraph1;
        WM_HWIN hGraph2;
        WM_HWIN hGraph3;
回复

使用道具 举报

5

主题

6

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-4-18 10:03:57 | 显示全部楼层
eric2013 发表于 2024-4-18 09:04
这个是局部变量,有问题,退出函数后会释放。

   WM_HWIN hGraph0;

硬汉哥NB,已经解决啦,感谢感谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 17:13 , Processed in 0.281478 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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