硬汉嵌入式论坛

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

[emWin] emWIN5.32自定义控件不传递回调函数时的绘制异常

[复制链接]

4

主题

18

回帖

30

积分

新手上路

积分
30
发表于 2022-8-19 16:51:32 | 显示全部楼层 |阅读模式
本帖最后由 那年的岳麓山 于 2022-8-20 00:02 编辑

用的emWin版本是V5.32,自定义了一个控件UserSetButton,但在其创建控件函数中没有传递回调函数,也就是说用户这里没有自行画UserSetButton控件。然后在对话框窗口中创建3个自定义控件,并且在对话框的WM_INIT_DIALOG和WM_PAINT消息中没有做任何与自定义控件有关的事,但是实际显示结果发现,在原本放置3个自定义控件的地方出现了黑色矩形,这是怎么回事?
跟踪ucGUI3.98版本的源码,发现在创建完控件时会发送WM_CREATE消息到当前创建的控件。对于这里的自定义控件来说,因为没有回调函数,只能调用窗口的默认消息处理函数WM_DefaultProc来处理该消息,但实际上在WM_DefaultProc里面也同样没有处理该消息,直接返回。从这里可以看出,ucGUI3.98也没有画与自定义控件有关的任何东西。现在这里最终结果又黑色矩形,说明emWin5.32对WM_CREATE消息的应该有更进一步的处理,可惜没源码,不知道这个黑色矩形框到底是怎么画出来的。

总结问题:
1、黑色矩形是怎么来的?
2、如何避免这个黑色矩形?

我之所以会提这个问题,主要是原来自己有定义回调函数的,自定义控件的外观是倒角矩形,回调函数的WM_PAINT里给自定义控件填充指定颜色。自定义控件的绘制也仅在WM_PAINT消息里面处理。结果发现画出来的控件四个角有其他颜色存在,整个轮廓就是一个矩形。然后试着找原因,在不传递回调函数的时候原本放自定义控件的地方仍然会被填充,只是这里被系统填充成了黑色。




自定义控件没有回掉函数.PNG
对话框列表资源.PNG
对话框没有做与自定义控件有关的事.PNG
原本要放自定义控件的地方却填充了自定义控件的边框.PNG
用回调函数填充自定义控件但四个角有其他颜色.PNG
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-8-19 19:11:36 | 显示全部楼层
自定义控件操作起来不方便,不如用按钮自定义回调,可以做各种控件效果,使用也方便。
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-8-20 00:03:48 | 显示全部楼层
eric2013 发表于 2022-8-19 19:11
自定义控件操作起来不方便,不如用按钮自定义回调,可以做各种控件效果,使用也方便。

这个是好办法,之前确实没想到这样做。不过我这里提的问题,如果有谁能回答就最好了
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-8-20 00:09:18 | 显示全部楼层
eric2013 发表于 2022-8-19 19:11
自定义控件操作起来不方便,不如用按钮自定义回调,可以做各种控件效果,使用也方便。

这个是好办法,之前是没想到,学到了。不过本着刨根问底的原则,要是这里的问题有人能解答就更好了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-8-20 11:28:20 | 显示全部楼层
那年的岳麓山 发表于 2022-8-20 00:09
这个是好办法,之前是没想到,学到了。不过本着刨根问底的原则,要是这里的问题有人能解答就更好了

有5.06的源码,你可以分析下。

emWin5.06无码模板例子
https://www.armbbs.cn/forum.php?mod=viewthread&tid=98971
回复

使用道具 举报

5

主题

244

回帖

259

积分

高级会员

积分
259
发表于 2022-8-20 11:37:50 | 显示全部楼层
有可能黑色框是窗口裁切机制造成的,看到的白色窗口是被自定义控件裁切以后剩下的部分,然后自定义控件的外观没有正确绘制,所以就显示背景或者desktop的颜色
圆角区域颜色不对有可能是自定义控件的背景色问题,没猜错的话,那些颜色跟上面的灰色窗口是一个颜色,可以拿取色器验证下
其实像这种圆角控件如果他的父窗口是纯色,那可以直接把控件背景色调成和父窗口一个色,这样可以不用透明像素
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-8-21 15:25:24 | 显示全部楼层
DX3906 发表于 2022-8-20 11:37
有可能黑色框是窗口裁切机制造成的,看到的白色窗口是被自定义控件裁切以后剩下的部分,然后自定义控件的外 ...

