Nokia论坛技术资料Symbian解决方案-中文版(1)-转载

作者:hoolee

创建Internet连接最好的方法

说明:
建立Internet连接的最好的方法是使用Internet Connection Initiator API.
其头文件为Intconninit.h,链接库为Intconninit.lib。
下面是如何使用的示例代码,如果没有默认连接(Preferred Connection),
实际上, 你可以创建一个活动对象(active object)来控制连接的初始化过程.

Code:
CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref pref1;
CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref pref2;
//--- First preference ----
pref1.iRanking     = 1;
pref1.iDirection   = ECommDbConnectionDirectionOutgoing;
pref1.iDialogPref  = ECommDbDialogPrefDoNotPrompt;
CCommsDbConnectionPrefTableView::TCommDbIapBeare bearer1;
bearer1.iBearerSet = ECommDbBearerGPRS;
bearer1.iIapId     = 0x01; 
pref1.iBearer      = bearer1;
//---Second preference ---
pref2.iRanking    = 2;
pref2.iDirection  = ECommDbConnectionDirectionOutgoing;
pref2.iDialogPref = ECommDbDialogPrefDoNotPrompt;
CCommsDbConnectionPrefTableView::TCommDbIapBearer bearer2;
bearer2.iBearerSet = ECommDbBearerCSD;
bearer2.iIapId     = 0x04;
pref2.iBearer      = bearer2;
//---Call Initiator---
TRequestStatus status(KRequestPending);
CIntConnectionInitiator* initConn = CIntConnectionInitiator::NewL();
CleanupStack::PushL(initConn);
initConn->ConnectL(pref1, pref2, status);

热键事件和键位码

说明:
如果您的窗口组没有获得键盘焦点,您可以使用
RWindowGroup::CaptureKey() 来捕捉键盘事件。
应用程序中按键的扫描码(scan code)有着会有下面这样的
名字EStdKeyApplication0。具体可以参看60系列开发工具
中\Epoc32\Include\uikon.hrh 文件的内容。

不綺用户提示创建一个Internet连接

说明:
下面的代码演示了如何创建一个Internet连接,而不提示用户
使用哪种方法连接或者选择哪个GPRS接入点. 你需要知道你想
使用的那个Internet接入点(IAP)的标示(ID)。

Code:
RSocketServ socketServ;
RConnection connection;
User::LeaveIfError(socketServ.Connect());
User::LeaveIfError(connect.Open(socketServ));
TCommDbConnPref pref;
pref.SetIapId(4); // IAP ID for connection to be used
pref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
pref.SetDirection( ECommDbConnectionDirectionOutgoing );
connection.Start(pref);
把TBuf的内容转换为TInt(按字符串文字内容)
// 15位数字
TInt iNum1(123456789009876);
// 将缓存的内容设置为iNum1
iBuf.Num(iNum1);
// 使用iBuf包含的内容创建TLex对象
// the 15 digit number
TLex iLex(iBuf);
// iNum1
TInt iNum2;
//iNum2现在包含了15位数字
iLex.Val(iNum2);
如何在S60设备的“收藏夹”中增添一个快捷方式
说明:
在一部S60设备上,如何编程中将一个应用程序(如果我知道它的UID)的
快捷方式添加“收藏夹”中呢?这里使用到的类是CPinbLinkBase . 要设置这个
应用程序的UID, 可以使用
CPinbLinkBase::SetApplicationUidL(const TUid& aUid);
使用CAknIconArray读取资源图标供listbox所用
说明:
询问:
symbian API中提供了使用CAknIconArray读取资源图标供listbox所用的方法。
它使用了AKN_ICON_ARRAY结构,请问能否提供一段代码描述如何使用?
解答:
在资源中有如下描述:
Code:
RESOURCE AKN_ICON_ARRAY r_icon_testIcons
    {
    type = EAknIconArraySimple;
    bmpfile = "z:\SYSTEM\DATA\AVKON.MBM";
    icons =
        {
        AKN_ICON
            {
            iconId = EMbmAvkonQgn_indi_checkbox_on;
            maskId = EMbmAvkonQgn_indi_checkbox_on_mask;
            },
        AKN_ICON
            {
            IconId = EMbmAvkonQgn_indi_checkbox_off;
            maskId = EMbmAvkonQgn_indi_checkbox_off_mask;
            }
        };
    }
