Posts filed under 'Symbian代码研究'

按下红色结束通话键,程序仍然运行

在Symbian S60第三版中,按下红色的结束通话键,程序默认退出,当还想保持程序继续运行状态,可以在AppUi的HandleWsEventL函数中进行处理,以下代码来自ScreenShot。
// ————————————————————————–
// Starting from S60 3.x, pressing End key will terminate application.
// We don’t want this to happen in this application, so we have to handle
// End key event (KAknUidValueEndKeyCloseEvent).
// ————————————————————————–
void CXXXAppUi::HandleWsEventL(const TWsEvent &aEvent, CCoeControl *aDestination)
    {
    switch (aEvent.Type())
        {
        case KAknUidValueEndKeyCloseEvent:
            break;

        default:
            CAknAppUi::HandleWsEventL(aEvent, aDestination);
        }
    }

Popularity: 21% [?]

Add comment 01月 3rd, 2008

如何使后台运行的程序获取按键事件

基本思路:

首先程序运行时注册按键事件,然后将程序转入后台运行,当按键事件发生后在AppUi的HandleKeyEventL中处理。

相关代码如下:

void CClockSSAppUi::SetCaptureKey()
 {
    // If there is another handle, we have to cancel it first.
    CancelCaptureKey();
    // This will capture scan code of the keypress.
    iHandleCaptureKey = CCoeEnv::Static()-> RootWin().CaptureKeyUpAndDowns(
      KOkKeyScanCode, EModifierShift, EModifierShift PRIORITYCAPTUREKEY);
       
    //// WARNING: We need to capture the normal code of keypress otherwise
    // the key event will be sent to another application.
    iHandleCaptureKey2 = CCoeEnv::Static()-> RootWin().CaptureKey(
      KOkKeyCode, EModifierShift, EModifierShift PRIORITYCAPTUREKEY);
 }

TKeyResponse CClockSSAppUi::HandleKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
 {
 if ((KOkKeyScanCode == (TUint) aKeyEvent.iScanCode) && (EEventKeyDown == aType)
          && ((aKeyEvent.iModifiers & EModifierShift) == EModifierShift) )
          {
          CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
          globalNote->ShowNoteL(EAknGlobalInformationNote, _L(”Captured KEY!”));
          CleanupStack::PopAndDestroy();
          }
 }

 需要注意的是:如果你的是多view程序,并且调用了AppUi::AddToStackL接收按键事件,那么在这些控件OfferKeyEventL的处理中对于不相关的键事件一定要返回EKeyWasNotConsumed,好让AppUi最后能处理。

因为这个问题,研究了近3个小时,sigh。。。

Popularity: 8% [?]

1 comment 09月 22nd, 2007

如何将程序送到后台运行

比如说,当按下back后,在HandleCommandL()中加入如下处理:
case EAknSoftkeyBack:
            {
            TApaTask apaTask(iEikonEnv->WsSession());
            apaTask.SetWgId(CCoeEnv::Static()->RootWin().Identifier());
            apaTask.SendToBackground();
            break;
            }

解释一下:
A task is a running application.
A task is identified by its association with the running application’s window group.
apaTask把自己送到后台,并在后台继续运行。

Popularity: 6% [?]

1 comment 09月 20th, 2007

ScreenShot源代码研究–跨平台

如何写一个Symbian平台的应用,如S60第一二版,S60第三版,UIQ,这是一个框架方面的东西。

下面的代码在symbianvariant.h文件中,是用来跨S60和UIQ平台的

#define __S60__ 300

// #define __UIQ__ 210

这个东西是用来定义SDK的版本的,因为有些资源或其他的东西各SDK还是有差别的,所以代码中用这个宏来确定编译时所需要的资源。

如下面的资源定义:

#if (__S60__ < 300)
  
 items =
  {
  AVKON_SETTING_ITEM
            {
            identifier = EBencoolenDlgLocation;
            setting_page_resource = r_bencoolen_binary_location_page;
            associated_resource = r_bencoolen_binary_location_resource;
            name = string_bencoolen_dialog_location;
            }
  };
  
#else
  
 items =
  {
        AVKON_SETTING_ITEM
            {
            identifier = EBencoolenDlgLocation;
            setting_page_resource = r_bencoolen_memory_selection_dialog;
            name = string_bencoolen_dialog_location;
            }
        };
       
#endif

 由于S60和UIQ 的Application,Document和UI是从不同基类继承的。

这么一定义,所有的都能用CSymbianXXX来定义了!但是View是没有办法的,只能写各自不同的文件

#ifdef __S60__

#define CSymbianApplication CAknApplication
#define CSymbianDocument CAknDocument
#define CSymbianAppUi  CAknAppUi

#else

#define CSymbianApplication CQikApplication
#define CSymbianDocument CQikDocument
#define CSymbianAppUi  CQikAppUi

#endif

在mmp文件中:第一部分是S60和UIQ平台公用的,代码在src目录下;

第二部分是所有S60平台专用的,代码在s60目录下。

UIQ第二部分的代码在uiq目录下。

SOURCEPATH           ..\..\src
SOURCE               BencoolenApp.cpp
SOURCE               BencoolenAppui.cpp
SOURCE               BencoolenDocument.cpp
SOURCE               BencoolenAppContainer.cpp
SOURCE               ScreenShot.cpp
SOURCE               ScreenShotData.cpp

SOURCEPATH           ..\..\src\s60
SOURCE               BencoolenAppView.cpp
SOURCE               BencoolenSettingsView.cpp
SOURCE               BencoolenSettingsListBox.cpp
SOURCE               BencoolenAboutDlg.cpp

Popularity: 6% [?]

Add comment 09月 20th, 2007

ScreenShot源代码研究

ScreenShot是一个非常不错的开源软件。研究它可以学到哪些东西呢?

1,如何写一个Symbian平台的应用,如S60第一二版,S60第三版,UIQ,这是一个框架方面的东西。

2,具体技术细节上: 

    如何将程序隐藏到后台执行,同时还能捕获按键事件

    如何捕获两个键同时按下。

    按下红色结束通话键,程序仍然运行(Symbian9默认关闭程序)。

    如何提供选项给用户设置,并保存到ini文件中。

    程序结构和编码风格。

3,SymbianSign和程序健壮性方面的技巧,这个软件通过了symbian freeware signing!

4,其他肯定还有很多值得学习的地方,边看边写。

Popularity: 6% [?]

Add comment 09月 20th, 2007


标签

Calendar

08月 2008
« Jul    
 123
45678910
11121314151617
18192021222324
25262728293031

Posts by Month

Posts by Category