WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程Symbian程序开发Graphics(3)

Graphics(3)
作者:剑走偏锋  来源:开发视界  发布时间:2005-12-20 0:11:21
几乎在每一个游戏里都需要在屏幕上面显示一些文字.在游戏中,字体从头到尾都应该有一个整体的风格.Symbian系统提供了一个标准的字体设置,但是开发者也可以根据情况,使用自己的比特图字体.每一个字体都只能有一个实例存在与系统中,而且他被所有的系统线程所共享,因此,他被保存在主内存中.

    当你使用一个特定的字体时,应该注意:
    1.创建CFront的一个对象来获得屏幕设备给定的一个参数(CGraphicsDevice::GetNearestFontInTwips).
    2.在开始画Text之前,在图形连接里面建立一个字体.(CWindowGc::UseFont)
    3.当一个字体不再被使用时,他应该被释放掉.释放的步骤首先在图形连接里使用CWindowGc:iscardFont释放,然后在CGraphicsDevice::ReleaseFont释放.下面示例代码演示了如何创建新字体,显示一些文本,和释放字体:
以下内容为程序代码:

void CMyGameView:raw( const TRect& /*aRect*/  const

   {

   CWindowGc& gc = SystemGc();

 

   // Get smallest possible arial font

   _LIT(KMyFontName,"Arial";

   CFont* myFont;

   TFontSpec myFontSpec(KMyFontName,1);

 

   CGraphicsDevice* screenDevice = iCoeEnv->ScreenDevice();

   screenDevice->GetNearestFontInTwips(myFont,myFontSpec);

 

   // Use new font

   gc.UseFont(myFont);

 

   // Draw some text

   _LIT(KMyText,"My text";

   gc.DrawText(KMyText, TPoint(40, 40) ;

 

   // Discard and release the font

   gc.DiscardFont();

   screenDevice->ReleaseFont(myFont);

   }

    在实际运用过程中,字体通常使用ConstructL来创建,然后用爆破装置(C4炸弹)Boom!!!一下就会被炸的稀巴烂,哈哈.使用TFontSpec来指定字体的一些特性:字体高度,字体(宋体,仿宋,罗马等),字体样式(加粗,黑体等).当你使用相关方法查询当前字体的相关描述时,将会返回一个最接近的描述.

    CEikonEnv中也包含了一个方法可以获得环境中的字体信息,CEikonEnv::TitleFont可以获得标题的字体,这样可以方便的使周围环境的字体和标题字体相一致.

    你可以使用CGraphicsDevice ::NumTypeFaces来获得你储存字体的号码,使用CGraphicsDevice ::TypeFaceSupport来获得这些字体的详细信息.示例代码:
以下内容为程序代码:

void CMyGameView::ListMyFontsL()

   {

   // Find out the number of typefaces

   TInt iNumTypefaces = iCoeEnv->ScreenDevice()->NumTypefaces();

 

   // Show name of each available font

   TBuf<64> myFontName;

   TBuf<128> text;

   for(TInt t = 0; t < iNumTypefaces; t++)

      {

      // Get font name

      TTypefaceSupport myTypefaceSupport;

      iCoeEnv->ScreenDevice()->TypefaceSupport(myTypefaceSupport, t);

      myFontName = myTypefaceSupport.iTypeface.iName.Des();

 

      _LIT(KMyText, "Font %d/%d:";

      text.Format(KMyText, t, iNumTypefaces);

      iEikonEnv->InfoWinL(text, myFontName);

      }

   }

    特别是在游戏中,有时候,你需要创建一个属于自己的字体.你自己的字体必须含有所有你要显示的字的样式,这样做的好处是你可以在游戏里显示多个字体,但是自己做一个这样的字体比较浪费时间.所以你也可以创建一个新的Symbian OS字体,使用已经存在的字体和图片API,把你想要使用的字体包含进来.创建一个自定义字体,你需要:
    1.建立一个字体定义文件,例如MyFont.gd
    2.创建Adobe BDF (Bitmap Distribution Format)字体比特图;例如MyFont.bdf.
    3.使用fnttran工具建立一个Symbian OS字体储存文件,例如 MyFont.gdr(例如fnttran MyFont.bdf MyFont.gd MyFont.gdr)
    4.拷贝MyFont.gdr到指定的\system\fonts文件夹下面,然后在建立软件安装包的时候,要修改.pkg文件,模拟器会自动拷贝字体文件到fonts文件夹.
    
    MyFont.gd文件示例代码:
以下内容为程序代码:

Typeface tf_MyFont

   Name "My Font" Proportional

   FontBitmaps

      MyFont   // Name of the font in BDF file

   EndFontBitmaps

EndTypeface

 

FontStoreFile 

   CollectionUid 123456789 // Uid of the font; must be unique

   KPixelAspectRatio 1000

   CopyrightInfo

      "MyCopyrightInfo"

   EndCopyrightInfo

   Typefaces

      tf_MyFont

   EndTypefaces

EndFontStoreFile

    自从BDF格式被广泛使用后,他的多种格式可以被用来创建字体.BDF文件可以以多种方法来创建,例如windows比特图,字体编辑器等,或者也可以手动创建.因为字体文件的基础就是一个文本文件,但是手动创建会很困难.

    当创建了BDF文件以后,经常性的会需要一些修正,这些属性存在于BDF文件里(在STARTPROPERTIES和ENDPROPERTIES之间).
以下内容为程序代码:

Uid uid  (并不是和收集的Uid一样.)

MaxNormalWidth width.

MaxConsecutiveFillChars max.

Bold [1/0].

Italic [1/0].

FONTASCENT ascent.

FONTDESCENT descent.

    通常情况下Uid和MaxNormalWidth是BDF文件中缺失的,fnttran将会在某些属性缺失的情况下通知你.当你创建字体储存文件MyFont.gdr的时候,他就已经被拷贝到\system\fonts下面了,他也会和其他字体一样在手机或模拟器里使用.示例:
以下内容为程序代码:

CFont* CMyGameView::GetMyOwnFont() 

   {

   _LIT(KMyFontName,"MyFont";

   CFont* myFont;

   TFontSpec myFontSpec(KMyFontName,1);

 

   CGraphicsDevice* screenDevice = iCoeEnv->ScreenDevice();

   screenDevice->GetNearestFontInTwips(myFont,myFontSpec);

   return myFont;

   }

    字体文件可以被拷贝到任意驱动器的文件夹下,如C:\system\fonts, E:\system\fonts,但是一旦被移动了,在字体被应用程序使用之前需要重启动一下.你也可以使用CWsScreenDevice::AddFile,来防止这种情况的发生.
[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码