硬汉嵌入式论坛

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

[emWin] 使用emWin自带定时器更新TEXT文本控件也会触发WM_PAINT消息的问题说明

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-5-17 14:20:54 | 显示全部楼层 |阅读模式
今天一个客户反馈了此问题,就专门测试了下,实际测试的确会触发的,但是触发后,emWin内部会做剪切处理。
仅更新TEXT文本控件的背景,别的区域是不会更新的。
测试效果,每次进入WM_PIANT消息都更新窗口背景,实际测试中,仅更新了TEXT文本的背景:
0.png



下面是V6板子上面的测试代码:
  1. /*
  2. *********************************************************************************************************
  3. *                                      
  4. *    模块名称 : GUI界面主函数
  5. *    文件名称 : MainTask.c
  6. *    版    本 : V1.0
  7. *    说    明 : 本实验主要学习窗口管理之定时器的使用方法,给对话框创建了一个定时器,
  8. *              每100ms更新一次文件控件的计数值。
  9. *              
  10. *    修改记录 :
  11. *        版本号   日期         作者          说明
  12. *        V1.0    2016-07-16   Eric2013          首版   
  13. *                                    
  14. *    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
  15. *
  16. *********************************************************************************************************
  17. */
  18. #include "MainTask.h"
  19. #include "includes.h"
  20.   
  21. /*
  22. *********************************************************************************************************
  23. *                                        变量
  24. *********************************************************************************************************
  25. */
  26. static int Count = 0;
  27. /*
  28. *********************************************************************************************************
  29. *                           GUI_WIDGET_CREATE_INFO类型数组
  30. *********************************************************************************************************
  31. */
  32. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  33.     { FRAMEWIN_CreateIndirect,  "armfly",   0,               0,  0,  480,272,0,0},
  34.     { TEXT_CreateIndirect,      "0000",     GUI_ID_TEXT0,    30,30,300,48, 0,0}
  35. };
  36. /*
  37. *********************************************************************************************************
  38. *    函 数 名: _cbCallback
  39. *    功能说明: 对话框回调函数        
  40. *    形    参: pMsg  回调参数
  41. *    返 回 值: 无
  42. *********************************************************************************************************
  43. */
  44. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
  45. static char ucBackColor = 0;
  46. static void _cbCallback(WM_MESSAGE * pMsg)
  47. {
  48.     int NCode, Id;
  49.     char buf[10];
  50.     WM_HWIN hWin = pMsg->hWin;
  51.     switch (pMsg->MsgId)
  52.     {
  53.         case WM_INIT_DIALOG:
  54.             //
  55.             //初始化框架窗口
  56.             //
  57.             FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
  58.             FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  59.             FRAMEWIN_SetTitleHeight(hWin,30);
  60.             //
  61.             //初始化文本控件
  62.             //
  63.             TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0), &GUI_FontD36x48);
  64.             break;
  65.         /* 定时器消息 */
  66.         case WM_TIMER:
  67.             Count++;
  68.             sprintf(buf, "%04d", Count);
  69.             TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0), (const char *)buf);
  70.             WM_RestartTimer(pMsg->Data.v, 100);
  71.             break;
  72.         
  73.         case WM_PAINT:
  74.             ucBackColor++;
  75.             if (ucBackColor == 3)
  76.             {
  77.                 ucBackColor = 0;
  78.             }
  79.             GUI_SetBkColor(_acColor[ucBackColor]);
  80.             GUI_Clear();
  81.             break;
  82.             
  83.         case WM_KEY:
  84.             switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  85.             {
  86.                 case GUI_KEY_ESCAPE:
  87.                     GUI_EndDialog(hWin, 1);
  88.                     break;
  89.                 case GUI_KEY_ENTER:
  90.                     GUI_EndDialog(hWin, 0);
  91.                     break;
  92.             }
  93.             break;
  94.             
  95.         case WM_NOTIFY_PARENT:
  96.             Id = WM_GetId(pMsg->hWinSrc);
  97.             NCode = pMsg->Data.v;        
  98.             switch (Id)
  99.             {
  100.                 case GUI_ID_OK:
  101.                     if(NCode==WM_NOTIFICATION_RELEASED)
  102.                         GUI_EndDialog(hWin, 0);
  103.                     break;
  104.                 case GUI_ID_CANCEL:
  105.                     if(NCode==WM_NOTIFICATION_RELEASED)
  106.                         GUI_EndDialog(hWin, 0);
  107.                     break;
  108.             }
  109.             break;
  110.             
  111.         default:
  112.             WM_DefaultProc(pMsg);
  113.     }
  114. }
  115. /*
  116. *********************************************************************************************************
  117. *    函 数 名: MainTask
  118. *    功能说明: GUI主函数
  119. *    形    参: 无
  120. *    返 回 值: 无
  121. *********************************************************************************************************
  122. */
  123. void MainTask(void)
  124. {
  125.     WM_HWIN hDlg;
  126.     WM_HTIMER hTimer;
  127.    
  128.     /* 初始化 */
  129.     GUI_Init();
  130.    
  131.     /*
  132.      关于多缓冲和窗口内存设备的设置说明
  133.        1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
  134.           WM_MULTIBUF_Enable(1);
  135.        2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
  136.        3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
  137.           STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
  138.           感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
  139.        4. 所有emWin例子默认是开启三缓冲。
  140.     */
  141.     WM_MULTIBUF_Enable(1);
  142.    
  143.     /*
  144.        触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
  145.        此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
  146.     */
  147.     //TOUCH_Calibration();
  148.    
  149.     /* 设置桌面窗口背景色,此函数支持自动重绘 */
  150.     WM_SetDesktopColor(GUI_BLUE);
  151.    
  152.     /* 创建一个对话框 */
  153.     hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  154.     /* 给对话框hDlg创建定时器,溢出时间是100ms */
  155.     hTimer = WM_CreateTimer(WM_GetClientWindow(hDlg), 0, 100, 0);
  156.    
  157.     /* 未用到,防止警告 */
  158.     (void)hTimer;
  159.     while(1)
  160.     {
  161.         GUI_Delay(10);
  162.     }
  163. }
  164. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
回复

使用道具 举报

11

主题

105

回帖

138

积分

初级会员

积分
138
发表于 2017-5-18 08:35:43 | 显示全部楼层
[s:151] [s:151] [s:151]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-19 16:20 , Processed in 0.050724 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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