技术开发 频道

Symbian 平台技术开发技巧汇总

  问题十一、怎么使用BUTTON 类创建一个 BUTTON

  S60里面好像没有BUTTON的类吧

  1.好像没有必要做BUTTON,触发事件使用MENU就可以了

  2.如果非要做的话,可以尝试的下面的简单方法

  2.1 使用一个LABEL(设置一下边框属性可以使这个LABEL像一个所谓的BUTTON)

  2.2 可以在该LABEL的所处CONTAINER的

  OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);

  处理KEY事件(判断该LABEL拥有FOCUS)

  问题十二、图标资源的读取与储存结构

  可以在AknView类中定义如下的图标数组进行储存图标数据结构,这种结构有图表位图和蒙板(mask)

  CArrayPtr* iIconArray;

  具体实现方法:

  iIconArray->AppendL(CEikonEnv::Static()->CreateIconL(iMbmFile, EMbmFile1, EMbmFile1_mask));

  在需要贴图标的地方用这个数组句柄引用即可

  问题十四、一段左软键菜单的控制代码

  要求:1点了左软键之后,就相当与点了ok键。

  2 :把左软键菜单的地方由option改为select

  // My.rss

  RESOURCE EIK_APP_INFO

  {

  menubar = r_bmpmanip_menubar;

  // cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;

  cba = R_AVKON_SOFTKEYS_SELECT_BACK; // see “epoc32\include\avkon.rsg”

  }

  // MyAppUi.cpp

  void CMyAppUi::HandleCommandL(TInt aCommand)

  {

  switch(aCommand)

  {

  case EAknSoftkeySelect: // see “epoc32\include\avkon.hrh”

  {

  // left softkey is pressed…

  }

  …

  }

  }

  }

  问题十五、如何在CAknGrid上绘制背景图

  从CAknGrid派生自己的子类,然后自己draw,如:

  void CYourGrid:raw(const TRect& aRect) const

  {

  CWindowGc& gc = SystemGc();

  gc.DrawBitmap(aRect, aYourBitmap);

  CAknGrid:raw(aRect);

  }

  问题十六、两种从资源文件中读取常量的方法

  第一种 是老的方法了 要先 #include 才可以用

  TBuf<64> buf;

  CEikonEnv::Static()->ReadResource(buf,R_APP_LABEL);

  R_APP_LABEL 就是我们在资源文件中定义的常量

  第二种 新方法 要先 #include

  HBufC* buf;

  buf=StringLoader::LoadLC(R_APP_LABEL);

  在此之前要求先把资源文件给加进来噢, 格式 #include < 项目名.rsg>

  问题十七、如何取得imei

  #ifndef __WINS__

  TPlpVariantMachineId imei;

  PlpVariant::GetMachineIdL(imei);

  aImei.Copy(imei);

  #else

  问题十八、如何在Series 60窗体上绘制标签

  这是一种在Series 60窗体上显示标签的方法。你可以在电量图标或信号图标旁边显示一个标签,为此需要用程序实现。我使用了从CCoeControl继承的CIndicatorIcon 这个类。你需要象这样创建ConstructL():

  void CIndicatorIcon::ConstructL()

  {

  iMyWindowGroup = RWindowGroup(iCoeEnv->WsSession());

  User::LeaveIfError(iMyWindowGroup.Construct((TUint32)&iMyWindowGroup));

  iMyWindowGroup.SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);

  iMyWindowGroup.EnableReceiptOfFocus(EFalse);

  CreateWindowL(&iMyWindowGroup);

  // 默认设置指示标签静止

  SetIndicatorIconL(EIndicatorIconAppActive);

  ActivateL();

  }

  在ConstructL()中,我调用了另一个函数 SetIndicatorIconL()设置标签:

  void CIndicatorIcon::SetIndicatorIconL(TIndicatorIcon aIndicatorIconType, TBool aRedraw)

  {

  switch(aIndicatorIconType)

  {

  case EIndicatorIconEmpty:

  iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_empty);

  iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_empty_mask);

  break;

  case EIndicatorIconAppActive:

  iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_bt_connect_on);

  iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_bt_connect_on_mask);

  break;

  case EIndicatorIconAppInactive:

  iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_bt_audio);

  iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_bt_audio_mask);

  break;

  default:

  break;

  }

  SetRect(TRect(TPoint(KIndicatorPosX, KIndicatorPosY),iIndicator->SizeInPixels()));

  // 如果 aRedraw == ETrue 从新绘制画布

  if(aRedraw)

  {

  DrawNow();

  }

  }

  你需要跳过CCoeControl的Draw()函数代码如下 :

  void CIndicatorIcon::Draw(const TRect& aRect) const

  {

  CWindowGc& gc = SystemGc();

  gc.Clear();

  gc.SetBrushStyle(CGraphicsContext::ENullBrush);

  gc.BitBltMasked(TPoint(aRect.iTl.iX, aRect.iTl.iY),

  iIndicator,

  TRect(TPoint(0, 0), iIndicator->SizeInPixels()),

  iIndicatorMask,

  ETrue);

  }

  现在把这些行加入到程序AppUi类的ConstructL()中:

  iIndicatorIcon = CIndicatorIcon::NewL();

  // 下一行将画标签并绘制到屏幕上

  iIndicatorIcon->SetIndicatorIconL(CIndicatorIcon::EIndicatorIconAppInactive, ETrue);

  问题十九、判断E盘是否可用

  TDriveInfo driveInfo;

  TInt error = fs.Drive(driveInfo, EDriveE);

  User::LeaveIfError(error);

  if (driveInfo.iDriveAtt == KDriveAbsent)

  {

  // drive E is absent

  }

  Reference: “How to retrieve drive and volume information”

  http://www.symbian.com/developer/techlib/v8.1adocs/doc_source/guide/Base-subsystem-guide/N1007E/FileServerClientSide/FileServerClientSideGuide2/DriveAndVolumeExample.guide.html

  问题二十、读取symbian上文件的例子

  RFile igpFile;

  RFs fs;

  TInt aSeek = 0;

  TInt aFileSize;

  TBuf16 igpName16;

  TParse parse ;

  parse.Set(CEikonEnv::Static()->EikAppUi()->Application()->AppFullName(), NULL, NULL);

  TBuf16<128> igpFullName ;

  igpFullName.Copy (parse.DriveAndPath()) ;

  igpFullName.Append (_L(”dice1.igp”));

  fs.Connect();

  // Write to file for later usage

  igpFile.Open( fs,

  igpFullName,

  EFileRead | EFileStream );

  igpFile.Seek( ESeekEnd, aSeek );

  aFileSize = aSeek;

  aSeek = 0;

  igpFile.Seek( ESeekStart, aSeek );

  aFileBuffer = HBufC8::NewL( aFileSize );

  igpFile.Read( aFileBuffer->Des (), aFileSize );

  igpFile.Close();

  fs.Close();

0
相关文章