标题
[symbian] Symbian开发总结[zt]
clq
浏览(0) +
2008-05-31 13:39:16 发表
编辑
关键字:
Symbian开发总结 来自 http://blog.csdn.net/shushengsky/archive/2008/02/28/2130317.aspx 1. 获得控件ID。 aControl->UniqueHandle(); 2. View显示提示信息。 iEikonEnv->InfoMsg() 3. 获得焦点的控件。 4. 发送command事件的控件需要实现 MQikCommandOperator。 5. 好像可以获得任何子控件,多级。 LocateControlByUniqueHandle(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(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 inline T* AppUi() { return static_cast(CEikonEnv::Static()->AppUi()); } template inline T* Document() { return static_cast(CEikonEnv::Static()->EikAppUi()->Document()); } template inline T* Application() { return static_cast(CEikonEnv::Static()->EikAppUi()->Application()); } 用法: CMyAppUi * p = AppUi(); CMyDocument * p = Document(); CMyApplicaton * p = Application(); 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 { 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 也有此方法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(&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 3. 用法: a. GetSWVersion()返回手机固件软件版本信息的字符串。 TBuf versionBuf; SysUtil::GetSWVersion(versionBuf); 使用GetSWVersion()函数,我们看到的结果,和在拨号状态下输入*#0000#代码看到的结果是几乎一样的。例如: 2.0618.06.05 14-07-06 RM-89 (c)Nokia b. GetLangSWVersion()返回的软件版本是和当前手机的语言包兼容的。 TBuf langSwVersionBuf; SysUtil::GetLangSWVersion(langSwVersionBuf);范例输出: 2.0618.06.05_v12 14-07-06 RM-89 (c)Nokia GetLangVersion()函数将会返回当前手机安装的语言包编号。 TBuf 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 );
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.