硬汉嵌入式论坛

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

[emWin] 请问为什么我已经开启了所有窗口都使用存储设备,在窗口的回调函数中还是可以看到逐步绘图的效果

[复制链接]

6

主题

25

回帖

43

积分

新手上路

积分
43
发表于 2019-7-15 18:36:30 | 显示全部楼层 |阅读模式
初始化的时候已经开启了自动使用存储设备:

                WM_SetCreateFlags(WM_CF_MEMDEV);//开启STemWin存储设备
                GUI_Init();

                 WM_MULTIBUF_Enable(1);                        //开启STemWin多缓冲,RGB屏可能会用到


hWnd1是背景窗口句柄。

                WM_SelectWindow(hWnd1);
                WM_SendMessageNoPara(hWnd1, WM_UPDATE);                   //对背景窗口进行自动更新

背景窗口的回调函数:


static void _cbWindow1(WM_MESSAGE *pMsg)
{

        switch(pMsg->MsgId)
        {
                case WM_PAINT:
                        GUI_SetBkColor(0x160104);
                        GUI_SetColor(GUI_WHITE);
                        GUI_Clear();
                        GUI_SetTextMode(GUI_TM_TRANS);        //透明显示
                        GUI_DrawBitmap(&bmbk,0,0);  //绘制背景图标       
                        break;
                case WM_UPDATE:     
                        WM_SelectWindow(hWnd1);
                                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);        //PB1置0
                                GUI_SetPenSize(44);
                                GUI_SetColor(0x212121);
                                GUI_AA_DrawArc(401, 250, 205, 205, -49, 229);                       //画底色圆弧
                                GUI_SetColor(0xA48E72);                                                                                 //(1)    断点处
                                GUI_AA_DrawArc(401, 250, 205, 205, Rev, 229);                     //画前景圆弧
                                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);        //PB1置0
                        break;       
                default:
                        WM_DefaultProc(pMsg);
        }
}



但是效果确实逐行绘图。在仿真时,在(1)处打了断点 ,还能看到先画底色,再画前景的绘图过程,说明没有启动存储设备,不明白是什么问题,有大神指点一下吗???

回调函数2D绘图.mp4

1.88 MB, 下载次数: 10

回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-16 09:19:22 | 显示全部楼层
本帖最后由 mikekod 于 2019-7-16 09:20 编辑

这个是模拟器代码。

在WM_PAINT消息里面刷,不会有刷图轨迹。
在WM_UPDATE消息里面刷,会有刷图轨迹。


是不是只有WM_PAINT消息里面才能使用存储设备?其他消息就不能使用存储设备了?


//WM_SendMessageNoPara(hWnd1, WM_PAINT);                                                          //取消注释这段就没有刷图轨迹, 不取消就会刷图轨迹
WM_SelectWindow(hWnd1);
WM_SendMessageNoPara(WM_GetClientWindow(hWnd1), WM_UPDATE);





//父窗口回调函数
static void _cbWindow1(WM_MESSAGE *pMsg)
{
        switch (pMsg->MsgId)
        {
        case WM_PAINT:
                GUI_SetBkColor(0x160104);
                GUI_SetColor(GUI_WHITE);
                GUI_Clear();
                GUI_SetTextMode(GUI_TM_TRANS);        //透明显示
                GUI_DrawBitmap(&bmbk, 0, 0);  //绘制背景图标        
                /*                                                                                                       //取消注释这段就没有刷图轨迹, 不取消就会刷图轨迹
                GUI_SetPenSize(44);
                GUI_SetColor(0x212121);
                GUI_AA_DrawArc(401 * 4, 250 * 4, 205 * 4, 205 * 4, -49, 229);
                GUI_SetColor(0xA48E72);
                GUI_AA_DrawArc(401 * 4, 250 * 4, 205 * 4, 205 * 4, Rev, 229);
                */
               
                break;
        case WM_UPDATE:     

                //WM_InvalidateWindow(hWnd1);
                GUI_SetPenSize(44);
                GUI_SetColor(0x212121);
                GUI_AA_DrawArc(401 * 4, 250 * 4, 205 * 4, 205 * 4, -49, 229);
                GUI_SetColor(0xA48E72);
                GUI_AA_DrawArc(401 * 4, 250 * 4, 205 * 4, 205 * 4, Rev, 229);
                break;
               
        default:
                WM_DefaultProc(pMsg);
        }
}

WM_Demo.c

2.99 MB, 下载次数: 2

回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-7-16 09:22:35 | 显示全部楼层
mikekod 发表于 2019-7-16 09:19
这个是模拟器代码。

在WM_PAINT消息里面刷,不会有刷图轨迹。

WM_UPDATE里面不可以直接做2D绘制
代码不规范,亲人两行泪!
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-7-16 09:23:11 | 显示全部楼层
这里也错了
WM_SetCreateFlags(WM_CF_MEMDEV);//开启STemWin存储设备
WM_MULTIBUF_Enable(1);                        //开启STemWin多缓冲,RGB屏可能会用到

这两个二选一
代码不规范,亲人两行泪!
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-16 09:43:04 | 显示全部楼层
missfox 发表于 2019-7-16 09:22
WM_UPDATE里面不可以直接做2D绘制

可是我要画环形进度条,我不知道除了2D绘图,还有什么办法实现这个功能,可以教我一下吗?这些东西资料上都没有讲到。
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-16 09:43:33 | 显示全部楼层
missfox 发表于 2019-7-16 09:23
这里也错了
WM_SetCreateFlags(WM_CF_MEMDEV);//开启STemWin存储设备
WM_MULTIBUF_Enable(1);            ...

这两个你们一般选哪个呢?而且为什么不能一起使用?可以详细说说吗
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-16 10:24:08 | 显示全部楼层
missfox 发表于 2019-7-16 09:23
这里也错了
WM_SetCreateFlags(WM_CF_MEMDEV);//开启STemWin存储设备
WM_MULTIBUF_Enable(1);            ...

WM_SelectWindow(hWnd1);
WM_SendMessageNoPara(WM_GetClientWindow(hWnd1), WM_UPDATE);

我在发送WM_UPDATE消息之前,已经选中了父窗口
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-16 11:04:00 | 显示全部楼层
missfox 发表于 2019-7-16 09:23
这里也错了
WM_SetCreateFlags(WM_CF_MEMDEV);//开启STemWin存储设备
WM_MULTIBUF_Enable(1);            ...

老大,我根据手册里优先选择了多缓冲,现在刷图就一行一行刷了。那就只能用存储设备了,不能用多缓冲。
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-7-16 11:06:12 | 显示全部楼层
mikekod 发表于 2019-7-16 11:04
老大,我根据手册里优先选择了多缓冲,现在刷图就一行一行刷了。那就只能用存储设备了,不能用多缓冲。

你的工程问题的确有点多,有点亡羊补牢的感觉。
代码不规范,亲人两行泪!
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-16 11:35:17 | 显示全部楼层
missfox 发表于 2019-7-16 11:06
你的工程问题的确有点多,有点亡羊补牢的感觉。

我今天买了V6的板子,准备用安富莱的平台重新弄过。等V7的资料全了,我再买一块V7的板子
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 02:30 , Processed in 0.282900 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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