这里资源包括了checkboxes的缺省图标。
在编写代码时,可以使用CAknIconArray::ConstructFromResourceL()来构造图标
Code:
...
// CAknSingleGraphicStyleListBox* iListbox;    
iListbox = new(ELeave)CAknSingleGraphicStyleListBox();
iListbox->SetContainerWindowL(*this);
TResourceReader reader;
CEikonEnv::Static()->CreateResourceReaderLC(reader, R_LIST);
iListbox->ConstructFromResourceL(reader);
// Creates a GUI icon array.
CAknIconArray* icons =new(ELeave) CAknIconArray(2);
CleanupStack::PushL(icons); 
icons->ConstructFromResourceL(R_ICON_TESTICONS);
// Sets graphics as ListBox icon.
iListbox->ItemDrawer()->ColumnData()->SetIconArray(icons);
CleanupStack::Pop(); // icons
CleanupStack::PopAndDestroy(); // reader

如何在程序中启动并显示“设置”程序

说明:
按如下代码所示,可以在程序中启动“设置”程序

Code:
// Application UID for Settings Application
const TUid KSettingsUid = { 0x100058EC };       
// UID of the display view in the Settings Application
const TUid KSettListDisplViewId = { 5 }; 
AppUi()->ActivateViewL( TVwsViewId(KSettingsUid, KSettListDisplViewId));

注意这里的启动是异步的

Series60中如何动态改变按钮或关闭它们

说明:
你可以通过如下方式来改变按钮:
定义一个资源

Code:
RESOURCE CBA r_my_cba
   {   buttons =
      {
      CBA_BUTTON { id = EMyButton1; txt = "Button1"; },
      CBA_BUTTON { id = EMyButton2; txt = "Button2"; }
      };  
 }

在代码中调用SetCommandSetL()方法:
iAvkonAppUi->Cba()->SetCommandSetL(R_MY_CBA);
iAvkonAppUi->Cba()->DrawNow();
如果需要关闭按钮,可以使用系统预定义的R_AVKON_SOFTKEYS_EMPTY资源

如何监测名片夹数据库的变化

说明:
下面提供一段代码示例如何监测名片夹的变化

Code:
// Application UI owns contact observer
class CEventsAppUi : public CEikAppUi
   {
public:
   void ConstructL();
   ~CEventsAppUi();
public:
    void HandleCommandL(TInt aCommand);
private:
   CEventsAppView* iAppView; // owns
   CEventsContacts* iContactObserver;
   };

void CEventsAppUi::ConstructL()
   {
   BaseConstructL(); // Call base constructor
   iAppView = CEventsAppView::NewL(ClientRect());
   AddToStackL(iAppView);
   // Create an observer
   iContactObserver = new(ELeave) CEventsContacts(iAppView);
   iContactObserver->ConstructL();
   }

// CEventsContacts implements MContactDbObserver interface
class CEventsContacts : public CBase, public MContactDbObserver
   {
public:
   CEventsContacts(CEventsAppView* aAppView);
   void ConstructL();
   ~CEventsContacts();
   // Override the virtual function of MContactDbObserver
   void HandleDatabaseEventL(TContactDbObserverEvent aEvent);
private:
   CContactDatabase* iContactDb;
     CContactChangeNotifier* iNotifier;
     CEventsAppView* iAppView;
     };

CEventsContacts::CEventsContacts(CEventsAppView* aAppView)
:iAppView(aAppView)
   {
   }

void CEventsContacts::ConstructL()
   {
   // Open the database
   iContactDb = CContactDatabase::OpenL();
   // Register the observer
   iNotifier = CContactChangeNotifier::NewL(*iContactDb, this);
   }

CEventsContacts::~CEventsContacts()
   {   
delete iNotifier;   
delete iContactDb;  
 }

void CEventsContacts::HandleDatabaseEventL(TContactDbObserverEvent
aEvent)
   {
   // The changed item
   TContactItemId contactItem = aEvent.iContactId;
   switch (aEvent.iType)
      {   
   case EContactDbObserverEventContactChanged:
      // Handle contact changed event
      break;
   case EContactDbObserverEventContactDeleted:
      // Handle contact deleted event
      break;
   ...
   default:
      break;
      }
   }


  如何自定义询问对话框的按钮

说明:
自定义按钮需要先构造资源文件,如下:
[code]
RESOURCE CBA r_my_softkey
{
buttons =
{
CBA_BUTTON
{
id = EAknSoftkeyMaybe;
txt = "Maybe"; // Texts can be defined in .loc file(s)
// to support language localization
},
CBA_BUTTON
{
id = EAknSoftkeyWhy;
txt = "Why?";
}
};
}
[code]
然后取代询问对话框的默认按纽:

