Symbian开发总结

1. 获得控件ID。
 aControl->UniqueHandle();
2. View显示提示信息。
 iEikonEnv->InfoMsg()
3. 获得焦点的控件。

4. 发送command事件的控件需要实现
 MQikCommandOperator。
5. 好像可以获得任何子控件,多级。
 LocateControlByUniqueHandle<CEikLabel>(EMyViewLabel);
6. 处理ListBox事件使用
 MQikListBoxObserver(HandleListBoxEventL)
7. HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType)
    {
    // Call base class to get focus navigation right
    CQikViewBase::HandleControlEventL(aControl, aEventType);
    // ...  其他实现
8. 查找获得焦点的控件
 QikFocusUtils::FindFocusedControl(*this);
9. 异常处理:
 User::LeaveIfError() 检测返回TInt的方法。
10. 文件:
 RFs& fs = iCoeEnv->FsSession();
 _LIT(KFileName, "c://helloworld.txt");
 User::LeaveIfError(iFile.Replace(fs, KFileName, EFileWrite|EFileStreamText|EFileShareAny));
 iFile.WriteUint16L(0xFEFF); // Windows unicode file header.
11. 调试输出:
    RDebug::Print();  //不知输出到哪里?
12. 好像SetUniqueHandle后才能
 LocateControlByUniqueHandle<>()
 如果不使用此方法,可以不使用UniqueHandle ID.
13. Pen模式下,OfferKeyEventL的导航键的TKeyEvent.iCode为0,
 Action的TKeyEvent.iScanCode为EStdKeyDevice8(172=0xAC).
14. GIF显示CPAlbImageViewerBasic
15. 所有继承于CCoeControl的控件重画都可以使用
 DrawNow()
    延迟刷新使用
 DrawDeferred().
16. 替换CommandList
 CQikCommandManager& manager = CQikCommandManager::Static(*iCoeEnv);
 manager.DeleteFromCommandList(*this, R_QRREADERUI_MAINVIEW_COMMANDS);
 // add new commandlist
 const CCoeControl* control = manager.FindModelOwningClient(*this);
 manager.InsertIntoCommandListL(*control, *this, R_QRREADERUI_ADVIEW_COMMANDS);
17. STRING to r:
 ^rls_string (STRING_r(_adview_[^ ]+)).*$
 RESOURCE TBUF R/2 { buf = /1 ;}
18. 创建可修改的字符串:
 HBufC *buf = HBufC::NewLC(MAX_SMS_BUFFER_LEGHT);
 TPtr bufPtr(buf->Des());
19. 创建长度为0的TPtrC:
 TPtrC();
20. Draw使用CCoeControl::SystemGc()获得GC,适用于所有控件。
 gc.Clear(Rect()) 清除控件显示区域。
21. 不使用资源的初始化
 void CQHelloWorldView::ViewConstructL()
 {
 CQikCommandManager& cmdManager
 = CQikCommandManager::Static(*iEikonEnv);
 cmdManager.CreateCommandListL(*this);
 }
22. 。您总是可以通过以下方式在CCoeControl 的继承类内启动redraw
(重绘):(根据优先顺序)
 1. 通过调用Window().Invalidate(const TRect& aRect),将需要重绘的区域设
 成为无效(invalidate)。
 2. 通过调用DrawDeferred() 来安排一个全面的重绘。
 3. 通过调用DrawNow()立即绘图。
23.  获得UI指针:
 CEikonEnv::Static()->EikAppUi()
24.  检测文件首否存在
 BaflUtils::FileExists(iFsSession, aExistingBookFile)
25.  创建图标:
 iEikonEnv->CreateIconL( KBarcodeWorkFileName, 
   EMbmBarcodeworkAd_wap,EMbmBarcodeworkAd_wap_m );
26.  格式化时间:
 _LIT(KDateFormat, "%04d/%02d/%02d %02d:%02d:%02d");
 TTime time;
 time.HomeTime();
 TDateTime dateTime = aTime.DateTime();
 dateTime.Format(KDateFormat,dateTime.Year(),dateTime.Month()+1,dateTime.Day()+1,
   dateTime.Hour(),dateTime.Minute(),dateTime.Second());
27.  listBox选中项:
 TInt selIndex = listBox->CurrentItemIndex();
 TInt selId = listBox->ItemIdL(selIndex);
 TInt selIndex = listBox->model().ItemIdIndex(selId);
28.  HBufC到DesC转换
    *iBuffer;
29. 描述符的
  1。子串:
 TPtrC ptrc1 = bufc.Right(5);
        TPtrC ptrc2 = bufc.Mid(3,6);
  2。数组:
    TBufC<8> matchstr[7] =  {*&KTxtMatchstr1, // "*World*"
                         *&KTxtMatchstr2, // "*W?rld*"
                         *&KTxtMatchstr3  // "Wor*"
                        };
  3。设置长度:(最大长度不变,地址不变);
    buf.Zero();
    buf.SetLength(3);
  4。Append结果大于最大长度将引发Panic错误。
  5。动态内存:
    CBufFlat* flatBuf=CBufFlat::NewL(4);
    CleanupStack::PushL(flatBuf);
    flatBuf->SetReserveL(32);
   
30. 常用Lib:
    estor.lib           CFileStore        // filestor
    edbms.lib           RDbStoreDatabase  // 数据库类

31. HandleListBoxEventL中:
 EEventItemTapped:    pen点击事件
 EEventItemConfirmed:Action键盘事件

32. 清除容器内所有控件:
 iContainer->Controls().ResetAndDestroy();
    不能使用:
 iContainer->Controls().Reset();

33. OpenUrl:
 void CNetworkService::OpenURIL( const TDesC& aAddr )
 {
 TVwsViewId id( KUidQWebApp, KUidQWebPageView );

 TQWebDNLUrlEntry obj;
 obj.iUrl = aAddr;
 TQWebDNLUrlEntryBuf buf(obj);

 CEikonEnv::Static()->EikAppUi()->ActivateViewL(id, KQWebCustomMsgId, buf);
 }

34.  写文件:
 RFs fs = CEikonEnv::Static()->FsSession();
 
 //检测
 if( BaflUtils::FileExists(fs, aFileName) ) fs.Delete( aFileName );

 //创建,打开,替换
 RFile file;
 User::LeaveIfError(file.Create( fs, aFileName, EFileWrite));
 file.Write( aFileContent );

 file.Close();

35.  动态缓存:(Using Dynamic Buffers)
 CBufBase,CBufFlat,CBufSeg;
 使用Size确定其大小。
  aBuf->Read(3,des,5); // puts "lo wo" into des.
 aBuf->Write(6,KFolks);
 Compress() //压缩控件为最小
 
36. 改变控件风格: 1. 继承控件,重载GetTextDrawer 2. 在父控件或视图中:
 void CHelloWorldView::GetTextDrawer(CCoeTextDrawerBase*& aTextDrawer, const CCoeControl* aDrawingControl) const
  {
  if(aDrawingControl==iLabel)
   {
   aTextDrawer->SetTextColor(KRgbRed); //将字体设为红色
   }
  }
 void CMyLabel::GetTextDrawer(CCoeTextDrawerBase*& aTextDrawer, const CCoeControl*/* aDrawingControl*/, TInt/* aKey*/) const
 {    aTextDrawer->SetTextColor(KRgbRed);    }
   
37.  改变title图标:
 1. 获得Titlebar控件:
   MQikViewContext* mvc = ViewContext();
   CCoeControl* vc = &(mvc->AsControl());
   CCoeControl* titlebar = vc->Parent()->Parent()->Parent();
 2. 改变图标控件内容:
   if(titlebar!=NULL)
   {
    CEikImage* titlebaricon = static_cast<CEikImage*>(titlebar->ComponentControl(0));
    titlebaricon->SetContentL(KAnim);
    // bug: the anim is always lower than expected,
   }
 无bug版见:"Symbian积累"
 
38. 使用计时器(-):
 iPeriodic = CPeriodic::NewL(0); // neutral priority
 iPeriodic->Start(KTickInterval,KTickInterval,TCallBack(Tick, this)); // Tick可以为成员方法
 
 TInt CHelloWorldView::Tick(TAny* aObject){  aObject->DoTick(); }  // 计时器响应
 
 if(iPeriodic->IsActive())
 {
  iPeriodic->Cancel(); //取消
 }

39. 抓屏:(抓屏.txt)
40. 在非对话框的系统块中添加CEikEdwin控件不会自动弹出:
 CQikBuildingBlock* block = CQikBuildingBlock::CreateSystemBuildingBlockL(EQikCtCaptionedTwolineBuildingBlock);
 container->AddControlLC(block, 100);
 block->ConstructL();
 _LIT(KCaption,"Title above second edwin");
 block->SetCaptionL(KCaption, EQikItemSlot1);

 CEikEdwin* edwin = new (ELeave) CEikEdwin();   
 block->AddControlLC(edwin, EQikItemSlot2);
 edwin->ConstructL();
 edwin->SetUniqueHandle(ELabelStart);
 edwin->SetObserver(this);
41. 删除控件:
        CCoeControl* qlbx = Controls().RemoveById(EMyListbox);
 if(qlbx) delete qlbx;
42. 窗体坐标:
 每一个window都有一个坐标, 它的原点位置相对于其父窗体的的原点.如果其父窗体是一个window group, 它的位置相对于屏幕设备左
        上角,因为groups 没有尺寸大小。

43. 字符串格式化:
 _LIT(KresultFormat, "%S"); // 必须为S
 resultMsg.Format(KresultFormat, &newName); // 取地址
44. 异常抛出:
 User::Leave()后不用添加return。
45. 时间格式化:
 TBuf<32> theTime;//存储转换后的时间
   TTime tt;
   tt.HomeTime();
   _LIT(KTimeFormat,"%Y%M%D%1-%2-%3 %H:%T:%S");//格式为:2006-03-04 12:12:12
  tt.FormatL(theTime,KTimeFormat);
45. TBuf转Tint型
 TInt iNum1(123456789009876);// 15位数字
 iBuf.Num(iNum1);            // 将缓存的内容设置为iNum1
 TLex iLex(iBuf);            // 使用iBuf包含的内容创建TLex对象the 15 digit number
 TInt iNum2;
 iLex.Val(iNum2);            //iNum2现在包含了15位数字
 /* 数据类型转换*/
  TBuf  转换为 TPtrC16
    TBuf<32> tText(_L("2004/11/05 05:44:00"));
    TPtrC16 tPtrSecond=tText.Mid(17,2);
  TPtrC16 转换为 TBufC16
    TPtrC16 tPtrSecond=tText.Mid(17,2);
    TBufC16<10> bufcs(tPtrSecond);
  TBufC16 转换为  TPtr16
    TBufC16<10> bufcs(tPtrSecond);
    TPtr16 f=bufcs.Des();
  TPtr16 转换为 TBuf
    TBuf<10> bufSecond;
    bufSecond.Copy(f);
  TBuf 转换为 TPtr16
    TBuf<10> bufSecond(_L("abc"));
    TPtr16 f;
    f.Copy(bufSecond);
  TBuf 转换为 TInt
    TInt aSecond;
    TLex iLexS(bufSecond);
    iLexS.Val(aSecond);
  TInt 转换为 TBuf
    TBuf<32> tbuf;
    TInt i=200;
    tbuf.Num(i);
  UTF-8转换成UNICODE
    CnvUtfConverter::ConvertToUnicodeFromUtf8( iBuf16 , iBuf8 );
  UNICODE转换成UTF-8
    CnvUtfConverter::ConvertFromUnicodeToUtf8( iBuf8 , iBuf16 );

  将char串转换成symbian串
    char* cc = "aaaa";
    TPtrC8 a;
    a.Set( (const TUint8*)cc , strlen(cc) );

46. 全局变量:
 template<class T>
 inline T* AppUi()
 {
     return static_cast<T*>(CEikonEnv::Static()->AppUi());
 }
 
 
 template<class T>
 inline T* Document()
 {
     return static_cast<T*>(CEikonEnv::Static()->EikAppUi()->Document());
 }

 template<class T>
 inline T* Application()
 {
     return static_cast<T*>(CEikonEnv::Static()->EikAppUi()->Application());
 }
 
 用法:
 CMyAppUi * p = AppUi<CMyAppUi>();
 CMyDocument * p = Document<CMyDocument>();
 CMyApplicaton * p = Application<CMyApplication>();
47.  描述符字串方法:
 Left,Right,Mid:中参数>=0. 长度超出时,取最长部分。
48.  问题:                                    // 使用以下方法无法插入数据
 RDbColWriteStream writeStream;
 writeStream.OpenL(table, KIndData);    // writeStream.OpenLC(table, KIndData);
 writeStream.WriteL(aData);             // writeStream.WriteL(aData);
 writeStream.Close();                // CleanupStack::PopAndDestroy(); // writeStream close
    而就没有问题:
 RDbColReadStream readStream;     // A stream object for long columns
 readStream.OpenLC(tblHist, KIndData);
 readStream.ReadL(des, nLen);
 CleanupStack::PopAndDestroy();   //readStream
49. DLL中加载资源
  //加入资源文件
 TFileName filename;
 TParse parse;
 parse.Set( CEikonEnv::Static()->EikAppUi()->Application()->AppFullName(), NULL, NULL);

 filename.Copy( parse.Drive() );
 filename.Append(KResPath);
 iResOffset = iEikonEnv->AddResourceFileL(filename);
50.  使用While+错误标志位+全局变量 可以解决某些递归调用。

51.  XmlLib 在 xmlframework.lib
 使用Xml::MContentHandler时应该这样处理:
 -> 叶节点标签在Oncontent中处理。
 -> 其他节点在OnEndElementL中处理
 -> 使用如下的跳转表:
  struct TKeyWordPair
  {
  const TPtrC8 tag;
  TInt iType;
  TInt iParentType;
  };
   在OnStartElementL中:
    for (TInt i=0; i<KKeyCount; i++)
  {
  if (tagName.CompareC(KKeyWords[i].tag) == 0)
   {
   iState = KKeyWords[i].iType;
   iParentSata =  KKeyWords[i].iParentType;
   break;
   }
  }

52.  换行符在symbian中为/n(0x0C),读取windows文件时会自动转换。
    XML解析时要跳过换行和空格。

53.  将KLit转化为TDesC:使用operator(),不会出现临时变量。
 _LIT(KLit, "Hello world!");
 KLit().AllocL();

54. 可以使用系统的KNullDesC(8,16)代替空字符串:
 _LIT(KNullDesC, "");

55. iHeapBuffer = aDesC.AllocL();就可以搞定数据放入堆中。

56.  CArrayPtr::ResetAndDestroy() 他的子类:CArrayPtrFlat,CArrayPtrSeg 都可以使用。
     RPointerArray<T> 也有此方法ResetAndDestroy()

57.  内存检测标记:
 __UHEAP_MARK:    标记开始
 __UHEAP_MARKEND: 标记结束
   
58.  View模式: 次序有关,可以覆盖
 TQikViewMode viewMode;
 viewMode.SetStatusBar(EFalse);          // 无状态条,电池的显示部分
 viewMode.SetAppTitleBar(EFalse);        // 无标题,
 viewMode.SetButtonOrSoftkeyBar(EFalse); // 无工具条,按钮或菜单的显示部位
 viewMode.SetToolbar(EFalse);            // 无??
 viewMode.SetFullscreen();               // 全屏,以上都没有
 SetViewModeL(viewMode);

59.  检测内存:
 TInt ramf;
 HAL::Get(HALData::EMemoryRAMFree, ramf);
60.  DLL实现:
 头文件中: IMPORT_C static CInsCamera* NewLC();
 源文件中: EXPORT_C CInspiryCamera* CInspiryCamera::NewLC();

61.  抽取Listbox的数据:
 MQikListBoxData* listBoxData = model.RetrieveDataL(0);
 CleanupClosePushL(*listBoxData);
 // ..
 CleanupStack::PopAndDestroy();
    或者:
 MQikListBoxData* listBoxData = model.RetrieveDataL(0);
 // ...
 listBoxData->Close();

62. 将所有的换行符号换成/f即可被CEikRichTextEditor识别为换行
    text->InsertL(text->DocumentLength(), CEditableText::ELineBreak);
    移动焦点:
    MoveCursorL (TCursorPosition::EFLineDown, EFalse);
   
63. 删除CRichText时:
 delete aText->GlobalCharFormatLayer();
 delete aText->GlobalParaFormatLayer();
 delete aText;

64. 遍历目录:
 iEikEnv->FsSession().GetDir(KSaveToDir, KEntryAttNormal, ESortNone, anEntryList);

 _LIT(KMdcMask, "c://Data//*.mbc");
 TInt ret = aDir.Open(iEikEnv->FsSession(), KSaveToDir, KEntryAttNormal);

65. 属性:
 临时对象,无名对象都是const

66. 添加静态库:
 STATICLIBRARY DMDecoder_static.lib
67. 内存对齐问题
 #ifdef __WINS__
 #  pragma pack(push,2)
 #define PACKED
 #else
 #define PACKED __attribute__((packed))
 #endif

 typedef PACKED struct tagBITMAPFILEHEADER{};

68. SetExtent(TPoint(0,0), iQikAppUi.ClientRect().Size());
    并不可靠,特别是改变屏幕显示模式。可以使用CQikGridLayoutManager。
 CQikGridLayoutManager* gridlayout = CQikGridLayoutManager::NewLC();
 SetLayoutManagerL(gridlayout);
 CleanupStack::Pop(gridlayout);
 
 对于CQikViewDialog使用
 Page(ActivePageId())->SetLayoutManagerL(gridlayout);

69. 直接创建独立的控件;
 iMyCtrl->ConstructL( KCameraContainerRect, &(iEikonEnv->RootWin()));

70. 不同图片格式转换
 CFbsBitmap::Create(aSizeInPixels,aDispMode);创造一张灰色位图,如EGray16
 然后利用
 CFbsBitmapDevice以及CFbsBitGc,将原图绘制上去即可

71. 修改视图标签:
 MQikViewContext* viewContext = ViewContext();

 viewContext->ChangeTextL(EContextViewText, viewContextText);

72.  侦听application焦点切换from a server process?
 RWsSession ws;
 User::LeaveIfError(ws.Connect());
 CleanupClosePushL(ws);
 RWindowGroup wg(ws);
 User::LeaveIfError(wg.Construct(reinterpret_cast<TUint>(&wg), EFalse));
 CleanupClosePushL(wg);
 wg.SetOrdinalPosition(-1); // hide the window
 groupwg.DefaultOwningWindow();
 wg.EnableReceiptOfFocus(EFalse);
 wg.EnableFocusChangeEvents(); // get ready to receive focus change events
 TRequestStatus status = KRequestPending;
 ws.EventReady(&status);
 User::WaitForRequest(status); // wait until the focus is changed
 CleanupStack::PopAndDestroy(); // wg
 TInt wgid = ws.GetFocusWindowGroup();
 CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(ws, wgid);
 TUid uid = gn->AppUid(); // the uid of the focused app
 CleanupStack::PopAndDestroy(2); // gn, ws
 if(uid==KUidCertainApp){
  // do something
 }
 
73. CQikAppUi::BaseConstructL主要执行以下流程:

 CQikAppUi::CPimpl::CPimpl(CQikAppUi &)(CPimpl * const this=0x0739e7ac, CQikAppUi & aQikAppUi={...})
 CQikAppUi::CPimpl::ConstructL(CEikonEnv &)(CPimpl * const this=0xffffffff, CEikonEnv & aEnv={...})
 SkinManager::CreateL (0D9249D2h)
 SkinManager::AddThemeChangeObserverL (0D9249D8h)
 CQikCommandManager::CreateL(MQikCommandHandler &, CEikonEnv &)

74. 第三方程序中无法使用相机快门键(EKeyCamera事件)
 #define EKeyCameraShutter       0xf883

 该键值的事件需要在window server中显式的请求:
 // Capture events from the camera shutter key (SwEvent capability required)
    iCameraKeyHandle = iCoeEnv->RootWin().CaptureKey( EKeyCameraShutter, 0, 0 );
   
    返回值iCameraKeyHandle(TInt32)可以用来取消该键捕捉请求,特别当退出程序时:
 if ( iCameraKeyHandle >= 0 )
        {
        iCoeEnv->RootWin().CancelCaptureKey( iCameraKeyHandle );
        }
   
    对焦键事件:半按下快门键将产生另一个不同的按键事件(对焦),可以通过下列scan code来检测该键的EEventKeyDown和EEventKeyUp事件:

 #define EStdKeyCameraFocus      0xe2
 
75. 显示副标题:
 ViewContext()->AddTextL(0,_L("Hello Title2!"));

76. 据说下面方法可以修改一个Application的所有视图皮肤:
 void OverrideSkinPatchL(TUid aSkinUid,
  TInt aPatchIndex,
  CWsBitmap *aSkinBitmap,
  TSkinDrawMode aSkinDrawMode,
  TMargins8 aDrawMargins);
 
->  CQikWsBitmapBackground不支持masking. 建议继承MCoeControlBackground 自画 CWsBitmap with CWindowGc::DrawBitmapMasked.
 
-> 另设置方式:
 CWsBitmap* iBkbitmap;
 CQikWsBitmapBackground* iWsbk;
  
 在View.cpp
 
 RWsSession WsSession;
 WsSession.Connect();
 iBkbitmap = new(ELeave) CWsBitmap(WsSession);
 iBkbitmap->Load(KMBFileName,bitmapidfrombitmapfile,ETrue); //load return KErrNone
 iWsbk = CQikWsBitmapBackGround::NewL(iBkbitmap ,0);
 
 绘图方法中:
 
 CWindowGc& gc;
 gc.BitBlt(leftcornerpoint,iWsbk );

->  const CSkinPatch& skin = SkinManager::SkinPatch(KSkinUidListBox, ESkinListBoxPopoutBackground, NULL);
 skin.DrawBitmap((CWindowGc&)*aGc,iOffScreenBitmap->SizeInPixels(), aRect);

77. 如何获取软件版本:
 http://wiki.forum.nokia.com/index.php/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%BD%AF%E4%BB%B6%E7%89%88%E6%9C%AC?
  ticket=ST-24289-ZQgm5ietVIvXLNbnwJIflsFChaHMzbyExd9-20
 
 1. MMP文件中增添
 LIBRARY sysutil.lib
 2. Include文件中增添
 #include <SysUtil.h>
 3. 用法:
 a. GetSWVersion()返回手机固件软件版本信息的字符串。
 
 TBuf<KSysUtilVersionTextLength> versionBuf;
 SysUtil::GetSWVersion(versionBuf);
 
 使用GetSWVersion()函数,我们看到的结果,和在拨号状态下输入*#0000#代码看到的结果是几乎一样的。例如:
 2.0618.06.05
 14-07-06
 RM-89
 (c)Nokia

 b. GetLangSWVersion()返回的软件版本是和当前手机的语言包兼容的。
 
 TBuf<KSysUtilVersionTextLength> langSwVersionBuf;
 SysUtil::GetLangSWVersion(langSwVersionBuf);范例输出:

 2.0618.06.05_v12
 14-07-06
 RM-89
 (c)Nokia
 GetLangVersion()函数将会返回当前手机安装的语言包编号。

 TBuf<KSysUtilVersionTextLength> langVersionBuf;
 SysUtil::GetLangVersion(langVersionBuf);Sample return:
 
 12

78.   立即重画:
    // Draw view on demand
    void CImageAppView::DrawBitmapNow()
 {
 CWindowGc& gc = SystemGc();
 gc.Activate(Window());
 Draw(Rect());
 gc.Deactivate();
 ControlEnv()->WsSession().Flush();
 }

    // Clear view
    void CImageAppView::Clear()
 {
 CWindowGc& gc = SystemGc();
 gc.Activate(Window());
 gc.Clear();
 gc.Deactivate();
 ControlEnv()->WsSession().Flush();
 }

79. Re: CTextView如何设置透明? - 2007-03-07, 09:03

 1. 从MFormCustomDraw派生一个类,重写它的DrawBackground()方法,在该方法中绘制背景
 图片。注意,参数aParam的iDrawRect成员指定了本次重画的区域,应该画背景位图的对应
 区域。例如:
  aParam.iGc.DrawBitmap( aParam.iDrawRect, iBitmap, aParam.iDrawRect );
 
 2. 通过CTextView的CTextLayout对象的SetCustomDraw()方法,将该MFormCustomDraw派生类
 实例指针通知iLayout对象。我是在创建CTextView之前设置了CTextLayout实例的,不知道像
 CEikRichTextEditor这种对象能不能通过其Layout()获得CTextLayout指针并设置,因为我
 发现其函数定义是
  const CTextLayout* Layout() const;
 
 你可以自己去看看MFormCustomDraw的说明,这个类还有几个方法也挺有用的。

80. 使用TBidiText绘制文本,可以在Symbian7以上使用
  const CFont *font = iEikonEnv->NormalFont();
  gc.UseFont(font);
 
  TBidiText *bidText = TBidiText::NewL(KLongText(), 50);
  CleanupStack::PushL(bidText);
  
  bidText->WrapText(Size().iWidth, *font, NULL);
  //TSize sz = bidText->MinimumSize()
  TPoint pt = aRect.iTl;
  pt.iY += font->HeightInPixels();
  bidText->DrawText(gc, pt, font->HeightInPixels());
 
  CleanupStack::PopAndDestroy(bidText);
  gc.DiscardFont();
81.
 enum TTextEmphasis
  {
  ENoEmphasis  =0x00, // 正常样式
  EPartialEmphasis =0x10, // 字体改变
  EFullEmphasis  =0x20  // 字体和背景全部改变
  };
82.    在S60管用,UIQ中不管用。
 iLabel->OverrideColorL( EColorLabelText, KRgbRed ); 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值