ajianyes 发表于 2024-1-7 22:42:14

STemWin5.48,GRAPH图形控件显示异常

各位大神,最近在用emwin5.48的波形显示控件GRAPH时,波形无法显示,图形上显示像波浪的擦除动作,以为是波形颜色设置问题,更改多种颜色同样看不到波形,不知道哪个环节出了问题
贴出代码,请各位帮忙指点一二,感激不尽。


#include "DIALOG.h"
#include <stdlib.h>

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_GRAPH_0 (GUI_ID_USER + 0x01)
#define ID_BUTTON_0 (GUI_ID_USER + 0x03)


// USER START (Optionally insert additional defines)
// USER END

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/

// USER START (Optionally insert additional static data)
// USER END

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "Waveform", ID_FRAMEWIN_0, 0, 0, 480, 272, 0, 0x0, 0 },
{ GRAPH_CreateIndirect, "Graph", ID_GRAPH_0, 0, 0, 474, 254, 0, 0x0, 0 },
{ BUTTON_CreateIndirect, "close", ID_BUTTON_0, 431, 1, 40, 252, 0, 0x0, 0 },
// USER START (Optionally insert additional widgets)
// USER END
};

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/

// USER START (Optionally insert additional static code)
GRAPH_DATA_Handle Graphdata;
unsigned int pBuffer;
// USER END

/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
WM_HWIN hItem;
        GRAPH_SCALE_Handle hScaleV;
int   NCode;
int   Id;
        int   i = 0;
// USER START (Optionally insert additional variables)
// USER END

switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
    //
    // Initialization of 'Graph'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0);
          Graphdata = GRAPH_DATA_YT_Create(GUI_GREEN, 300, (const short*)&pBuffer, 1);
    GRAPH_AttachData(hItem, Graphdata);
       
    GRAPH_SetBorder(hItem, 0, 0, 40, 0);
       
          GRAPH_SetColor(hItem, GUI_WHITE, GRAPH_CI_BK);
    GRAPH_SetColor(hItem, GUI_ORANGE, GRAPH_CI_GRID);
          GRAPH_SetGridDistX(hItem, 50);
          GRAPH_SetGridDistY(hItem, 50);
          GRAPH_SetLineStyleH(hItem, GUI_LS_DOT);
          GRAPH_SetLineStyleV(hItem, GUI_LS_DOT);
          GRAPH_SetGridVis(hItem, 3);
       
          hScaleV = GRAPH_SCALE_Create(15, GUI_TA_HCENTER | GUI_TA_LEFT,
                                     GRAPH_SCALE_CF_VERTICAL, 50);
          GRAPH_AttachScale(hItem, hScaleV);
          GRAPH_SCALE_SetFactor(hScaleV, 10);

    // USER START (Optionally insert additional code for further widget initialization)
    // USER END
    break;
case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0: // Notifications sent by 'close'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
      // USER START (Optionally insert code for reacting on notification message)
      // USER END
      break;
      case WM_NOTIFICATION_RELEASED:
      // USER START (Optionally insert code for reacting on notification message)
      // USER END
      break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    }
    break;
               
        case WM_PAINT:
                        GRAPH_DATA_YT_AddValue(Graphdata, pBuffer);       
          break;
// USER START (Optionally insert additional message handling)
// USER END
default:
    WM_DefaultProc(pMsg);
    break;
}
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateWaveform
*/
WM_HWIN CreateWaveform(void);
WM_HWIN CreateWaveform(void) {
WM_HWIN hWin;

hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
return hWin;
}

// USER START (Optionally insert additional public code)
void TaskMenuGraph(void)
{
        static short int i = 300;
       
        i ++;
        if(i > 500)i = 300;
        pBuffer = i;
GRAPH_DATA_YT_AddValue(Graphdata, rand()%100);
}
// USER END


ajianyes 发表于 2024-1-7 22:44:12

移植好后的emwin显示文本,图片,还有按钮之类其他控件都是正常的,感觉不像是底层没写好的原因

eric2013 发表于 2024-1-8 09:49:27

ajianyes 发表于 2024-1-7 22:44
移植好后的emwin显示文本,图片,还有按钮之类其他控件都是正常的,感觉不像是底层没写好的原因

更新位置不对,Graph的更新不能在WM_PAINT消息里面
GRAPH_DATA_YT_AddValue(Graphdata, pBuffer);      

ajianyes 发表于 2024-1-8 13:35:57

eric2013 发表于 2024-1-8 09:49
更新位置不对,Graph的更新不能在WM_PAINT消息里面
GRAPH_DATA_YT_AddValue(Graphdata, pBuffer);       ...

感谢硬汉哥回复,这个更新我单独用一个函数来TaskMenuGraph更新的。WM_PAINT是后面加上去的。是不是只需要用函数GRAPH_DATA_YT_AddValue(Graphdata, rand()%100)就可以实现波形显示

void TaskMenuGraph(void)
{
      static short int i = 300;
      
      i ++;
      if(i > 500)i = 300;
      pBuffer = i;
GRAPH_DATA_YT_AddValue(Graphdata, rand()%100);
}

caicaptain2 发表于 2024-1-8 15:37:56

本帖最后由 caicaptain2 于 2024-1-8 15:40 编辑

ajianyes 发表于 2024-1-8 13:35
感谢硬汉哥回复,这个更新我单独用一个函数来TaskMenuGraph更新的。WM_PAINT是后面加上去的。是不是只需 ...
WM_PAINT消息里面,只能使用GUI_开头的画图函数,比如画个点,画个线,画个框框之类的,不要使用任何控件类的函数。

你可以在窗口的回调函数里面加上一个定时器,比如1秒钟的周期定时器,在窗口的定时器消息中(WM_TIMER) 中调用 GRAPH_DATA_YT_AddValue(Graphdata, pBuffer);      
就可以正常刷新这个控件了。

ajianyes 发表于 2024-1-8 20:44:53

caicaptain2 发表于 2024-1-8 15:37
WM_PAINT消息里面,只能使用GUI_开头的画图函数,比如画个点,画个线,画个框框之类的,不要使用任何控件 ...

好的,非常感谢
页: [1]
查看完整版本: STemWin5.48,GRAPH图形控件显示异常