硬汉嵌入式论坛

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

[emWin] 大神们,为什么TEXT控件TEXT_SetText会引起其父窗口WM_PAINT

[复制链接]

1

主题

4

回帖

1

积分

新手上路

积分
1
发表于 2015-11-5 14:03:59 | 显示全部楼层 |阅读模式
在窗口中创建TEXT控件,窗口回到函数WM_PAINT消息重绘整个窗口。但是TEXT_SetText,父窗口会收到WM_PAINT。

想做个简单的时钟,创建一个窗口,窗口回调函数如下,PaintWin对整个窗口进行重绘需要较长时间,导致1s定时不准确。我的疑问是:为什么只TEXT_SetText调用,设置文本控件GUI_ID_TEXT0的字符串,其父窗口会收到WM_PAINT消息。有没有办法只更新文本控件GUI_ID_TEXT0的字符串,不发送WM_PAINT消息,不进行整个窗口重绘?或者有没有更好的准确延时方法,请各位大神指点一下,谢谢。
static void CallBack(WM_MESSAGE* pMsg)
{
   uint8 aucTemp[32];
    switch (pMsg->MsgId)
    {
        case WM_CREATE:
            TEXT_CreateEx(0,  58*4+13, 200, 30,pMsg->hWin,WM_CF_SHOW,0,GUI_ID_TEXT0,"00:00:00");
            TEXT_SetFont(WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0),&GUI_FontHZ32);
            TEXT_SetTextColor(WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0),GUI_WHITE);
            TEXT_SetTextAlign(WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0),TEXT_CF_HCENTER|TEXT_CF_VCENTER );
            TEXT_SetBkColor(WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0),GUI_BLACK);
            break;
        case WM_PAINT:
            PaintWin(pMsg);            
            break;
       case WM_TIMER:
            WM_RestartTimer(pMsg->Data.v, 1000);  //定时器定时1秒
           MyGetTime(aucTemp) ;  //获取时间
            TEXT_SetText(WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0),(char*)aucTemp);   //更新字符串,显示时:分:秒。问题:设置Text控件字符串会后,会收WM_PAINT消息,执行PaintWin(pMsg)重绘整个窗口,效率低下,导致1s延时不准确。
            break;
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}  
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-11-5 14:26:49 | 显示全部楼层
GUI_Init后调用了函数
WM_SetCreateFlags(WM_CF_MEMDEV); 没有,如果没有的话,调用一下。
回复

使用道具 举报

1

主题

4

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-11-5 16:19:37 | 显示全部楼层
已经调用了,这个函数应该跟存储相关的吧。我的问题是为什么,调用TEXT_SetText设置TEXT控件内容,父窗口会收到 WM_PAINT。如果想只更新 TEXT控件内容,不重绘父窗口,应该怎么处理,谢谢
回复

使用道具 举报

1

主题

4

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-11-5 18:06:52 | 显示全部楼层

回 eric2013 的帖子

eric2013:GUI_Init后调用了函数
WM_SetCreateFlags(WM_CF_MEMDEV); 没有,如果没有的话,调用一下。
 (2015-11-05 14:26) 
已经调用了,这个函数应该跟存储相关的吧。我的问题是为什么,调用TEXT_SetText设置TEXT控件内容,父窗口会收到 WM_PAINT。如果想只更新 TEXT控件内容,不重绘父窗口,应该怎么处理,谢谢
回复

使用道具 举报

1

主题

4

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-11-6 08:53:23 | 显示全部楼层
还没找到办法,自己顶起
回复

使用道具 举报

6

主题

19

回帖

37

积分

新手上路

积分
37
发表于 2015-11-6 09:34:51 | 显示全部楼层
你在 TEXT_SetText后 只无效化 TEXT的矩形区域试试
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-11-6 15:52:28 | 显示全部楼层
按说不应该啊,控件类的可以局部刷新的,也就是仅刷新所在的区域,而不需要全局刷新,晚上我专门测试下看看。
回复

使用道具 举报

1

主题

4

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-11-6 15:54:32 | 显示全部楼层

回 sealedghost 的帖子

sealedghost:你在 TEXT_SetText后 只无效化 TEXT的矩形区域试试 (2015-11-06 09:34) 
加上了
TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_TIME),(char*)aucTemp);
WM_InvalidateRect(pMsg->hWin,&s_TimeArea);   
其中s_TimeArea就是TEXT工具ID_TEXT_TIME所在区域,pMsg->hWin窗口还是会收到WM_PAINT消息。纠结啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 01:38 , Processed in 0.278805 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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