硬汉嵌入式论坛

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

[emWin] 隐藏、显示窗口问题

  [复制链接]

32

主题

187

回帖

283

积分

高级会员

积分
283
发表于 2018-5-12 18:11:20 | 显示全部楼层 |阅读模式
6666666.png
我这样隐藏显示窗口,没有效果。
另外,我是用了双图层的,官方手册说 WM_SelectWindow 函数会切换到给定窗口的顶层父窗口的层上。我这些都是在底层绘制的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-5-12 18:20:06 | 显示全部楼层
在while前面加上个Select(0)是不是好些。
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2018-5-14 08:59:57 | 显示全部楼层
eric2013 发表于 2018-5-12 18:20
在while前面加上个Select(0)是不是好些。

选择底层吗?我在前面已经选择了底层进行绘制的
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2018-5-14 09:12:07 | 显示全部楼层
loliko 发表于 2018-5-14 08:59
选择底层吗?我在前面已经选择了底层进行绘制的

你在每个窗口创建后,就执行WM_Exec() 先,试试。
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2018-5-14 14:13:18 | 显示全部楼层
caicaptain2 发表于 2018-5-14 09:12
你在每个窗口创建后,就执行WM_Exec() 先,试试。

还是不可以
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-5-15 05:27:02 | 显示全部楼层
loliko 发表于 2018-5-14 08:59
选择底层吗?我在前面已经选择了底层进行绘制的

改成0是选择的桌面窗口
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2018-5-15 17:14:24 | 显示全部楼层
eric2013 发表于 2018-5-15 05:27
改成0是选择的桌面窗口

也不行老师
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-5-16 06:59:13 来自手机 | 显示全部楼层
loliko 发表于 2018-5-15 17:14
也不行老师

直接贴出个稍个稍完整的代码,我给你在我们板子上测试下。
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2018-5-16 09:12:44 | 显示全部楼层
eric2013 发表于 2018-5-16 06:59
直接贴出个稍个稍完整的代码,我给你在我们板子上测试下。

        static WM_HWIN window[3];

        GUI_Init();

        //创建第一个窗口,并清背景色
        window[0] = WM_CreateWindow(0,0,800,480,  WM_CF_SHOW,NULL,0);
        WM_SelectWindow(window[0]);
        GUI_SetBkColor(GUI_GREEN);
        GUI_Clear();
        WM_Exec();
        //创建第二个窗口,并清背景色
        window[1] = WM_CreateWindow(0,0,800,480,  WM_CF_SHOW,NULL,0);
        WM_SelectWindow(window[1]);
        GUI_SetBkColor(GUI_YELLOW);
        GUI_Clear();
        WM_Exec();       
     //创建第三个窗口,并清背景色
        window[2] = WM_CreateWindow(0,0,800,480,  WM_CF_SHOW,NULL,0);
        WM_SelectWindow(window[2]);
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();
        WM_Exec();
        //选择桌面窗口
        WM_SelectWindow(0);
        while(1)
        {
                        WM_HideWindow(window[0]);
                        WM_HideWindow(window[1]);
                        WM_ShowWindow(window[2]);
                        WM_Exec();
                        GUI_Delay(500);
                       
                        WM_HideWindow(window[2]);
                        WM_HideWindow(window[0]);
                        WM_ShowWindow(window[1]);
                        WM_Exec();
                        GUI_Delay(500);
                       
                        WM_HideWindow(window[2]);
                        WM_HideWindow(window[1]);
                        WM_ShowWindow(window[0]);
                        WM_Exec();
                        GUI_Delay(500);
        }

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-5-17 00:35:47 | 显示全部楼层
loliko 发表于 2018-5-16 09:12
static WM_HWIN window[3];

        GUI_Init();

出现这个现象的原因比较简单,这个是因为你通过函数WM_SelectWindow人为重绘的背景。