Code:
RESOURCE DIALOG r_myconfirmation_query
    {
    flags = EGeneralQueryFlags;
    buttons = r_my_softkey; // note that own softkey is
                            // used as lowercase
    items =
        {
        DLG_LINE
            {
            type = EAknCtQuery;
            id = EGeneralQuery;
            control = AVKON_CONFIRMATION_QUERY;
            },
        ...
        }

询问对话框的处理和其他对话框一样,可以通过OkToExit()来处理按键:

Code:
// class CMyAknQueryDialog: public CAknQueryDialog, ...
#include <eikenv.h>
TBool CMyAknQueryDialog::OkToExitL(TInt aButtonId)
    {
    if (aButtonId == EAknSoftkeyMaybe)
        // Handle “Maybe” key press
    else if (aButtonId == EAknSoftkeyWhy)
        // Handle “Why” key press
    return ETrue;
    }
如何读取GIF图像中的一桢(动籣GIF文件)
说明:下面的代码演示
了如何通过修改Bmpmanip例子,来完成从GIF图像文件中读取指定桢的功能。
Series 60 SDK中的CBmpmanipAppView例子(在\Series60Ex\bmpmanip\src\bmpmanipappview.cpp)
并按照如下代码进行修改:
Code:
TFrameInfo frameInfo;

// 从GIF图像文件中找到指定桢

// 将其定义到gifFrameIndex 

// 获取桢信息

iConverter->FrameInfo(gifFrameIndex, frameInfo);

// 从GIF的大小中创建位图

TInt err = iBitmap->Create(frameInfo.iOverallSizeInPixels,                           

KDeviceColourDepth);

if (err == KErrCouldNotConnect)

    {

     // 处理错误

    }

// 把一个GIF桢转换为位图

TRAPD(convertErr, iConverter->ConvertL(*iBitmap, gifFrameIndex));
怎样检测还有多少可用内存
说明:
下面的代码可以得到可用内存的数量。
Code:
TMemoryInfoV1Buf info;

UserHal::MemoryInfo(info);

TInt freeMemory = info().iFreeRamInBytes;
如何通过C++编程获取60系列设备中软件的Build版本
说明:
一个基于60系列的手持设备的软件版本的Build,可以通过
使用SysUtil::GetSWVersion() 类来获取:
Code:
TBuf<64> swBuf;SysUtil::GetSWVersion(swBuf);

 怎样获取可用的堆内存(heap memory)数量

 说明:
获取可用堆内存的数量,请参考SDK Help中的User::Available()
和RHeap::Available()两个函数。
如何在程序中启动记事本及图片浏览程序

说明:
我们可以通过下列方式在程序中启动记事本及图片浏览程序

Code:
void TTestEmbedApp::EmbedLaunchFileL(const TDesC& aFile)
{
    // iDocHandler is a CDocumentHandler pointer
    if( !iDocHandler)
        {
        iDocHandler = CDocumentHandler::NewL((CEikProcess*)iEikonEnv->Process());
        }
    TDataType empty;
    iDocHandler->OpenFileEmbeddedL(aFile, empty);
}

程序将根据文件类型启动相应的系统程序(记事本或图片浏览器),如果aFile为txt文件
则记事本将启动,并显示这个文件。
如果aFile是jpg文件,则图片浏览器将启动,并显示这张图片。
这里需要用到下列库:
LIBRARYcommonui.lib // Documenthandler
LIBRARYapmime.lib // TDataType

需要包含下列头文件:
#include <DocumentHandler.h>
#include <apmstd.h> // TDataType

如何构造一个能接收多位数字的输入框

说明:
详细描述

我想向用户提供一个输入框,用户可以输入15位数字。我现在使用
CAknTextQueryDialog,因为CAknNumberQueryDialog虽然能接收数字输入,但不能满足我的位数要求。
如果使用CAknTextQueryDialog虽然可以输入足够15位字符,但很难保证用户输入的就是数字。
请问有没有方法提供一个能接收多位数字的输入框?
解决方案
可以通过指定Edwin editor的flags标记来限定用户的输入,输入对话框的资源看起来如下:

Code:
DLG_LINE
{
type=EEikCtEdwin;
id=EMyQuery;

    control=EDWIN { maxlength=15; };
}
...
void CTestDlgDialog::PrepareLC(TInt aResourceId)
{
CEikDialog::PrepareLC( aResourceId );
// Dialog base class can be CAknDialog    

//CAknDialog::PrepareLC( aResourceId );
// Pick up the Editor control from the dialog 
CEikEdwin* control = static_cast<CEikEdwin*>(ControlOrNull(EMyQuery));
// Set the input mode
control->SetAknEditorInputMode(EAknEditorNumericInputMode);
// Restrict the other input modes
control->SetAknEditorAllowedInputModes(EAknEditorNumericInputMode);
}

上面的示例提供给用户一个可以输入足够位数数字的对话框。
但是它也允许用户输入"*#pw+"这样的字符——通过使用"*"或
"#"键,我们可以监控用户的按键输入来避免用户输入这些字符。
还可以显示一个警告框提示用户的非法输入。
在应用程序中内置一个摄像头的视图
说明:
详细描述

我怎样可以像我的程序中添加一个内置式的
摄像头的视图(view)呢?比如在'信息'程序
中,选项->添加->新图象,这样的功能。
概况
下面的代码演示了如何在一个应用程序中内
置一个摄像头程序。包括启动摄像头的函数,
MApaEmbeddedDocObserver::NotifyExit()
这一函数也要对其进行实现,以便用户退出
时做出响应。
解决方案

Code:
void MyApplication::NewImage()

   {

   const TUid KUidCamera    = { 0x1000593F };

   RApaLsSession apaLs;

   TApaAppInfo   appInfo;

   CApaDocument* doc = NULL;

   CEikProcess*  process = CEikonEnv::Static()->Process();

   User::LeaveIfError(apaLs.Connect());

   CleanupClosePushL(apaLs);

   User::LeaveIfError(apaLs.GetAppInfo(appInfo, KUidCamera));

   doc = process->AddNewDocumentL(appInfo.iCaption, KUidCamera);

   CleanupStack::PopAndDestroy(); // apaLs

   TApaDocCleanupItem cleanup(process, doc);

   CleanupStack::PushL(cleanup);

   doc->NewDocumentL();

   CleanupStack::Pop(); // cleanup

   doc->EditL(this, ETrue);

   }

void MyApplication::NotifyExit(TExitMode aMode)

   {

   // camera view has been closed

   }

怎样检测笔型键("ABC"key)

说明:
详细描述

笔型键("ABC"key)的TKeyEvent.iCode值和iScanCode
的值分别是什么?
解决方案
在60系列手持设备上,笔型键被影射为上档修饰(Shift
Modifier)键。下面的代码演示和如何可以检测他:

Code:
 TKeyResponse CMyClass::OfferKeyEventL(...)

    {

    TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift);

    ...

    }

