首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Symbian >

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

2012-01-18 
求教关于控件重绘的问题。。。我在重载的子控件中做了一些修改后调用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楼的建议

热点排行