求教关于控件重绘的有关问题。
求教关于控件重绘的问题。。。我在重载的子控件中做了一些修改后调用DrawNow方法,没有反应。子控件放在某个父
求教关于控件重绘的问题。。。 我在重载的子控件中做了一些修改后调用DrawNow方法,没有反应。 子控件放在某个父控件中,创建是调用过SetContainerWindow函数。 谢谢[解决办法] 1:可能是被其他的画面覆盖了,自己查查代码。draw是os提供的立刻刷新屏幕的指令,不需要缓存。 2: 你调用的drawnow是那个控件的,用DrawDeferred试试撒.还有可能是你的画面就没有变化,打log看看。。每个函数的进出口都打一个。。 看看到底进没进draw[解决办法] 1.控件肯定要有window,否则没法画,buffer也有。所有绘制都是由wsrv干的,因此draw的函数只是向wsrv发送了些命令。 参考 Symbian OS v9.2 » Symbian OS guide » Graphics » Using Window Server (WSERV) » Window Server architecture DrowNow: gc->Activate(iWindow); iWindow.Invalidate(rect); iWindow.BeginRedraw(rect); DoDraw(rect); iWindow.EndRedraw(); gc->Deactivate(); DrawDefered: iWindow.Invalidate(rect); 之后会在收到wsrv的redraw event的时候: iWindow.BeginRedraw(rect); DoDraw(rect); iWindow.EndRedraw(); gc->Deactivate(); 因此相同区域的多个redraw请求只会收到一个redraw event。 2. 会不会你这个控件绘制完了后,其他地方调用了gc的clear?[解决办法]
探讨 1. 肯定没有,我确定。恩,Symbian没有window的控件的DrawNow是立刻绘制在屏幕上么?怎么会我的理解相反。。。 2. 进了,这也没有错。[解决办法] 被盖掉了吧。
[解决办法] 建议楼主阅读系列文章:“自定义控件”
http://wiki.forum.nokia.com/index.php/自定义控件:_定义(一)
这是第一篇,文中有其它内容的链接。
[解决办法] 楼主这个问题解决了吗? 具体是什么原因? 关注中......
[解决办法] 探讨 太对不起楼上了。我调试的时候搞错了。 我在控件中调用DrawNow,但没有进入该控件的Draw函数,不知为何。。。[解决办法] 看看
[解决办法] 1.看看你的子控件返回列表是否正确
2.你的子控件当前是否Visible
[解决办法] SizeChanged,CountComponentControls,ComponentControl三个函数作了相应的处理吗?有大量的例子可参考。
[解决办法] 实际上你碰到的是非常非常简单的问题,贴出源码好让大家帮你分析。
[解决办法] 看看AppUI中下面两个函数是否实现
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
[解决办法] 在子控件中需要重绘的地方用 Window().Invalidate()/或者Parent()->Window().Invalidate()代替DrawNow()~
[解决办法] 探讨 ... 如果,在A调用DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都会进入,一切正常。 但如果调用C或者B的DrawNow,A,B,C的DrawNow、CountComponentControls、ComponentControl都不会进入,这和正常逻辑不符合。 ...[解决办法] >>>但如果调用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的控件绘制时是需要父控件重绘的)。。。
实在想不出还有什么别的理由。。。
[解决办法] 以前遇到类似问题,也是找了很久,最后发现是void Draw(const TRect& aRect) const;,重载它的时候忘记声明为CONST,你看你的是不是这个原因导致的。
[解决办法] 一般只有根CCoeControl(就是你上面说的A)才需要调用CreateWindowL,拥有窗口。子控件使用自己的DrawNow就可实现自身重绘,也不应该出现问题。 我在三版的Emulator上测试20#提到的笑脸例子,鼠标点击(或摁键盘)可在笑脸/苦脸间切换。这个例子正好是A,B,C三个CCoeControl嵌套,未见绘制问题。 楼主不妨也测试一下,如有问题再探讨。[解决办法] A里面需要CreatWindowL, B,C里面需要SetContainerWindowL( A or B ).这里没有问题吧?[解决办法] 把CountComponentControls、ComponentControl都去掉,换成Component array试试吧。[解决办法]
探讨 引用: 太对不起楼上了。我调试的时候搞错了。 我在控件中调用DrawNow,但没有进入该控件的Draw函数,不知为何。。。 呵呵,没事,估计是你的代码有问题,建议你仔细理一理逻辑。 如果代码正确,没道理不行的。 听听 7楼的建议