你的观点我不认同,在讲述我的理由之前,先声明这里只讨论对话框下子窗口的创建所传递的style参数为0。另外这里倒角矩形4个角落的颜色(0xCCCCCC)跟对话框上边界那里颜色是不一样的,改对话框中,除了倒角矩形四个角落外,其他对方的颜色都是我自己画上去的,是我自己配的颜色,已经通过取色验证过了。

1、新创建对话框时会创建框体窗口和客户区窗口,然后创建所有子窗口。注意这里每创建一个窗口都会产生WM_CREATE消息并发给新创建的窗口,只是这里没有对该消息做处理(可能有的系统控件会处理该消息,我也没全部控件都了解完,但对于我这里的控件而言,并没有处理该消息)。在创建完所有窗口后,对话框获取客户区窗口,发送WM_INIT_DIALOG给客户区,客户区会将该消息传递给框体回调函数,也就是用户定义的对话框回调函数。

2、在用户定义的对话框的回调函数里边,通常我们会在WM_INIT_DIALOG消息下对子控件进行相关的属性设置,对于系统提供的基础控件,做属性修改时窗口管理器会自动将对应控件无效化,等到周期性调用WM_Exec1()时会逐一给被标记无效化的窗口发送WM_PAINT消息,然后各控件窗口的回调函数会在WM_PAINT消息下画控件。

3、对于用户自定义的控件,当然不例外也会在对话框的WM_INIT_DIALOG消息下被初始化各种属性,然后由用户自己调用WM_InvalidateWindow(hWin)将自定义控件标记无效化,之后自定义控件也会收到WM_PAINT消息,然后由用户自定义的控件回调函数处理该消息,在此消息下由用户自行画控件的外观。

4、对话框作为父窗口同样被标记无效的,只是其Z序比子窗口要低,低Z序窗口要先画,高Z序后画。当然父窗口不会去画子窗口的。

问题来了:

1、这里我没有在对话框的WM_INIT_DIALO消息对自定义控件进行初始化和标记控件无效化,又没有在其他地方标记自定义控件无效,也就是说后边是没有WM_PAINT消息发送给自定义控件的,没有WM_PAINT消息哪来的画控件外观?就算有WM_PAINT消息,如果没有回调函数,最终也是只能由WM_DefaultProc()来处理,但是该函数内部既不处理也不上传WM_PAINT消息的。

2、就算有提供自定义控件回调函数,控件外观怎么画取决于用户代码。自定义控件回调函数开头一般都需要调用WIDGET_HandleActive(),末尾调用WM_DefaultProc(),这2个地方内部对WM_PAINT消息是不做任何处理的,也不上传给父窗口,也就是说自定义控件只有用户自己画出来,系统不会帮你画的。我的控件是个倒角矩形型外观,我只是调用了一个填充倒角矩形函数,四个角落应该没有其他颜色才是,四个角落到底是怎么被画出来的?

3、实际上如果把这个填充倒角矩形函数单独拿出来画,四个角落又没颜色了,奇怪得很。

实际上这里倒角矩形四个角落有其他颜色存在,肯定是被系画出来没错,但原因应该不是你说的这个原因。
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-8-21 15:27:25 | 显示全部楼层
eric2013 发表于 2022-8-20 11:28
有5.06的源码,你可以分析下。

emWin5.06无码模板例子

源码我看了跟我这里有关的部分,也没什么特殊处理,没能找到原因,不过还要谢谢的!
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-8-21 18:08:21 | 显示全部楼层
DX3906 发表于 2022-8-20 11:37
有可能黑色框是窗口裁切机制造成的,看到的白色窗口是被自定义控件裁切以后剩下的部分,然后自定义控件的外 ...

虽然我不全部认同你观点,不过觉得你有个地方说得有道理有用的。既然背景是纯白色,那在画倒角矩形前先将控件外观的矩形区域先刷一遍白色,然后再填充倒角矩形,这样就看不到四个角的其他颜色了,这个地方多亏你提醒了,然后现在是可以避免这个问题了,不过还是不知道为什么会产生这个问题
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-24 07:41 , Processed in 0.448670 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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