您的位置:首页 > 其它

symbian 开发实践总结(技巧性比较多,很有帮助)

2010-06-01 16:57 204 查看
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 );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