横竖屏的判断
补充个更专业的。哈哈 if ( iEikonEnv->ScreenDevice()->CurrentScreenMode() ) //横屏 { } else //竖屏 { } |
-----------------------------------------------
获取当前屏幕大小
1
CWsScreenDevice* ws = CEikonEnv::Static()->ScreenDevice();
TSize checkSize = ws->SizeInPixels();
2
改变CBA背景
TFileName svgFile(KBitmapPath);
// User::LeaveIfError(CompleteWithAppPath(svgFile));
MAknsSkinInstance* skin = AknsUtils::SkinInstance();
CAknsItemData* item = skin->GetCachedItemData(KAknsIIDQsnBgAreaControl);
if (item == NULL)
{
item = skin->CreateUncachedItemDataL(KAknsIIDQsnBgAreaControl);
}
CAknsItemDef* def = AknsUtils::CreateBitmapItemDefL(
KAknsIIDQsnBgAreaControl, svgFile, EMbmIbookTextbackground);
skin->SetLocalItemDefL(def);
隐藏CBA中一个按钮
DoActivateL
#include "avkon.hrh" //头文件
CEikButtonGroupContainer *cba = CEikButtonGroupContainer::Current();
cba-> MakeCommandVisible(EAknSoftkeyOptions,false);
自定义CBA
// myself define cba for view1
//eikon.h
RESOURCE CBA r_container_list_cba
{
buttons =
{
CBA_BUTTON
{
id = EAknSoftkeyOptions; //while CBA's value is EAknSoftkeyOptions mune can occuer
txt = STRING_r_mult_detail_cab_right;
},
CBA_BUTTON
{
id = ELogExampleCBALeft;
txt = STRING_r_icall_exit;
}
};
}
————————————————
Menu中加入水平分隔线
RESOURCE MENU_PANE r_aknexmenu_sub_context_menu
{
items=
{
MENU_ITEM
{
command = EAknExMenuSubCtxCmd1;
txt = qtn_aknexmenu_sub_menu_ctx_cmd1;
},
MENU_ITEM
{
command = EAknExMenuSubCtxCmd2;
txt = qtn_aknexmenu_sub_menu_ctx_cmd2;
flags = EEikMenuItemSeparatorAfter;
}
};
}
____________________________
判断程序在前台运行
- // .lib
- ...
- LIBRARY ws32.lib // for RWindowGroup
- LIBRARY apgrfx.lib // for CApaWindowGroupName
- // .cpp
- ...
- #include <apgwgnam.h> // for CApaWindowGroupName
- ...
- const TUid KUidMessagingApp = {0x100058C5};
- RWsSession ws = iCoeEnv->WsSession();
- TInt wgid = ws.GetFocusWindowGroup();
- CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(ws, wgid);
- TUid uid = gn->AppUid();
- CleanupStack::PopAndDestroy(gn);
- if(uid==KUidMessagingApp)
- {
- // do something
- }
_____________
Container中调用AppUi中的函数方法
Symbian中从Container中直接访问AppUi函数的方法
这个应该是最简单的方法了
对于多View的程序(AppUi继承CAknViewAppUi):
#include
STATIC_CAST(CAppNameAppUi*,CEikonEnv::Static()->AppUi())->FunctionInAppUI();
对于单View的程序(AppUi继承CAknAppUi)
#include
STATIC_CAST(CAppNameAppUi*,CEikonEnv::Static()->AppUi())->FunctionInAppUI();
____________________________________
模拟器起不来,之前一直好好的,不知道为什么 就不行了。
最后关闭了杀软就好了。
---------------------------------------------
隐藏运行程序的右上角的小圆圈
一些程序需要一直运行,但是要要一直运行就会显示运行的小圆圈,而且还会在任务列表里面显示,隐藏这些只需要一句话:
HideApplicationFromFSW(ETrue); //加在AppUi构造的时候就可以了。 很完美
隐藏程序图标
appname_reg.rss
RESOURCE APP_REGISTRATION_INFO
{
......
hidden = KAppIsHidden;
.................
}
_______________________
屏蔽挂机键
Symbian挂机键默认的会回到主界面,我们的程序也会随之退出,这种非正常的退出使我们程序的一些信息丢失,所以虽然阻止挂机键很BT,但是有些时候也是必须的。
void C***AppUi::HandleWsEventL(const TWsEvent &aEvent, CCoeControl *aDestination)
{
switch (aEvent.Type())
{
case KAknUidValueEndKeyCloseEvent: //响应挂机键,这里处理挂机键的事件
break;
default:
CAknAppUi::HandleWsEventL(aEvent, aDestination);
}
}
————————————————————————————
读文本文件
若是UTF8文件,用ConvertToUnicodeFromUtf8L转为Unicode。
若是Unicode文件,可用TFileText来读入,参考:
http://wiki.forum.nokia.com/index.php/How_to_read_a_CSV_file
________________________________________
编辑对话框
RESOURCE DIALOG r_guictrls_data_query_text
{
flags = EGeneralQueryFlags;
buttons = r_editor_dialog_cba;
items =
{
DLG_LINE
{
type = EAknCtQuery;
id = EDialogEditorNummber;
control = AVKON_DATA_QUERY
{
layout = EDataLayout;
label = STRING_r_dialog_editor_nummber;
control = EDWIN
{
// avkon_flags = EAknEditorFlagSupressShiftMenu;
flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;
default_input_mode = EAknEditorNumericInputMode;
allowed_input_modes = EAknEditorNumericInputMode;
maxlength = 20;
};
};
}
};
}
//自定义编辑对话框的左右按键显示
RESOURCE CBA r_editor_dialog_cba
{
buttons =
{
CBA_BUTTON
{
id = EDialogCBARight;
txt = STRING_r_dialog_editor_cab_right;
},
CBA_BUTTON
{
id = EDialogCBALeft;
txt = STRING_r_dialog_left;
}
};
}
CAknTextQueryDialog* iDialog = CAknTextQueryDialog::NewL(buf);
iDialog->PrepareLC(R _GUICTRLS_DATA_QUERY_TEXT);
if (iDialog->RunLD() == EDialogCBARight) //用户选择了右键
{
iMyTelephony->DialNewCall(buf);
}
else //左键
{
}
通过一个应用程序的UID来启动
//Startup an application by UID
void StartApp( TUid aUid ) { RApaLsSession ras; User::LeaveIfError( ras.Connect() ); CleanupClosePushL( ras ); TApaAppInfo appInfo; ras.GetAppInfo( appInfo, aUid ); CApaCommandLine *cmd = CApaCommandLine::NewLC(); cmd->SetLibraryNameL( appInfo.iFullName ); cmd->SetCommandL( EApaCommandRun ); ras.StartApp( *cmd ); CleanupStack::PopAndDestroy( cmd ); CleanupStack::Pop(); ras.Close(); }
-------------------------------------------------------
模拟按键
RWsSession wsSession=CCoeEnv::Static()->WsSession();
TApaTaskList tasklist(wsSession);
TApaTask task = tasklist.FindApp(KUidPhone);
TKeyEvent key;
key.iModifiers = 0;
key.iRepeats = 0;
key.iCode = EKeyNo;
key.iScanCode = EStdKeyNo;
if(task.Exists())
{
task.SendKey(key);
}
http://www.devdiv.net/bbs/viewthread.php?tid=15073&highlight=%C4%A3%C4%E2%B0%B4%BC%FC
阻止事件
RWsSession iWsSession;
iWsSession.Connect();
TUid uid_applicationA = {uid};
TApaTask(CCoeEnv::Static()->WsSession());
TApaTaskList tasklist(iWsSession);
TApaTask task=tasklist.FindApp(uid_applicationA);
if(task.Exists())
{
task.KillTask();
}
——————————————————————
程序前后台运行
适用版本:
Series 60 2nd, Series 60 3rd
具体方案: 通过一下这段代码可以把当前程序放入后台运行。
// 首先创建一个空的TApaTask 对象
TApaTask task(iEikonEnv->WsSession( ));
// 使用当前程序的WidowGroup Id 初始化该TApaTask对象
task.SetWgId(CEikonEnv::Static()->RootWin().Identifier());
// 请求把程序放入后台
task.SendToBackground();
类似的,使用BringToForeground()能够把当前程序调到前台:
TApaTask task(iEikonEnv->WsSession( ));
task.SetWgId(CEikonEnv::Static()->RootWin().Identifier());
task. BringToForeground ();
使用这两段代码不要忘记在头文件中包含apgtask.h,同时要在mmp中加入apgrfx.lib库。
_______________________
TPtr8 iPtr;
当将其定义为类成员变量的时候初始化:
在默认的构造函数中:
iPtr((TUint8*) "", 0, 2) //2是其最大长度
在ConstructL中:
指向即可
-------------------------
Symbian中时间获取
TTime nowTime;
#ifndef __SERIES60_3X__
nowTime.HomeTime();
#else
nowTime.UniversalTime();
#endif
------------------------------
在模拟器中增加E盘
模拟器的E盘对应手机的存储卡
You probably also need to modify the following file:
/Symbian/9.1/S60_3rd/Epoc32/data/epoc.ini
Find the following place to make the changes accordingly
_EPOC_DRIVE_D /epoc32/winscw/d
_EPOC_DRIVE_E
----------------------------
用socket拦截短信不能捕获短信网关下发的短信
短信网关为了支持kjava的唤醒短信, 在短信里加了个2进制头, 设定了端口, 所以代码修改为
smsAddr.SetSmsAddrFamily(ESmsAddrApplication16BitPort);
smsAddr.SetPort(111); //kjava唤醒端口
即可.
————————————————
如何得到一个CFbsBitmap的复制?
1
CFbsBitmap *bmp=new (ELeave)CFbsBitmap();
bmp->Duplicate(iBitmap.Handle());
2
CFbsBitmap* capturedBitmap;
CFbsBitmap* copyBitmap;
copyBitmap->Create(capturedBitmap->SizeInPixels(),capturedBitmap->DisplayMode());
TRect tempRect(TPoint(0,0),capturedBitmap->SizeInPixels() );
TInt iBufLength = tempRect.Width() * tempRect.Height() * 2;
Mem::Copy(copyBitmap->DataAddress(),capturedBitmap->DataAddress(),iBufLength);
you must use LockHeap() and UnockHeap() around calls to DataAddress() since the address may change before you can copy from it. This is stated in the api.
form:http://topic.csdn.net/u/20090408/10/618e5543-a87a-40a9-805c-5d9ffde2b689.html
------------------------------------------------------------
获得HTTP相应数据长度
RHTTPResponse resp = aTransaction.Response();
RHTTPHeaders headers = resp.GetHeaderCollection();
THTTPHdrVal aHeaderValue;
RStringPool string_pool = aTransaction.Session().StringPool();
RStringF contLength = string_pool.OpenFStringL (_L8("Content-Length"));
headers.GetField (contLength, 0, aHeaderValue );
contLength.Close ( );
if (aHeaderValue.Type() == THTTPHdrVal::KTIntVal) {
return aHeaderValue.Int();//大小
}
——————————————————————————————————
//转化为中国农历的方法
TChineseDate chtDate;
TDateTime dt;
CChineseCalendarConverter* theConverter = CChineseCalendarConverter::NewL();
theConverter->DateTimeToChineseL(dt, chtDate);
-----------------------------------------------
移植s60应用程序第二版到第三版
symbianmapnavi
中文解决方案集
通讯录
http://www.cppblog.com/franksunny/archive/2009/04/14/54730.html
http://blog.csdn.net/welcome_ck/archive/2005/01/06/242686.aspx
http://www.devdiv.net/viewthread.php?tid=8860&highlight=%CD%A8%D1%B6%C2%BC
http://discussion.forum.nokia.com/forum/showthread.php?t=148623
Symbian OS应用开发学习笔记之通讯录(电话薄Contacts)
http://blog.csdn.net/lotushm/archive/2009/06/17/4276602.aspx
http://wiki.forum.nokia.com/index.php/%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%
91_S60_3rd_Edition
https://www.trustcenter.de/cs-bin/PublisherID.cgi/en/155102
-----------------------------------------------------
Symbian 中如何编程获取网络运营商时间
CRepository* rep = CRepository::NewLC(TUid::Uid(0x101f8876));
rep->Set(0x0,0x1);//后面的0x1表示开,用0x0的话表示关
CleanupStack::PopAndDestroy();
3rd上测试通过。
---------------------------
二维码
源代码可以参考:
1、libqrencode,C语言二维条形码解析库
http://megaui.net/fukuchi/works/qrencode/index.en.html
2、ZXing,一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。
http://code.google.com/p/zxing/
可以使用下面的网站在线生成qr码,支持中文。
http://qrcode.kaywa.com/
Nokia开发的Nokia Barcode Reader(Nokia_Barcode_Reader_S60_32.sis)对QR码支持的很好,在5800上运行,直接对着屏幕上的码,都能解读出来^-^
http://mobilecodes.nokia.com/scan.htm
----------------------------------------------------
3版中使用DLL时可能遇到的问题
3rd在使用DLL库的时候,DLL库也是需要加入能力的
但是要注意一点,当你的工程能力多于工程中所使用的DLL的能力的时候
会报"无法执行的安全文件 -46"的错误.
————————————————————————————
程序导致真机重启一般是什么原因??
1堆栈溢出,内存耗尽……
2 或者你把手机某个关键进程搞死了......
3 个人经验:访问空指针可能也是一种情况。虽然有的时候表现为程序直接退出。
4 一般是程序导致os panic, 在任何系统都是一样, windows就是著名的蓝屏
——————————————————————————
iCoeEnv应该是CCoeControl的成员 如果类继承了CCoeControl 才可以用
要是在非ccoecontrol中用的 CEikonEnv::Static()