2005年06月13日

在前面的贴子《S60的疑惑?》中提出了问题,今天碰巧解决了这个问题,所以在这也留下出错的原因。

在函数 Public void paint(Graphics g) 中,原来是这样写的:

{

    if ( m_g  == null )

          m_g = g;

    ……………..

    g.drawxxx();

    …………….

}

上面的 m_g 是一个 static Graphics 对象。发现如果有    if ( m_g  == null ) 这句比较的语句,在S60上,在切换程序的时候就会死机,但如果删掉这句,就一切正常。但我始终没有想明白,为什么这句比较的语句会造成死机这么大的Bug。

问题虽然这样解决了,但具体为什么会有这样的Bug却还是不明白????

RealPlay for Nokia S60 cvs view

https://helixcommunity.org/viewcvs/cgi/viewcvs.cgi/clientapps/symbian/player/series60/

2005年06月10日

上面已经讲了所有从CCoeControl继承的类都可以使用相关Draw函数。现在用一个例子来
说明我的疑惑

在。net2003下新建一个Symbian工程,使用的工程模板为:S60 View based app。
工程建好后,src目录下有如下:Symbian1App。cpp , Symbian1AppUi.cpp ,
Symbian1document.cpp , Symbian1View.cpp , Symbian1View2.cpp , Symbian1Container.cpp
Symbian1Container2.cpp 这5个文件,是典型的MVC结构。其中 Symbian1View.cpp ,
Symbian1View2.cpp , Symbian1Container.cpp , Symbian1Container2.cpp 都是从
CCoeControl继承下来的。在Symbian1Container.cpp , Symbian1Container2.cpp文件中,
重载了父类的Draw()函数,代码如下:
void CSymbian1Container::Draw(const TRect& aRect) const
{
    CWindowGc& gc = SystemGc();
    // TODO: Add your drawing code here
    // example code…
    gc.SetPenStyle( CGraphicsContext::ENullPen );
    gc.SetBrushColor( KRgbGray );
    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
    gc.DrawRect( aRect );
}
这个函数就是使用灰色来填充这个window的客户区域,也就是清屏。

现在我在这个函数里添加几句话来实现画字符,代码如下:
void CSymbian1Container::Draw(const TRect& aRect) const
{
    CWindowGc& gc = SystemGc();
    // TODO: Add your drawing code here
    // example code…
    gc.SetPenStyle( CGraphicsContext::ENullPen );
    gc.SetBrushColor( KRgbGray );
    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
    gc.DrawRect( aRect );

    // add
    _LIT(KMyText,"My text");
    gc.DrawText(KMyText, TPoint(40, 40) );
    // end
}

打开模拟器,进入这个程序后马上就退出到桌面,如果删掉添加的那两行代码就OK,难道说
在Container里不能直接画Text吗?还是因为Container里添加了其他Control的缘故?

下次试着在View里面画,看看结果怎么样?当然肯定要改变一下,不用MVC的结构。因为
我在SDK的Example里看到绘图的例子就是直接在View里画的,而且没有Container。难道说
真的是Container在搞怪?!

2005年06月09日

在Symbian中,CCoeControl类提供绘图函数Draw,DrawNow,DrawDeferred。所有从CCoeControl继承
下来的类都可以通过这些函数来绘制字符、图片、控件等等。

可以通过CCoeControl::SystemGc()得到CWindowGc,还可以通过CEikonEnv::Static()->SystemGc()在
Control以外得到CWindowGc。

Draw()--不能直接访问Draw函数。当window被创建或在其他与window相关的事件中,由系统调用。

DrawNow()--我们可以通过这个函数来通知系统立即调用Draw()函数进行重绘。

DrawDeferred()--通过这个函数通知系统某个control区域可用,但什么时候重绘由系统决定。

在游戏中,我们经常需要重绘,但不保证每次调用DrawDeferred()函数后Draw()都能够被调用,也
就是说,短时间内多次调用DrawDeferred()函数可能会导致前面的重绘过程被后面的淹没掉,在画
面表现上会和理想情况的有差异。

在绘画事件以外我们也可以进行绘制,通过一些附加的步骤:
1.通过CWindowGc::Activate()来激活绘图上下文
2.使用RWindow::BeginRedraw()来通知系统准备开始绘制
3.画你想画的…
4.使用RWindow::EndRedraw()来通知系统绘制结束
5.使用CWindowGc::Deactivate()来使绘图上下文无效

     好久没碰Symbian了,最近又有了兴趣,打算继续学习下去。下载了2.1中文版的SDK,1.1版的NDS for Symbian C++。XP SP2系统,先安装。net2003,再安装NDS,再安装SDK。安装过程一切顺利。所有的程序都安装在E盘。启动。net2003,却报NDS插件的参数不正确,进入。net,新建Symbian工程,编译,出错,报:cl.exe创建失败。在命令行下,abld build wins udeb却成功,再在。net下执行工程,成功!

     我估计在。net下编译失败是因为NDS插件没有正确安装到。net的缘故,不然在命令行下,也不会编译成功。但怎么解决这个问题还不知道!虽然这样也能用,但总是不太方便。希望有朋友能解决这个问题!

**********************************************************************************

最近在Nokia论坛上看到解决方法:

在VS中选择Tools->Options->Projects->Visual C++ Directories,加上$(VCInstallDir)bin 和 $(VSInstallDir)Common7\IDE

      最近写J2ME程序,有一个很奇怪的问题:在S60手机上,使用全屏Canvas,在切换出程序到桌面再切换回程序后,会造成手机死机,而且死的很严重,除了拔电池外,没有其他方法。如果仅仅只用Canvas,而其他代码不改动,就不会有上面的现象。找了很久,都没明白是什么地方造成的死机,但其他程序全屏模式在S60上又没有这个问题,所以手机Bug基本排除。而且代码里也没有什么很怪的东西,唉,真是搞不懂了!