这种情况下, 调用隐藏和显示函数是没有效果的,这个隐藏和显示会触发窗口回调函数WM_PAINT的执行。你的WM_PAINT消息是没有修改的。
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2018-5-17 18:35:19 | 显示全部楼层
eric2013 发表于 2018-5-17 00:35
出现这个现象的原因比较简单,这个是因为你通过函数WM_SelectWindow人为重绘的背景。

这种情况下, 调 ...

嗯嗯,我试了在WM_PAINT消息里面实现确实可以。但是我原本的想法是:创建3个窗口,每个窗口都绘制的不一样的东西,当我需要显示那一个窗口的时候,直接隐藏其他两个,显示一个窗口即可。但是现在要是在WM_PAINT里面实现的话,每次切换窗口都需要全部绘制,能不能把之前的绘制状态保存,然后切换的时候,就可以直接显示出来呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-5-18 01:48:17 | 显示全部楼层
loliko 发表于 2018-5-17 18:35
嗯嗯,我试了在WM_PAINT消息里面实现确实可以。但是我原本的想法是:创建3个窗口,每个窗口都绘制的不一 ...

没事,绘制单色背景超级快的,以F429+32位SDRAM为例,仅需要几毫秒就能填充800*480分辨率的区域。
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2018-5-18 09:36:58 | 显示全部楼层
eric2013 发表于 2018-5-18 01:48
没事,绘制单色背景超级快的,以F429+32位SDRAM为例,仅需要几毫秒就能填充800*480分辨率的区域。

实际上的每个窗口不只是纯色的啦,还有很多元素,圆,圆弧,贴图之类的。
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
 楼主| 发表于 2018-5-18 09:53:20 | 显示全部楼层
eric2013 发表于 2018-5-18 01:48
没事,绘制单色背景超级快的,以F429+32位SDRAM为例,仅需要几毫秒就能填充800*480分辨率的区域。

我在想,将每个页面都绘制在一个buffer里面,然后需要哪个页面的时候,将层的地址指到buffer首地址就行了,这样是不是很快,而且这样之前绘制的东西都还在,不需要切换之后重新绘制
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-5-19 01:30:42 | 显示全部楼层
loliko 发表于 2018-5-18 09:53
我在想,将每个页面都绘制在一个buffer里面,然后需要哪个页面的时候,将层的地址指到buffer首地址就行了 ...

使用我们的F429的emWin例子即可,有三缓冲的。
回复

使用道具 举报

5

主题

47

回帖

62

积分

初级会员

积分
62
发表于 2018-5-21 09:25:34 | 显示全部楼层
求个帮助。
我现在要做一个多层窗口的显示,我想步骤是:先做一个背景window,它是第一层,然后其他的窗口作为第二层,显示在第一层之上。第二层的窗口有多个,且所有的第二层全部是透明窗口,并在第二层窗口里显示数值,绘制按钮等控件。Framewin的Dialog因为有标题栏和边沿栏,所以我不打算用它。

因为刚用emwin不久,所以不知道如何架构,也不知道我的这个想法是不是能实现。在这里向各位诚挚求助。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 7 天前 | 显示全部楼层
eric2013 发表于 2018-5-19 01:30
使用我们的F429的emWin例子即可,有三缓冲的。

您好,请问这个例程在哪能找到
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 6 天前 | 显示全部楼层
燕归巢 发表于 2024-5-13 16:58
您好,请问这个例程在哪能找到

这个里面的案例都是三缓冲方式的。

https://www.armbbs.cn/forum.php? ... &extra=page%3D1
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 6 天前 | 显示全部楼层
eric2013 发表于 2024-5-14 09:33
这个里面的案例都是三缓冲方式的。

https://www.armbbs.cn/forum.php?mod=viewthread&tid=19834&extra ...

好的,谢谢
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 6 天前 | 显示全部楼层
eric2013 发表于 2024-5-14 09:33
这个里面的案例都是三缓冲方式的。

https://www.armbbs.cn/forum.php?mod=viewthread&tid=19834&extra ...

您好,请问三缓冲方式就是调用WM_MULTIBUF_Enable(1);这一句函数以及修改LCDConf_Lin_Template.c文件吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 20:22 , Processed in 0.437644 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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