社区
Symbian
帖子详情
求教关于控件重绘的问题。。。
duguguiyu1984
2009-05-21 02:42:55
我在重载的子控件中做了一些修改后调用DrawNow方法,没有反应。
子控件放在某个父控件中,创建是调用过SetContainerWindow函数。
谢谢
...全文
1892
35
打赏
收藏
求教关于控件重绘的问题。。。
我在重载的子控件中做了一些修改后调用DrawNow方法,没有反应。 子控件放在某个父控件中,创建是调用过SetContainerWindow函数。 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
35 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Jigsaw__
2011-12-29
打赏
举报
回复
[Quote=引用 15 楼 duguguiyu1984 的回复:]
主要问题不是父控件重绘不能绘制子控件,所以SizeChanged,CountComponentControls,ComponentControl 这样的问题应该都不存在。
问题是:子控件调用自己的DrawNow,不会进入Draw函数,也没有发现没有进入其他的Draw函数。
从父控件开始每一级,都调用过SetContainerWindowL,所以不知道是啥问题。。。
[/Quote]
之前与楼主遇到相似的问题,我的程序目的类似于上面提到的笑脸程序,我需要在点击屏幕后切换两张图片。我的按键可以响应,但是子控件的重绘并不能正确的显示在父控件窗口上(绘制不完全)。
解决方法:在父控件的SizeChanged()中调用子控件的SetExtent()。
cy520k_flr
2010-10-15
打赏
举报
回复
晕楼主解决没?我遇到和你完全一样的问题。
duguguiyu1984
2009-06-18
打赏
举报
回复
[Quote=引用 32 楼 arthersophy 的回复:]
引用 9 楼 arthersophy 的回复:
引用 5 楼 duguguiyu1984 的回复:
太对不起楼上了。我调试的时候搞错了。
我在控件中调用DrawNow,但没有进入该控件的Draw函数,不知为何。。。
呵呵,没事,估计是你的代码有问题,建议你仔细理一理逻辑。
如果代码正确,没道理不行的。
听听 7楼的建议
对不起我就算了,我个人的原则就是,这种情况的出现,最有可能就是就是你代码的错误。有时候是很弱的问题,估计谁都遇到过。。 …
[/Quote]
算了,有空我一点点整理吧。
lanruoshui
2009-06-10
打赏
举报
回复
贴子好热啊,友情UP
漁_夫
2009-06-10
打赏
举报
回复
[Quote=引用 9 楼 arthersophy 的回复:]
引用 5 楼 duguguiyu1984 的回复:
太对不起楼上了。我调试的时候搞错了。
我在控件中调用DrawNow,但没有进入该控件的Draw函数,不知为何。。。
呵呵,没事,估计是你的代码有问题,建议你仔细理一理逻辑。
如果代码正确,没道理不行的。
听听 7楼的建议
[/Quote]
对不起我就算了,我个人的原则就是,这种情况的出现,最有可能就是就是你代码的错误。有时候是很弱的问题,估计谁都遇到过。。
冒昧问一句,问题这么多天了,难道还没搞出来么?
搞出来,通晓大家一下。。。。
duguguiyu1984
2009-06-09
打赏
举报
回复
[Quote=引用 27 楼 btsy2000 的回复:]
A里面需要CreatWindowL, B,C里面需要SetContainerWindowL( A or B ).这里没有问题吧?
[/Quote]
没有,如果有问题,用密码控件会抛异常的,现在都不抛。。。
duguguiyu1984
2009-06-09
打赏
举报
回复
[Quote=引用 26 楼 dyw 的回复:]
一般只有根CCoeControl(就是你上面说的A)才需要调用CreateWindowL,拥有窗口。子控件使用自己的DrawNow就可实现自身重绘,也不应该出现问题。
我在三版的Emulator上测试20#提到的笑脸例子,鼠标点击(或摁键盘)可在笑脸/苦脸间切换。这个例子正好是A,B,C三个CCoeControl嵌套,未见绘制问题。
楼主不妨也测试一下,如有问题再探讨。
[/Quote]
理论上是这样的,只是我不知道我踩着啥雷了,太郁闷了,我再琢磨琢磨吧。。。
oyq_yangy
2009-06-05
打赏
举报
回复
>>>但如果调用C或者B的DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都不会进入,这和正常逻辑不符合。
这只能说明在你调用C和B的DrawNow之前,他们的parent改变了,即C得parent不是B,B的parent不是A,并且他们的
parent的CountComponentControls、ComponentControl实现不正确,并且C和B都不是WindowOwning的控件(不是WindowOwning的控件绘制时是需要父控件重绘的)。。。
实在想不出还有什么别的理由。。。
dyw
2009-06-05
打赏
举报
回复
[Quote=引用 18 楼 duguguiyu1984 的回复:]
...
如果,在A调用DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都会进入,一切正常。
但如果调用C或者B的DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都不会进入,这和正常逻辑不符合。
...
[/Quote]
上面A重绘时通知其子控件也重绘是正常的,如果这种情况绘制正确,那就基本没有什么问题。而子控件重绘不通知父控件重绘也是正常的,否则就不是父子关系了。
另外,在子控件状态变更后需要重绘时调用自己的DrawNow就应该会重新绘制自己。二版有个绘制笑脸的例子CustomControls很不错,三版下貌似没有,移植也很容易。
oyq_yangy
2009-06-05
打赏
举报
回复
把CountComponentControls、ComponentControl都去掉,换成Component array试试吧。
btsy2000
2009-06-05
打赏
举报
回复
A里面需要CreatWindowL, B,C里面需要SetContainerWindowL( A or B ).这里没有问题吧?
dyw
2009-06-05
打赏
举报
回复
一般只有根CCoeControl(就是你上面说的A)才需要调用CreateWindowL,拥有窗口。子控件使用自己的DrawNow就可实现自身重绘,也不应该出现问题。
我在三版的Emulator上测试20#提到的笑脸例子,鼠标点击(或摁键盘)可在笑脸/苦脸间切换。这个例子正好是A,B,C三个CCoeControl嵌套,未见绘制问题。
楼主不妨也测试一下,如有问题再探讨。
duguguiyu1984
2009-06-05
打赏
举报
回复
[Quote=引用 22 楼 breakind 的回复:]
以前遇到类似问题,也是找了很久,最后发现是void Draw(const TRect& aRect) const;,重载它的时候忘记声明为CONST,你看你的是不是这个原因导致的。
[/Quote]
如果是这个问题,父控件发送的DrawNow,子控件的表现应该不正常才是,我查过了,不是这个问题。。。
duguguiyu1984
2009-06-05
打赏
举报
回复
[Quote=引用 21 楼 oyq_yangy 的回复:]
>>>但如果调用C或者B的DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都不会进入,这和正常逻辑不符合。
这只能说明在你调用C和B的DrawNow之前,他们的parent改变了,即C得parent不是B,B的parent不是A,并且他们的
parent的CountComponentControls、ComponentControl实现不正确,并且C和B都不是WindowOwning的控件(不是WindowOwning的控件绘制时是需要父控件重绘的)。。。
实在想不出还有什么别的理…
[/Quote]
没有变化,真滴。。。所以我很费解。。。
duguguiyu1984
2009-06-05
打赏
举报
回复
[Quote=引用 20 楼 dyw 的回复:]
引用 18 楼 duguguiyu1984 的回复:
...
如果,在A调用DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都会进入,一切正常。
但如果调用C或者B的DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都不会进入,这和正常逻辑不符合。
...
上面A重绘时通知其子控件也重绘是正常的,如果这种情况绘制正确,那就基本没有什么问题。而子控件重绘不通知父控件重绘也是正常的,否则就不是…
[/Quote]
如果一个控件没有Own Window的,肯定是由父控件进行通知,DrawNow消息发送了请求 WinServ回复也是要从上自下来派发的。。。
「已注销」
2009-06-05
打赏
举报
回复
以前遇到类似问题,也是找了很久,最后发现是void Draw(const TRect& aRect) const;,重载它的时候忘记声明为CONST,你看你的是不是这个原因导致的。
duguguiyu1984
2009-06-04
打赏
举报
回复
楼上所有的意见我都参考了,但是还是不好使。
只要是子控件发的DrawNow消息,都不会进入任何Draw函数,包括父控件的,子控件的。
唯一可以自绘制的,就是CEikEdwin控件,其他自定义的控件都不好使,SetContainerWindowL都调用过了,确实没有遮挡,没有不可见,设置了对应的Component,就是不行,想不到理由啊。。。
alex_hua
2009-06-04
打赏
举报
回复
在子控件中需要重绘的地方用 Window().Invalidate()/或者Parent()->Window().Invalidate()代替DrawNow()~
duguguiyu1984
2009-06-04
打赏
举报
回复
恩,我再仔细描述我的问题吧。
比如 有这样的控件链 A->B->C C是B的子控件,B是A的子控件。
如果,在A调用DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都会进入,一切正常。
但如果调用C或者B的DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都不会进入,这和正常逻辑不符合。
所以我一直都觉得,错误不在CountComponentControls、ComponentControl之类的函数上,否则第一个情况如何解释?
所以拜托各位大佬仔细看一下问题,谢谢。
zorro0799
2009-06-04
打赏
举报
回复
看看AppUI中下面两个函数是否实现
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
加载更多回复(15)
浅谈MFC
控件
重绘
本文介绍了MFC
控件
重绘
的原理和方法,包括常见的按钮、编辑框、组合框和列表
控件
的
重绘
示例。通过
重绘
控件
,可以实现自定义界面的美观效果。此外,还探讨了MFC通用皮肤库的实现思路,此类皮肤库通过消息函数钩子实现
控件
的批量皮肤更换。
MFC
控件
重绘
本文详细介绍了MFC
控件
的
重绘
原理,包括按钮、编辑框、组合框和列表
控件
的自定义绘制示例。通过
重绘
控件
,可以实现界面的个性化和美观化。此外,还探讨了通用皮肤库的实现思路,这些库通常通过消息钩子拦截绘制消息,实现全应用的皮肤更换。
QT
控件
重绘
本文介绍了使用QT进行
控件
重绘
的方法,包括QButton和QComboBox等
控件
的定制样式,提供了详细的代码示例及样式表应用技巧。
MFC
控件
完全
重绘
从CWnd开始
本文提倡通过从CWnd基础
控件
开始完全
重绘
,而非使用自绘方式美化MFC
控件
。作者指出MFC对部分
控件
的操作存在限制,如CTabCtrl的头部高度和Item宽度。文章介绍了实现界面库设计所需的关键消息处理,并展示了如何在OnPaint函数中采用双缓存防止闪烁。此外,还展示了如何动态创建并定制
控件
,使得子类可以方便地重写DoPaint函数来实现自定义绘制。
MFC之窗口
控件
更新
重绘
相关函数
MFC编程中,窗口
控件
的更新和
重绘
涉及到几个关键函数:Invalidate、InvalidateRect、UpdateData和UpdateWindow。Invalidate使整个窗口客户区无效,InvalidateRect指定矩形区域无效,UpdateData用于
控件
与变量间的数据同步,UpdateWindow则强制窗口立即
重绘
。了解这些函数的工作原理对于优化MFC应用的显示效果至关重要。
Symbian
3,119
社区成员
9,182
社区内容
发帖
与我相关
我的任务
Symbian
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
复制链接
扫一扫
分享
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章