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

求教关于控件重绘的问题。。。
我在重载的子控件中做了一些修改后调用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,你看你的是不是这个原因导致的。