他的键盘码和扫描码(keycode and scancode)取决于按
下SHIFT键的同时还按下了另外哪个键。下面的代码演示
了一个列表框的OfferKeyEventL()函数如何检测
SHIFT+OK组和键,这个组和键被用来标记列表框成员。

Code:
TKeyResponse CMyBusinessClass::OfferKeyEventL(...)

    {

    TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift);

    if (shiftKeyPressed && aKeyEvent.iCode==EKeyOK)

        DoSomething();

    ... 

    }

我怎样可以获取一个视图(view)中控件(container)的指针

说明:
你可以通过下面的方法来获取一个视图(view)中控件(container)的指针:

Code:
CAknView* view = iAvkonViewAppUi->View(myViewUid);

怎么才能隐藏菜单中的图标

说明:
在AIF资源文件中(.rss)中使用KAppIsHidden标记

Code:
RESOURCE AIF_DATA
    {
    app_uid=...;
    num_icons=2;
    embeddability=KAppNotEmbeddable;
    newfile=KAppDoesNotSupportNewFile;'
    hidden=KAppIsHidden;
    }

如何不让程序显示在任务列表中

说明:
描述:
一个应用程序可以被设为电话程序级别,这样就不会响应关闭程序事件了。
如果要这样做,我们需要调用CEikonEnv::SetSystem(ETrue)。
而另一个相似的函数为CEikonEnv::SetBusy(),它的不同之处在于在关闭时会
显示一个确认对话框,在用户确认之前是不会关闭该程序的。这主要用
于重要任务不能被中断时。
解决方案:
下面的代码展示了如何将程序从任务列表中隐去。

