硬汉嵌入式论坛

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

[emWin] 各位大佬跪求解决-滑动条和图片刷新延迟问题

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2021-11-15 11:30:09 | 显示全部楼层 |阅读模式
本帖最后由 barrylee 于 2021-11-15 11:36 编辑

是这样的:
有一个颜色滑动条控件,然后共有23种颜色可以调节,另外有一个图片显示空间,每一个颜色滑动条的值对应一个图片。我是大概这样刷新的case WM_TIMER:
if(is_pressed){
SLIDER_SetValue(WM_GetDialogItem(chwin,ID_SLIDER),value);
WM_InvalidateWindow(WM_GetDialogItem(chwin,ID_IMAGE));
}
这个是写在case WM_TIMER中的,只要滑动条的值发生变化,更新滑动条的位置然后刷新图片,但是这样就会导致滑动条刷新很慢,有延迟,如果托着滑动条走的话,就会滑动条不跟手。
有没有大佬给个优化建议,让更新实时一点。拜谢各位大佬。刚接触这个领域,真的不会。求帮助

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-15 12:56:29 | 显示全部楼层
方便的话,贴下稍微完整的测试代码。
回复

使用道具 举报

3

主题

424

回帖

433

积分

高级会员

积分
433
发表于 2021-11-15 13:01:13 | 显示全部楼层
这个需求完全参考示例就能满足你的DIALOG_SliderColor.c
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"

  4. /*********************************************************************
  5. *
  6. *       Defines
  7. *
  8. **********************************************************************
  9. */
  10. //
  11. // Recommended memory to run the sample with adequate performance
  12. //
  13. #define RECOMMENDED_MEMORY (1024L * 15)

  14. /*********************************************************************
  15. *
  16. *       Static data, SeggerLogo
  17. *
  18. **********************************************************************
  19. */
  20. /*********************************************************************
  21. *
  22. *       Bitmap SeggerLogo
  23. */
  24. static const GUI_COLOR ColorsSeggerLogoBlue16[] = {
  25.      0x0000FF,0x000000,0x888888,0xFFFFFF
  26.     ,0xFF0000,0xBBBBBB
  27. };

  28. static const GUI_LOGPALETTE PalSeggerLogoBlue16 = {
  29.   6,        // number of entries
  30.   1,         // Has transparency
  31.   &ColorsSeggerLogoBlue16[0]
  32. };

  33. static const unsigned char acSeggerLogoBlue16[] = {
  34.   ...
  35. };

  36. static const GUI_BITMAP bmSeggerLogoBlue = {
  37. 138,                  // XSize
  38.   65,                  // YSize
  39.   69,                  // BytesPerLine
  40.    4,                  // BitsPerPixel
  41. acSeggerLogoBlue16,   // Pointer to picture data (indices)
  42. &PalSeggerLogoBlue16  // Pointer to palette
  43. };

  44. /*********************************************************************
  45. *
  46. *       Static data, dialog resource
  47. *
  48. **********************************************************************
  49. */
  50. /*********************************************************************
  51. *
  52. *       Dialog resource
  53. *
  54. * Function description
  55. *   This table conatins the info required to create the dialog.
  56. *   It has been created manually, but could also be created by a GUI-builder.
  57. */
  58. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  59.   { FRAMEWIN_CreateIndirect, "Adjust color", 0,         10,  40, 300, 160, FRAMEWIN_CF_MOVEABLE},
  60.   { TEXT_CreateIndirect,     "Red:" ,  0,                5,  20,  35,  20, TEXT_CF_LEFT },
  61.   { TEXT_CreateIndirect,     "Green:", 0,                5,  50,  35,  20, TEXT_CF_LEFT },
  62.   { TEXT_CreateIndirect,     "Blue:",  0,                5,  80,  35,  20, TEXT_CF_LEFT },
  63.   { TEXT_CreateIndirect,     "Preview",0,              205,   4,  81,  15, TEXT_CF_HCENTER },
  64.   { SLIDER_CreateIndirect,   NULL,     GUI_ID_SLIDER0,  40,  20, 100,  20 },
  65.   { SLIDER_CreateIndirect,   NULL,     GUI_ID_SLIDER1,  40,  50, 100,  20 },
  66.   { SLIDER_CreateIndirect,   NULL,     GUI_ID_SLIDER2,  40,  80, 100,  20 },
  67.   { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT0,   145,  20,  30,  20, 0, 3 },
  68.   { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT1,   145,  50,  30,  20, 0, 3 },
  69.   { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT2,   145,  80,  30,  20, 0, 3 },
  70.   { BUTTON_CreateIndirect,   "OK",     GUI_ID_OK,       10, 110,  60,  20 },
  71.   { BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,  230, 110,  60,  20 },
  72. };

  73. /*********************************************************************
  74. *
  75. *       Static data, colors
  76. *
  77. **********************************************************************
  78. */
  79. static U8 _aColorSep[3] = {0, 127, 255};  // Red, green and blue components

  80. /*********************************************************************
  81. *
  82. *       Static code
  83. *
  84. **********************************************************************
  85. */
  86. /*********************************************************************
  87. *
  88. *       _OnPaint
  89. *
  90. * Function description
  91. *   This routine draws the color rectangles.
  92. *   The widgets are drawn automatically.
  93. */
  94. static void _OnPaint(void) {
  95.   //
  96.   // Draw RGB values
  97.   //
  98.   GUI_SetColor(_aColorSep[0]);
  99.   GUI_FillRect(180, 20, 199, 39);
  100.   GUI_SetColor(_aColorSep[1] << 8);
  101.   GUI_FillRect(180, 50, 199, 69);
  102.   GUI_SetColor(((U32)_aColorSep[2]) << 16);
  103.   GUI_FillRect(180, 80, 199, 99);
  104.   //
  105.   // Draw resulting color
  106.   //
  107.   GUI_SetColor(_aColorSep[0] | (((U32)_aColorSep[1]) << 8) | (((U32)_aColorSep[2]) << 16));
  108.   GUI_FillRect(205, 20, 285, 99);
  109. }

  110. /*********************************************************************
  111. *
  112. *       _OnValueChanged
  113. */
  114. static void _OnValueChanged(WM_HWIN hDlg, int Id) {
  115.   unsigned Index;
  116.   unsigned v;
  117.   WM_HWIN  hSlider;
  118.   WM_HWIN  hEdit;

  119.   Index = 0;
  120.   v     = 0;
  121.   if ((Id >= GUI_ID_SLIDER0) && (Id <= GUI_ID_SLIDER2)) {
  122.     Index = Id - GUI_ID_SLIDER0;
  123.     //
  124.     // SLIDER-widget has changed, update EDIT-widget
  125.     //
  126.     hSlider = WM_GetDialogItem(hDlg, GUI_ID_SLIDER0 + Index);
  127.     hEdit   = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + Index);
  128.     v = SLIDER_GetValue(hSlider);
  129.     EDIT_SetValue(hEdit, v);
  130.   } else if ((Id >= GUI_ID_EDIT0) && (Id <= GUI_ID_EDIT2)) {
  131.     Index = Id - GUI_ID_EDIT0;
  132.     //
  133.     // If EDIT-widget has changed, update SLIDER-widget
  134.     //
  135.     hSlider = WM_GetDialogItem(hDlg, GUI_ID_SLIDER0 + Index);
  136.     hEdit   = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + Index);
  137.     v = EDIT_GetValue(hEdit);
  138.     SLIDER_SetValue(hSlider, v);
  139.   }
  140.   _aColorSep[Index] = v;
  141.   //
  142.   // At last invalidate dialog client window
  143.   //
  144.   WM_InvalidateWindow(WM_GetClientWindow(hDlg));
  145. }

  146. /*********************************************************************
  147. *
  148. *       _cbBkWindow
  149. */
  150. static void _cbBkWindow(WM_MESSAGE * pMsg) {
  151.   int xPos;
  152.   int yPos;

  153.   xPos = LCD_GetXSize() / 2 - bmSeggerLogoBlue.XSize/2;
  154.   yPos = LCD_GetYSize() / 2 - bmSeggerLogoBlue.YSize/2 ;
  155.   switch (pMsg->MsgId) {
  156.   case WM_PAINT:
  157.     GUI_SetBkColor(GUI_BLUE);
  158.     GUI_Clear();
  159.     GUI_SetColor(GUI_WHITE);
  160.     GUI_SetFont(&GUI_Font24_ASCII);
  161.     GUI_DispStringHCenterAt("DIALOG_SliderColor - Sample", 160, 5);
  162.     GUI_DrawBitmap(&bmSeggerLogoBlue, xPos, yPos );
  163.   default:
  164.     WM_DefaultProc(pMsg);
  165.   }
  166. }

  167. /*********************************************************************
  168. *
  169. *       _cbCallback
  170. */
  171. static void _cbCallback(WM_MESSAGE * pMsg) {
  172.   WM_HWIN hDlg;
  173.   WM_HWIN hItem;
  174.   int     i;
  175.   int     NCode;
  176.   int     Id;

  177.   hDlg = pMsg->hWin;
  178.   switch (pMsg->MsgId) {
  179.     case WM_PAINT:
  180.       _OnPaint();
  181.       return;
  182.     case WM_INIT_DIALOG:
  183.       for (i = 0; i < 3; i++) {
  184.         hItem = WM_GetDialogItem(hDlg, GUI_ID_SLIDER0 + i);
  185.         SLIDER_SetRange(hItem, 0, 255);
  186.         SLIDER_SetValue(hItem, _aColorSep[i]);
  187.         //
  188.         // Init EDIT-widgets
  189.         //
  190.         hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0 + i);
  191.         EDIT_SetDecMode(hItem, _aColorSep[i],   0, 255, 0, 0);
  192.       }
  193.       break;
  194.     case WM_KEY:
  195.       switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
  196.         case GUI_KEY_ESCAPE:
  197.           ;
  198.           break;
  199.         case GUI_KEY_ENTER:
  200.           GUI_EndDialog(hDlg, 0);
  201.           break;
  202.       }
  203.       break;
  204.     case WM_NOTIFY_PARENT:
  205.       Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
  206.       NCode = pMsg->Data.v;                 // Notification code
  207.       switch (NCode) {
  208.         case WM_NOTIFICATION_RELEASED:      // React only if released
  209.           if (Id == GUI_ID_OK) {            // OK Button
  210.             GUI_EndDialog(hDlg, 0);
  211.           }
  212.           if (Id == GUI_ID_CANCEL) {        // Cancel Button
  213.             GUI_EndDialog(hDlg, 1);
  214.           }
  215.           break;
  216.         case WM_NOTIFICATION_VALUE_CHANGED: // Value has changed
  217.           _OnValueChanged(hDlg, Id);
  218.           break;
  219.       }
  220.       break;
  221.     default:
  222.       WM_DefaultProc(pMsg);
  223.   }
  224. }

  225. /*********************************************************************
  226. *
  227. *       Public code
  228. *
  229. **********************************************************************
  230. */
  231. /*********************************************************************
  232. *
  233. *       MainTask
  234. */
  235. void MainTask(void) {
  236.   WM_SetCreateFlags(WM_CF_MEMDEV);  // Use memory devices on all windows to avoid flicker
  237.   GUI_Init();
  238.   //
  239.   // Check if recommended memory for the sample is available
  240.   //
  241.   if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  242.     GUI_ErrorOut("Not enough memory available.");
  243.     return;
  244.   }
  245.   GUI_CURSOR_Show();
  246.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);  
  247.   while (1) {
  248.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  249.     GUI_Delay(1000);
  250.   }
  251. }
