求教关于控件重绘的问题。。。

duguguiyu1984 2009-05-21 02:42:55
我在重载的子控件中做了一些修改后调用DrawNow方法,没有反应。

子控件放在某个父控件中,创建是调用过SetContainerWindow函数。

谢谢
...全文
1763 35 打赏 收藏 转发到动态 举报
写回复
用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)

3,120

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