硬汉嵌入式论坛

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

[emWin] 调用WM_InvalidateWindow(hWin)重绘窗口发现WM_PAINT会被多次触发?

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2018-12-8 16:35:46 | 显示全部楼层 |阅读模式
第一次使用emwin,今天在调代码过程中发现WM_PAINT在每次更新事件中会被多次触发。现象:在WM_PAINT加了一段串口打印函数,发现在WM_InvalidateWindow(hWin) 重绘窗口后打印了多次数据。这是否正常?


另外用定时器刷新TEST文本控件时,定时器没触发一次  WM_PAINT 也会触发多次?虽然现在不影响显示效果,但是心里感觉不踏实

static void _cbICONVIEW(WM_MESSAGE* pMsg)
{
        WM_HWIN hWin = pMsg->hWin;
        WM_HWIN ICONVIEW_hItem;
        static char Ctrlsel=1;
        switch (pMsg->MsgId)
        {
                case WM_CREATE:
                         WM_SetFocus(hWin);  /* 创建后设置聚焦 */
                         ICONVIEW_hItem = ICONVIEW_CreateEx(0, 00, 320, 200,
                                                                   hWin, WM_CF_SHOW | WM_CF_HASTRANS ,
                                                                   ICONVIEW_CF_AUTOSCROLLBAR_V, GUI_ID_ICONVIEW0, 85, 85);
                         ICONVIEW_SetIconAlign(ICONVIEW_hItem, ICONVIEW_IA_TOP);              //设置对齐
                         ICONVIEW_SetTextColor(ICONVIEW_hItem, ICONVIEW_CI_UNSEL, GUI_BLACK);  //设置标签文字 颜色(未选中时候)
                         ICONVIEW_SetTextColor(ICONVIEW_hItem, ICONVIEW_CI_SEL, GUI_WHITE);   //设置标签文字 颜色( 选中时候)

                         ICONVIEW_SetFrame(ICONVIEW_hItem, GUI_COORD_X, 20);             //设置图标到IconView边框的间距
                         ICONVIEW_SetFrame(ICONVIEW_hItem, GUI_COORD_Y, 15);
                         ICONVIEW_SetSpace(ICONVIEW_hItem, GUI_COORD_X, 5);   //设置图标和图标之间的间距
                         ICONVIEW_SetSpace(ICONVIEW_hItem, GUI_COORD_Y, 5);
                         ICONVIEW_SetFont(ICONVIEW_hItem, GUI_FONT_16_1);

                          ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "AdjData");//添加图标项
                          ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "Other");
                         ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "Record");
                          ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "Alarm");
                         ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "System");
                         ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "Rest");
                         ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "Bat");
                         ICONVIEW_AddBitmapItem(ICONVIEW_hItem, &bmAdjData, "Time");
                         
                        ICONVIEW_SetBkColor(ICONVIEW_hItem, ICONVIEW_CI_SEL, UI_HeadColor| 0xF0000000);       //设置选中小图标 颜色
                        ICONVIEW_SetBkColor(ICONVIEW_hItem, ICONVIEW_CI_BK, UI_BackColor);                 //设置小图标框区域背景颜色                 
                        ICONVIEW_SetSel(ICONVIEW_hItem ,0);               
                        WM_SetFocus(ICONVIEW_hItem);  /* 创建后设置聚焦 */                       
                        break;
                case WM_PAINT:
                        _PaintFrame();
                        GUI_SetBkColor(UI_BackColor); //设置背景色
                        GUI_Clear();
                    GUI_DrawGradientH(0, 200, 320, 220,UI_HeadColor , UI_HeadColor ); //设置底部横条               
                        ICONVIEW_SetSel(ICONVIEW_hItem ,Ctrlsel);
                         printf("Ctrlsel=%d\n",Ctrlsel);
                        break;
                        case MSG_UP:
                                Ctrlsel++;
                                //ICONVIEW_SetSel(ICONVIEW_hItem ,Ctrlsel);
                           // WM_SetFocus(ICONVIEW_hItem);  /* 创建后设置聚焦 */       
                            printf("Ctrlsel=%d\n",Ctrlsel);
                             WM_InvalidateWindow(hWin);           //重绘窗口
                        break;
                        case MSG_DOWN:
                                 Ctrlsel--;
                                 printf("Ctrlsel=%d\n",Ctrlsel);
                                 WM_InvalidateWindow(hWin);           //重绘窗口
                        break;               
                case MSG_Delect:
                                _DeleteFrame();
                                _CreateFrame(&_cbWindow1);
                        break;
                case MSG_Enter:


                        break;       
                default:
                WM_DefaultProc(pMsg);
        }
}


回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2018-12-8 16:39:13 | 显示全部楼层
调用WM_InvalidateWindow后而且WM_PAINT重入的次数还不一样,有时候串口打印4次   有时候串口打印10多次
Ctrlsel=3
Ctrlsel=3
Ctrlsel=3
Ctrlsel=3
Ctrlsel=3
Ctrlsel=3
Ctrlsel=3
Ctrlsel=3
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-12-8 16:40:46 | 显示全部楼层
这个都是正常现象。

1、进入多次是你的动态内存太小,采用的分段存储设备方式绘制。
2、以TEXT文本控件为例,执行WM_PAINT消息,更新的时候仅仅是更新TEXT文本所在的区域,其它的区域不管的,要是更新TEXT导致所有区域都更新,F1那种性能都会卡的嗷嗷的。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2018-12-8 17:40:03 | 显示全部楼层
eric2013 发表于 2018-12-8 16:40
这个都是正常现象。

1、进入多次是你的动态内存太小,采用的分段存储设备方式绘制。

感谢硬汉的答复,我测试加大 动态内存。打印次数的确变少了。但是图标的选中背景颜色不见了。很奇怪

#define GUI_NUMBYTES  (1024 * 20)
#define GUI_BLOCKSIZE 0x80

改为
#define GUI_NUMBYTES  (1024 * 100)
#define GUI_BLOCKSIZE 0x80
后选中 ICONVIEW  的背景颜色不见了。变成透明的了
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2018-12-8 18:04:31 | 显示全部楼层
找到问题了 ICONVIEW_SetBkColor(ICONVIEW_hItem, ICONVIEW_CI_SEL, UI_HeadColor| 0xF0000000);       //设置选中小图标 颜色
这里本来就是设置小图标带透明的  前面动态内存太小没透明效果   现在改大了这个效果才出来
第一次使用emwin,坑多多啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 17:02 , Processed in 0.250939 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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