Code:
TInt wgId = iEikonEnv->RootWin().Identifier();
RWsSession session = iEikonEnv->WsSession();
CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC(session, wgId);
wgName->SetHidden(ETrue);
wgName->SetWindowGroupName(iEikonEnv->RootWin());
CleanupStack::PopAndDestroy(); // wgName

结论:
第三方程序切记不要使用隐藏或系统级别处理。除非这样做是十分必须和必要的。
对用户来说,总应该可以看到自己手机上正在运行的程序,并予于关闭、释放内存。

如何隐去等待对话框中的齿轮图标
说明:
详细描述
在等待对话框中我们一般都会看到一个齿轮动籣图标,你也可以定义你自己的图标来取代它。参考SDK中的note例子就可以了解。
在avkon.mbg中有很多图标的id,如EMbmAvkonQgn_note_empty和EMbmAvkonQgn_note_empty_mask,怎么使用它们才能显示一个空白图标呢?
下面的资源示例展示了如何构造一个空白图标的等待对话框:

Code:
RESOURCE DIALOG r_aknexnote_wait_note_softkey_cancel
 {
 flags = EAknWaitNoteFlags;
 buttons = R_AVKON_SOFTKEYS_CANCEL;
 items =
     {
     DLG_LINE
         {
         type = EAknCtNote;
         id = EAknExNoteCtrlIdWaitNote;
         control= AVKON_NOTE
             {
             layout = EWaitLayout;
             singular_label = qtn_aknexnote_wait_prompt;
                            
             imagefile = AVKON_BMPFILE_NAME;
             imageid = EMbmAvkonQgn_note_empty;
             imagemask = EMbmAvkonQgn_note_empty_mask;

                animation = R_QGN_GRAF_WAIT_BAR_ANIM;
             };
         }
     };
 }

如何在程序中启动安装程序卸载某应用

说明:
下列代码展示了如何在程序中启动安装程序卸载某应用,在“c:\system\install\”下有相应程序.SIS文件,它包含了程序安装的信息。我们要进行的卸载操作就是要将.PKG中所有生成的文件都删除干净,以及c:\system\install\目录下相关的.SIS文件。

Code:
#include <apacmdln.h>
#include <eikdll.h>
#include <instapp.h>

CApaCommandLine* cmdLine;
cmdLine=CApaCommandLine::NewLC();
cmdLine->SetLibraryNameL(
    _L("z:\\System\\apps\\instapp\\instapp.app"));
cmdLine->SetDocumentNameL(
    _L("c:\\system\\install\\MyApplication.sis"));
cmdLine->SetCommandL(EApaCommandRun);
cmdLine->SetTailEndL(KUninstallCommandLineTail);
EikDll::StartAppL(*cmdLine);
CleanupStack::PopAndDestroy(); // cmdLine
在一部60系列设备上,
我怎样可以在使用摄像头拍照的时候添加一个快门的
声音呢?
说明:
使用CAknKeySoundSystem类将会在摄像头捕捉籣面的
时候播放声音方面是一个很有效的方法。下面的代码
演示了如何在你的应用程序中实现这个特性:
Code:
// myapp.h

#include <aknsoundsystem.h>

const TInt KSnapSoundId = 2;

class MyClass

  {

  ...

private:

  CAknKeySoundSystem* iCameraSound;

  };

void MyClass::ConstructL()

  {

  ...

  iCameraSound =

   static_cast<CAknAppUi*>(CEikonEnv::Static()->AppUi())->KeySounds();

    if (iCameraSound)

        {

        TRAPD(error, iCameraSound->AddAppSoundInfoListL(

              R_CAMERA_SNAP_SOUND));

        if ((error != KErrAlreadyExists) && (error != KErrNone))

            {

            User::LeaveIfError(error);

            }

        }

  }

void MyClass::PlaySnapSound()

  {

  iCameraSound->PlaySound(KSnapSoundId);

  }
在你的.RSS资源文件中添加下面的代码
Code:
#define KcameraSoundFile

    "Z:\\system\\sounds\\digital\\Camera1a_2_8kHz.wav"

#define KSnapSoundId 2

RESOURCE AVKON_SOUND_INFO_LIST r_camera_snap_sound

    {

    list =

         {

        AVKON_SOUND_INFO

           {

            sid = KSnapSoundId;

            priority = 45;

            preference = EAknAudioPrefCamera; // defined in avkon.hrh

            file = KCameraSoundFile;

            }

        };

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值