Memo

来源:互联网 发布:股指期货数据接口 编辑:程序博客网 时间:2024/04/29 12:24

横竖屏的判断

 

补充个更专业的。哈哈
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;
            }
        };
    } 

____________________________

判断程序在前台运行

 

  1. //  .lib
  2. ...
  3. LIBRARY                        ws32.lib        // for RWindowGroup
  4. LIBRARY                        apgrfx.lib        // for CApaWindowGroupName
  5. // .cpp
  6. ...
  7. #include <apgwgnam.h>        // for CApaWindowGroupName
  8. ...
  9. const TUid KUidMessagingApp = {0x100058C5};
  10. RWsSession ws = iCoeEnv->WsSession();
  11. TInt wgid = ws.GetFocusWindowGroup();
  12. CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(ws, wgid);
  13. TUid uid = gn->AppUid();
  14. CleanupStack::PopAndDestroy(gn);
  15. if(uid==KUidMessagingApp)
  16.         {
  17.         // do something
  18.         }

 

_____________

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 UIDvoid 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 isstated 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()

 

 

 

原创粉丝点击