复制代码


回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-11-15 13:43:20 | 显示全部楼层
eric2013 发表于 2021-11-15 12:56
方便的话,贴下稍微完整的测试代码。

#define ID_SLIDER_color  (GUI_ID_USER+0x02)
#define ID_IMAGE  (GUI_ID_USER+0x3)
static uint8_t slide_ispressed;
static uint8_t value;
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[]={
...
{SLIDE_CreateIndirect "Slider",ID_SLIDER_color,.....},
{IMAGE_CreateIndirect "Slider",ID_IMAGE  ,.....},
...
}
static void _CcbClient(WM_MESSAGE *pMsg){
...
switch(pMsg->MsgId){
...
case WM_TIMER:
if(slide_ispressed){
value//滑动条的值
SLIDER_SetValue(WM_GetDialogItem(chwin,ID_SLIDER_color ),value);
WM_InvalidateWindow(WM_GetDialogItem(chwin,ID_IMAGE ));

}

}

拖动滑动条,对应的颜色图片进行刷新,因为图片刷新会慢,所以导致拖动滑块时有卡顿,就是手指滑过去了,滑动条那个点才过来。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-11-15 13:45:27 | 显示全部楼层
glory 发表于 2021-11-15 13:01
这个需求完全参考示例就能满足你的DIALOG_SliderColor.c

感谢回复,我看一下
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-16 09:18:46 | 显示全部楼层
barrylee 发表于 2021-11-15 13:43
#define ID_SLIDER_color  (GUI_ID_USER+0x02)
#define ID_IMAGE  (GUI_ID_USER+0x3)
static uint8_t s ...

代码太简单,没法测试。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-21 16:18 , Processed in 0.387717 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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