硬汉嵌入式论坛

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

[μCGUI] 为什么在UC.GUI中波形不动态显示

[复制链接]

27

主题

94

回帖

175

积分

初级会员

积分
175
发表于 2018-5-22 14:35:24 | 显示全部楼层 |阅读模式
本帖最后由 Mark 于 2018-5-22 14:47 编辑

问题如题:

  1. /*******************************************************************
  2. *
  3. *       _Draw
  4.   
  5.   Draws the graph area
  6. */
  7. static void _Draw(void * p) {
  8.   int i;
  9.   PARAM * pParam = (PARAM *)p;
  10.   GUI_SetBkColor(GUI_BLACK);
  11.   GUI_SetColor(GUI_DARKGRAY);
  12.   GUI_ClearRect(19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21));
  13.   for (i = 0; i < (YSIZE / 2); i += 20) {
  14.     GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) + i, 19, (LCD_XSIZE - 2));
  15.     if (i) {
  16.       GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) - i, 19, (LCD_XSIZE - 2));
  17.     }
  18.   }
  19.   for (i = 40; i < (LCD_XSIZE - 20); i += 40) {
  20.     GUI_DrawVLine(18 + i, (LCD_YSIZE - 20) - YSIZE, (LCD_YSIZE - 21));
  21.   }
  22.   GUI_SetColor(COLOR_GRAPH0);
  23.   GUI_DrawGraph(pParam->aY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
  24. }

  25. /*******************************************************************
  26. *
  27. *       _Draw2
  28. */
  29. static void _Draw2(void * p) {
  30.   PARAM * pParam = (PARAM *)p;
  31.   _Draw(p);
  32.   GUI_SetColor(COLOR_GRAPH1);
  33.   GUI_DrawGraph(pParam->aY+15, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
  34. }

  35. /*******************************************************************
  36. *
  37. *       _Label

  38.   Labels the x & y-axis
  39. */
  40. static void _Label(void) {
  41.   int x, y;
  42.   GUI_SetBkColor(GUI_RED);
  43.   GUI_Clear();
  44.   GUI_SetColor(GUI_WHITE);
  45.   GUI_SetFont(&GUI_Font24_ASCII);
  46.   GUI_DispStringHCenterAt("MEMDEV_DrawGraph - Sample", 160, 5);
  47.   GUI_SetPenSize(1);
  48.   GUI_ClearRect(0, (LCD_YSIZE - 21) - YSIZE, (LCD_XSIZE - 1), (LCD_YSIZE - 1));
  49.   GUI_DrawRect(18, (LCD_YSIZE - 21) - YSIZE, (LCD_XSIZE - 1), (LCD_YSIZE - 20));
  50.   GUI_SetFont(&GUI_Font6x8);
  51.   for (x = 0; x < (LCD_XSIZE - 20); x += 40) {
  52.     int xPos = x + 18;
  53.     GUI_DrawVLine(xPos, (LCD_YSIZE - 20), (LCD_YSIZE - 14));
  54.     GUI_DispDecAt(x / 40, xPos - 2, (LCD_YSIZE - 9), 1);
  55.   }
  56.   for (y = 0; y < YSIZE / 2; y += 20) {
  57.     int yPos = (LCD_YSIZE - 20) - YSIZE / 2 + y;
  58.     GUI_DrawHLine(yPos, 13, 18);
  59.     if (y) {
  60.       GUI_GotoXY(1, yPos - 4);
  61.       GUI_DispSDec(-y / 20, 2);
  62.       yPos = (LCD_YSIZE - 20) - YSIZE / 2 - y;
  63.       GUI_DrawHLine(yPos, 13, 18);
  64.       GUI_GotoXY(1, yPos - 4);
  65.       GUI_DispSDec(y / 20, 2);
  66.     } else {
  67.       GUI_DispCharAt('0', 7, yPos - 4);
  68.     }
  69.   }
  70. }


  71. static void _GetSineData(I16 * paY, int n) {
  72.   int i;
  73.   for (i = 0; i < n; i++) {
  74.     float s = sin(i * DEG2RAD * 4);
  75.     paY[i] = s * YSIZE / 2 + YSIZE / 2;
  76.   }
  77. }

  78. /*******************************************************************
  79. *
  80. *       _DemoSineWave
  81. */
  82. static void _DemoSineWave(void) {
  83.   PARAM Param;
  84.   I16 * pStart;
  85.   int t0, Cnt = 0;
  86.   GUI_RECT Rect = {19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)};
  87.   GUI_HMEM hMem = GUI_ALLOC_AllocZero(405 * sizeof(I16));
  88.   GUI_SetColor(GUI_WHITE);
  89.   GUI_SetBkColor(GUI_RED);
  90.   GUI_ClearRect(0, 55, LCD_XSIZE, 75);
  91.   GUI_SetFont(&GUI_FontComic18B_1);
  92.   GUI_DispStringAt("Sine wave", 20, 55);
  93.   pStart = GUI_ALLOC_h2p(hMem);
  94.   _GetSineData(pStart, 405);
  95.   GUI_SetFont(&GUI_Font6x8);
  96.   t0 = GUI_GetTime();
  97.   while((GUI_GetTime() - t0) < 10000)
  98.           {

  99.     if (Cnt++ % 90) {
  100.       Param.aY++;
  101.     } else {
  102.       Param.aY = pStart;
  103.     }
  104.     GUI_MEMDEV_Draw(&Rect, _Draw2, &Param, 0, 0);

  105.   }
  106.   GUI_ALLOC_Free(hMem);
  107. }
复制代码
如果是按照以上这种写法,在mian中调用这个波形他是一个动态的。

但是如果我如果按照以下这种方式在回调函数中使用:
  1. case WM_PAINT:
  2.         PaintDialog5_1(pMsg);
  3.         _Label();        
  4.         _DemoSineWave();
复制代码
(图片貌似现在上传不了,说是Server (IO) Error)那就口述一下吧。显示的效果就会从屏幕的上面到下面慢慢刷新,而且显示出来的波形也不是动态的。
也搜索了一些资料,有的说是GUI动态内存的问题(我也修改了我相关内存大小,但是都没反应)我也强制WM_SendMessageNoPara(WM_GetClientWindow(hDlg),WM_PAINT);用这种方式触发WM_PAINT但是效果还是一样的。

求大神帮我看看,我这个到底问题在哪,或者应该怎么样在FRAMEWIN这个窗口控件上用2D图形接口来显示一个动态波形!




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-5-23 09:02:30 | 显示全部楼层
你用的UCGUI没有Graph控件么,直接用控件绘制即可。
回复

使用道具 举报

27

主题

94

回帖

175

积分

初级会员

积分
175
 楼主| 发表于 2018-5-23 10:11:16 | 显示全部楼层
eric2013 发表于 2018-5-23 09:02
你用的UCGUI没有Graph控件么,直接用控件绘制即可。

硬汉哥,我用的是UC/GUI3.90没有那个控件的,所以只能使用2D的绘画。不过硬汉哥,这个问题我昨天晚上已经解决了。还是在WM_PAINT下做的处理,用数组来移位,然后无效化当前窗口,来做的刷新,现在可以正常显示动态波形了。

多谢硬汉哥每次的回帖,感谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-5-23 13:57:20 | 显示全部楼层
Mark 发表于 2018-5-23 10:11
硬汉哥,我用的是UC/GUI3.90没有那个控件的,所以只能使用2D的绘画。不过硬汉哥,这个问题我昨天晚上已经 ...

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 18:30 , Processed in 0.160267 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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