天天看点

symbian开发应用总结

1.

illegal use of incomplete struct/union/class ,这个错误忘记包含.h这个头文件

2.

不能将一个局部变量的指针作为返回值!

3.

HBUFC 中改变数据

在不知道一个HBufC的长度时,可以用

HBufC* ihbuf = HBufC::NewL(0);

当你可以定义ihbuf 的长度的时候利用

ihbuf  = ihbuf ->ReAllocL(length);

ReAllocL做了三个工作:

在内存中创建一个新的基于堆描述符

将新的堆描述符的内容复制到旧的堆描述符

删除旧的堆描述

4

有关CTimer的用法

CTimer的继续类必须把自己添加到AS中。而且CTimer必须继承才能使用,因为它并没有实现CActive::RunL()这个纯虚函数。  

在使用CTimer中时,如果继承子类在启动定时时(如CTimer::After(TTimeIntervalMicroSeconds32 )),必须得先调用CTimer的中CTimer::ConstructL

(),方法(此方法应该是对RTimer的一些初始化),再有就是如果CTimer::After(TTimeIntervalMicroSeconds32 aWaitTime)),的aWaitTime时间比较长,

则在析构函数里不应该调用CActive::Cancel(),否则,当程序切断退出时,返回手机应用程序界面时就比较慢(相当于aWaitTime的等待时间)

5

C类一般无法实现简单拷贝,所以CBase把拷贝构造和赋值操作符都定义为私有的。

只能通过指针引用完成,例如

Ctest* a = new Ctest;

Ctest& b = *a;

上面是引用,底层上也是通过指针实现的,所以并不会调用类的拷贝构造函数. 

6

TPtr类型的成员变量无法在构造函数中赋值的问题

当一个类中有一个Public的TPtr类型成员变量时,因为TPtr没有一个默认构造函数,所以无法在构造函数中为其赋值。

可以通过如下方式完成

A::A()

:iTPtr(0,0)

{

iTptr.Append(_L("Test"));

}

 7

Painc WSERV 14

Printing with no active font.

一般是调用DrawText();时未设置字体

8

要让真机显示错误码,得安装panic_code_enabler_3.0,模拟器要显示错误码,在运行模拟器后preferences---C++ debug----Extended panic code

file

9

Symbian DLL,Lib(动态库静态库)

动态库的操作能力必须与加载它的exe/dll能力匹配,匹配原则为。exe/dll能力一定是被它加载的dll能力的子集

lib 静态链接库,顾名思义,静态加载的,在程序link的时候就要加载进程序。在程序link的时候,会将对应的lib加载到程序中来,说明白一点,就

是将lib中的代码对应加载到程序中来。加载完了,lib就没事了因为这个时候lib中代码就拷贝到了你的程序中。你也可以试试,当你写一个lib时,

的方法体没有,和方法体很大的时候,所生成的可执行文件大小是不一样的。

dll 动态链接库,又分为多态接口DLL和共享DLL

前面说到了,静态链接库在link的时候加载,如果你的程序很多地方用到了lib

Symbian中调用dll或者lib,只需将lib加入到mmp中,dll中Engine  .h文件添加到inc下。

10

进度条对话框中2rd三版的区别

control = AVKON_NOTE

{

layout = EWaitLayout;

singular_label = qtn_registering;

imagefile = "z://system/data/avkon.mbm";

imageid = EMbmAvkonQgn_note_progress;

imagemask = EMbmAvkonQgn_note_progress_mask;

animation = R_QGN_GRAF_WAIT_BAR_ANIM;

};

这是在2rd里面的一个WAIT NOTE资源,在3rd里面 imagefile = "z://system/data/avkon.mbm";这个路径就是无效的,修改成

imagefile = "";

 同时添加头文件 #include <avkon.mbg>//for EMbmAvkonQgn_note_progress_mask 就可以了

11

容器中实现控件

容器中实现控件要实现两个基类的函数,否则控件将不会显示

TInt CountComponentControls() const;

CCoeControl *ComponentControl(TInt aIndex) const;

12

 CPeriodic 的问题

CPeriodic::Start(TTimeIntervalMicroSeconds32 aDelay, TTimeIntervalMicroSeconds32 anInterval, TCallBack aCallBack);

aDelay是计时器开始第一次回调的时间,aInterval是每次执行回调函数的间隔, 回调函数当然要尽快返回.

如果回调函数执行时间超过anInterval,回调函数并不会被打断,而是等回调函数执行完后再执行。

13.

Container类的使用

Container类从CcoeControl派生而来,CcoeControl是所有控件的基类。

在自己的容器类中必须实现从CcoeControl中的四个方法,框架将调用所有这些方法:

SizeChanged()允许控件响应控件大小的改变

Draw()绘制控件

CountComponentControls()返回控件拥有的控件数量

ComponentControl()对于容器拥有的每一个控件,框架调用该方法获取。

14

基于对话框的架构

因为对话框是无模式的,ExecuteLD()将在调用后立刻返回。必须使用AddToStackL()将对话框添加到控件栈中,因为无模式的对话框无法自己完

成这项工作。还有,必须在AppUi的析构函数中销毁该对话框。

RemoveFromStack(iAppDialog);

delete iAppDialog;

15

  获得继承自CaknAppUi的UI指针:

 CEikonEnv::Static()->EikAppUi()

或者CYourAppUi* appUi = (CYourAppUi*)AppUi();

 获得继承自CAknViewAppUi派生的UI类,则可以通过如下方式获得一个指向它的指针。

// ESomeViewId is the view enumeration id value in your application .hrh file.

CSomeView* view = (CSomeView*)View(TUid::Uid(ESomeViewId));

也可以从另一个view中获得某个view的指针:

CSomeView* view = (CSomeView*)AppUi()->View(TUid::Uid(ESomeViewId));

通过CCoeControl类中的iEikonEnv获得指针的方法如下:

CYourApplicationAppUi* appui = (static_cast<CYourApplicationAppUi*>(iEikonEnv->AppUi()));

CSomeView* view = (CSomeView*)appui->View(TUid::Uid(ESomeViewId));

CAknViewAppUi和你程序运行周期一样长,因此在它这里存储引擎类(作为类成员)是很好的习惯。可以按照如下方式获得你引擎的指针:

CYourApplicationAppUi* appui = (CYourApplicationAppUi*)AppUi();

CYourAppEngine* engine = appui->Engine();

16

能力!

当模拟器可以,真机不行的时候第一反应就是能力的问题!-----------血泪的教训啊!!!!!!!!

模拟器中打开能力检测的方法

sdk->tools->preference->Platform Security

Performcapability checks  前打上勾

17

将TPtr绑定到HBufC上

HBufC* hbuf = HBufC::NewLC(KMaxSize);

TPtr ptr = hbuf->Des();

foo(ptr);

复制到TBuf8中

TBuf8<KMaxSize> buf;

buf.Copy(*hbuf);

18

设置Label中字体颜色与系统背景颜色一致

首先获取当前皮肤

获取皮肤:

MAknsSkinInstance* skin = AknsUtils::SkinInstance();

然后获取当前皮肤的字体颜色

TInt AknsUtils::GetCachedColor  (  MAknsSkinInstance *  aInstance,  TRgb &  aRgb,  const TAknsItemID &  aID,  const TInt  aIndex )

最后按皮肤颜色设置label颜色

19

实现程序自动退出

在控制台下完成CActiveScheduler::Stop()实现退出

在UI框架下CEikAppUi::Exit()实现退出

另外还有一个User::Exit(0);退出,但是一般不建议使用,因为User::Exit(0)仅仅结束当前进程/线程而没有调用程序析构函数。

20

模拟红色挂机退出键

TRawEvent lEventDown;

lEventDown.Set(TRawEvent::EKeyDown, EStdKeyNo);

UserSvr::AddEvent(lEventDown);

User::After(100000);

TRawEvent lEventUp;

lEventUp.Set(TRawEvent::EKeyUp, EStdKeyNo);

UserSvr::AddEvent(lEventUp);

21

CCoeEnv的补充

CCoeEnv派生自CEikonEnv属于UI框架中的CONE部分,

并且在TInt E32Main(){return EikStart::RunApplication( NewApplication ); }开始构建。

它封装了应用程序与窗口服务器的会话,同时也提供了控制图形状态和其他系统交互的工具。

框架为每个应用程序创建一个CCoeEnv的singleton对象。

因此在应用程序框架创建部分都创建完毕后的任何地方都可以使用CCoeEnv

22

-4608错误

-4608 KErrGsmSMSInvalidMandatoryInformation Error in message content.

此错误主要是由于第二版API使用于第三版不兼容造成的,因为S60第三版中出于平台安全的考虑,所有信息设置已经被转移到Central Repository数

据存储中。这样的转变导致老的SMS设置API(如CSmsSettings存储和输出函数)无法使用,当需要在S60第三版上发送一个短信时再使用它们会引发

KErrGsmSMSUnspecifiedProtocol和KErrGsmSMSInvalidMandatoryInformation错误。(hoolee翻译)

解决方法参考http://wiki.forum.nokia.com/index.php/KIS000379_-_New_API_to_access_SMS_settings_in_S60_3rd_Edition

23

成员变量于局部变量

注意Symbian中有些类参数需要如果会出现莫名其妙的错误的话,将参数类型有局部变量改为类成员变量试试。

24

nokia手机不支持FrameBufferReady中bitmap的捕获

解决方法是通过ViewFinderFrameReady获得bitmap或者FrameBufferReady中aFrameBuffer.DataL(i)获得YUV420数据做rgb图像转换后显示。

25

TDesC8转unsigned char

TDesC8* data = NULL;

TUint8* frame = const_cast<TUint8*>(data->Ptr());

26

Avoiding Hard-coded Paths

There are many considerations when writing portable code. One thing is to avoid hard coding, especially with file paths. PathInfo

has been available since S60 2nd Edition, and it should be used to get the paths for storing different media file types (audio and

video clips, installation files, etc.), as well as root paths for phone memory and a memory card. For example, PathInfo provides

static functions like MemoryCardRootPath() and PhoneMemoryRootPath(), which should be used instead of hard coding the drive letter

(in these cases "C:" or "E:").

27

bitmap浅拷贝

bitmap浅拷贝通过原有位图句柄复制创建新位图。iBitmapSave->Duplicate( aBitmap->Handle() );

该函数并不是创建一个原有位图的副本,只是将字体位图服务器中原有位图的句柄赋给所要创建的位图对象。

若原有位图存储在ROM中,则仅仅是赋给所创键位图一个对原有位图的指针。

bitmap内存拷贝

通过Scrbitmap->DataAddress地址copy获得 Mem::Copy(addr,DstBitmap,byteSize);

28

获取jpg图像设置成里listbox图标

首先使用CImageDecoder将jpg转换为bmp,

然后使用CBitmapScaler获取设置适当尺寸,

最后通过CGulIcon设置listbox图标。

29

程序中隐藏或更改命令按钮(CBA)

首先获得CBA  CEikButtonGroupContainer *cba = CEikButtonGroupContainer::Current(); 或者

CEikButtonGroupContainer *cba = CEikonEnv::Static()->AppUiFactory()->MenuBar()->Cba();

if (cba->IsCommandVisible())

{

cba->MakeCommandVisible(EAknSoftkeyExit,false);  //隐藏选项

cba->SetCommandL (EAknSoftkeyOptions , _L("我的选项"));//改变文字

cba->SetCommandL(TInt aCommandId, const CFbsBitmap& aBitmap, const CFbsBitmap& aMask);//或者改成图片

}

当然也可以通过资源实现更改或隐藏

RESOURCE CBA r_softkeys_options_query

    {

    buttons =

        {

        CBA_BUTTON

            {

            id = EAknSoftkeyOptions;

            txt = qtn_cba_options;

            },

        CBA_BUTTON

            {

            id = ECmdTrans;

            txt = qtn_cmd_trans;

            }

        };

    }

RESOURCE AVKON_VIEW r_my_view1

{

    hotkeys=r_my_hotkeys;

    menubar=r_my_menubar_main;

    cba=r_softkeys_options_query;

}

30

利用Ui框架获得全局框架变量

1)

获得指针

CxxSettings* CxxSettings::Static() {

 CxxAppUi* appUi = static_cast<CxxAppUi*>(CEikonEnv::Static()->AppUi());

 if (!appUi)

  return NULL;

 return appUi->Engine()->Settings();

 }

CMovinoSettings* CMovinoEngine::Settings() {

 return iSettings;

}

获得数据

iValue = CxxEngine::Static()->GetTitle();

const TDesC& CxxEngine::GetTitle() const {

 return iTitle;

}

31

3rd版中提供的CTelephony类是一个功能强大的类

CTelephony既可以获取电话和网络信息也能获取呼叫控制功能

例如 IMSI imei 电池或信号强度 用户识别 网络名字 cellid 飞行模式

来电号码 来电监听 挂断电话 等

具体事例和应用参考wiki和sdk

http://wiki.forum.nokia.com/index.php/Usage_of_CTelephony

32

S60第三版机器有一个API可用来检查当前电话是否支持WCDMA

#include <featdiscovery.h>  //featdiscovery.lib

#include <featureinfo.h>

TBool isSupported = CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdProtocolWcdma);

 if (isSupported)

 {

 }

33

在nokia froum提供的S60_Platform_2D_Game_Engine_Example例子中,

通过将整个窗口备份到一张bitmap上后,

CreateBackedUpWindowL( CCoeEnv::Static()->RootWin() );

BackedUpWindow().MaintainBackup();

TInt wh = BackedUpWindow().BitmapHandle();

iBitmap.Duplicate( wh );

然后对bitmap内存地址操作显示图像而实现图像显示的加速

TRAPD(err, iBmScreen = CBitmap::NewL( (TUint16*)iBitmap.DataAddress(),

  iBitmap.SizeInPixels(), iBitmap.DisplayMode() ));

34

利用应用UID调用应用程序

http://wiki.forum.nokia.com/index.php/%E5%88%A9%E7%94%A8%E5%BA%94%E7%94%A8UID%E8%B0%83%E7%94%A8%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F

一.使用CCoeAppUi::ActivateViewL方法

例如:

const TUid KApplicationUid = { 0x101f857A };       //应用UID(相机)

const TUid KApplicationViewId = { 1 };             //视图ID

CCoeAppUi::ActivateViewL(TVwsViewId(KApplicationUid, KApplicationViewId));

便可以激活相机程序。

二.使用TApaTask类

第一种方法虽简单,但一般只在CCoeAppUi派生类中起作用,且无法带参数运行程序,所以我们会时常使用另一种方法:

HBufC* parameter = HBufC::NewLC( 20 );

parameter->Des().Copy( _L( "4 wap.monternet.com/" ) );

TInt KApplicationUid = 0x10008D39;

TUid id( TUid::Uid( KApplicationUid ) );

TApaTaskList taskList( CEikonEnv::Static()->WsSession() );

TApaTask task = taskList.FindApp( id );

if ( task.Exists() )

{

HBufC8* parameter8 = HBufC8::NewLC( parameter->Length() );

parameter8->Des().Append( *parameter );

task.SendMessage( TUid::Uid( 0 ), *parameter8 );

CleanupStack::PopAndDestroy();

}

else

{

RApaLsSession appArcSession;

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

TThreadId id;appArcSession.StartDocument( *parameter, TUid::Uid( KApplicationUid ), id );

appArcSession.Close();

}

CleanupStack::PopAndDestroy();

便可以调用浏览器并直接访问移动梦网。

35

两种激活视图的方式

1. AppUi类的ActivateViewL函数激活单视图

TVwsViewId viewId;

viewId.iAppUid = KPlayUid;

viewId.iViewUid = aViewId;

ActivateViewL(viewId);

2. AppUi类的ActivateLocalViewL()函数激活多视图框架

TUid naviPaneUid;

naviPaneUid.iUid = EEikStatusPaneUidNavi;

CEikStatusPane* statusPane = StatusPane();

CEikStatusPaneBase::TPaneCapabilities subPane =

statusPane->PaneCapabilities(naviPaneUid);

 // if we can access the navigation pane

if (subPane.IsPresent() && subPane.IsAppOwned())

{

CAknNavigationControlContainer* naviPane =

(CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);

delete iNaviDecorator;

iNaviDecorator = NULL;

// ownership is transferred to us here

iNaviDecorator = naviPane->CreateTabGroupL();

// ownership not transferred

CAknTabGroup* tabGroup = (CAknTabGroup*) iNaviDecorator->DecoratedControl();

 // Display two tabs of normal length on the navigation pane at a time

tabGroup->SetTabFixedWidthL(KTabWidthWithOneTab);//设置视图栏是显示一个标签还是多个

tabGroup->SetObserver(this);

 //添加两个要显示的视图以及标题标题 ,也可以添加多个

_LIT(KTab, "tab");

TBuf<16> buf;

buf.Copy(KTab);

tabGroup->AddTabL(EMulitTabSettingItemListViewId, buf);

 // highlight the first tab

tabGroup->SetActiveTabByIndex(0);

naviPane->PushL(*iNaviDecorator);

iMulitTabSettingItemListView = CMulitTabSettingItemListView::NewL();

AddViewL( iMulitTabSettingItemListView );

SetDefaultViewL( *iMulitTabSettingItemListView );

//激活第一个视图

 ActivateLocalViewL(TUid::Uid(tabGroup->TabIdFromIndex(0)));

36

取消键盘音

KeySounds()->PushContextL( R_AVKON_SILENT_SKEY_LIST );

37 TTimer的简单使用

_LIT(KDateString, "%-B%:0%J%:1%T%:3%+B");

TTime now;

now.HomeTime();

TDateTime dateTime = time.DateTime();

TInt hour = dateTime.Hour();

iAlarmTime = now;

iAlarmTime += TTimeIntervalSeconds(200);

TBuf<128> bufS;

iAlarmTime.FormatL(bufS, KDateString);

38获得应用程序图标的两种方法

1.以下代码可以得到内嵌应用程序mif的路径

RApaLsSession ls;

ls.Connect();

RFile file;

TBuf<50> fileName;

TUid uid = {0xA000017F};

//Get test app's icon information

TInt err = ls.GetAppIcon(uid,file);

file.FullName(fileName);

ls.Close();

2.

CFbsBitmap* bitmap(NULL);

CFbsBitmap* mask(NULL);

AknsUtils::CreateAppIconLC(AknsUtils::SkinInstance(), aAppUid,  EAknsAppIconTypeContext, bitmap, mask);

CleanupStack::Pop(2);

39。获取File Server Session的常用方法

1)使用RFs的Connect()方法:

RFs aFSSession;

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

// 可以使用aFSSession

// ......

// 关闭file server session,释放相关资源

aFSSession.Close();

2)使用CCoeEnv:

GUI程序拥有控件环境(CCoeEnv),CCoeEnv由app framework构造,它持有一个File Server Session,并提供一个FsSession()方法获取FSS:

RFs& aFSSession = iCoeEnv->FsSession();

在UI框架中,CEikApplication、CCoeAppUi和CCoeControl都拥有iCoeEnv成员,所以在这些类中都可以使用上面的代码获取FSS。

3)使用CCoeEnv::Static():

在GUI程序中,如果你想在一些自己写的一些类中获取FSS,可以使用下列方法:

RFs& aFSSession = CCoeEnv::Static()->FsSession();

4)使用CEikonEnv:

CEikonEnv继承自CCoeEnv,使用它来获取FSS与使用CCoeEnv是一样的。 RFs& aFSSession = iEikonEnv->FsSession();

或者: RFs& aFSSession = CEikonEnv::Static()->FsSession();

说明:iEikonEnv定义于eikdef.h中 #define iEikonEnv (STATIC_CAST(CEikonEnv*,iCoeEnv))

40.symbian s60 3rd 键盘锁的使用

一般通过

TInt inactivity = User::InactivityTime().Int();

TInt ResetInactivity = User::ResetInactivityTime().Int;

获得系统沉默时间,然后激活定时器循环设定沉默时间

RTimer iTimer;

iTimer.Inactivity(iStatus, 0);

SetActive();

然后

#include <aknkeylock.h>  // RAknKeyLock

void LockKey()

{

 RAknKeyLock keyLock;

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

 if (!keyLock.IsKeyLockEnabled())

 {

     keyLock.EnableKeyLock();

 }

}

41.模拟挂机键,挂断电话

以下代码在n95上通过了测试

#include <e32event.h>

// SwEvent 能力

TRawEvent lEventDown;

lEventDown.Set(TRawEvent::EKeyDown, EStdKeyNo);

UserSvr::AddEvent(lEventDown);

User::After(100000);

TRawEvent lEventUp;

lEventUp.Set(TRawEvent::EKeyUp, EStdKeyNo);

UserSvr::AddEvent(lEventUp);

42.symbian 3rd 下有两种监听电话的方法

一种CTelephony* iTelephony;

CTelephony* iTelephony;

CTelephony::TCallStatusV1 iLineStatus;

CTelephony::TCallStatusV1Pckg iLineStatusPckg;

iTelephony->NotifyChange(iStatus,CTelephony::EVoiceLineStatusChange,iCurrentStatusPckg);

SetActive();

另外一种RProperty iProperty;

const TUid KelephonyCallHandling = {0x101F8787};

const TUint32 KTelephonyCallState = 0x00000004;

RProperty iProperty;

iProperty.Attach(KelephonyCallHandling , KTelephonyCallState);

iProperty.Subscribe(iStatus);

SetActive();

挂断电话也有两种方法

一种CTelephony Hangup(iStatus, iCallId);

另外一种使用sdk-plugin中的Phone Client Extension API

详细使用方法可以参考

http://wiki.forum.nokia.com/index.php/Phone_Client_Extension_API

43. 取手机固件(firmware)的版本信息,一般有两种方法:

一种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

使用SysUtil类,这个工具类包含了一些十分有用的静态函数供我们使用。

#include <SysUtil.h>// for sysutil.lib

用法

GetSWVersion()返回手机固件软件版本信息的字符串。

TBuf<KSysUtilVersionTextLength> versionBuf;

SysUtil::GetSWVersion(versionBuf);

使用GetSWVersion()函数,我们看到的结果,和在拨号状态下输入*#0000#代码看到的结果是几乎一样的。例如:

2.0618.06.05

14-07-06

RM-89

(c)Nokia

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

还有一种,通过读取系统文件获取

所有的都在 Epoc32/release/winscw/udeb/z/resource/versions 文件夹下

另外一些硬件信息可以

HBufC8* SysUtil::UserAgentStringL();

iCoeEnv->ScreenDevice()->SizeInPixels();

*numOfEntries为屏幕支持颜色数void PaletteAttributes(TBool& aModifiable,TInt& aNumEntries) const;*/

iCoeEnv->ScreenDevice()->PaletteAttributes(modifiable, numOfEntries);/

屏幕长宽、是否支持真彩可以通过HAL::Get()方法获取EDisplay开头的常量综合判断

支持颜色值则可以通过CEikonEnv::CreateSystemColorListL()获得

User::Language()可获取当前语言种

44 窗体透明:

窗口半透明效果需要硬件的支持。印象中AFAIK S60不支持,只要Uikon才支持。

所以S60第二版应该无法做到,而UIQ和S60 3rd及以上没有问题(仅是猜测)

可以参考如下链接和UIQ各路神仙给的代码

http://wiki.forum.nokia.com/index.php/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%8D%8A%E9%80%8F%E6%98%8E%E7%AA%97%E5%8F%A3

http://wiki.forum.nokia.com/index.php/How_to_Create_a_Transparent_Window

 1. http://developer.uiq.com/forum/thread.jspa?threadID=551&tstart=0

 void CMyControl::ConstructL(const TRect& aRect)

 {

 // create a semi-transparent window

 CreateWindowL();

 SetRect(aRect);

 Window().SetRequiredDisplayMode(EColor16MA);

 TRgb backgroundColour = KRgbRed; // for example

 if(KErrNone == Window().SetTransparencyAlphaChannel())

  {

  backgroundColour.SetAlpha(0);

  }

 Window().SetBackgroundColor(backgroundColour);

 // other construction code here

 ...

 // and finish construction

 ActivateL();

 }

 2. http://developer.uiq.com/forum/thread.jspa?threadID=521&tstart=0

 void CMyControl::ConstructL(const TRect& aRect)

 {

 // create a bitmap to use as a mask for the window

 iWindowMask = new(ELeave) CFbsBitmap;

 User::LeaveIfError(iWindowMask->Create(aRect.Size(),EGray256));

 // create a semi-transparent window

 CreateWindowL();

 SetRect(aRect);

 if(KErrNone == Window().SetTransparencyBitmap(*iWindowMask))

  {

  // we now have a semi-transparent window,

  // so make the mask look interesting

  CFbsDevice* maskDev = CFbsBitmapDevice::NewL(bitmap);

  CleanupStack::PushL(maskDev);

  CFbsBitGc* maskGc = CFbsBitGc::NewL();

  CleanupStack::PushL(maskGc);

  maskGc->Activate(maskDev);

  maskGc->... // whatever

  CleanupStack::PopAndDestroy(maskGc);

  CleanupStack::PopAndDestroy(maskDev);

  }

 else

  {

  // creating a semi-transparent window failed; tidy up now

  // we still have a window though, it's just opaque.

  delete iWindowMask;

  iWindowMask = NULL;

  // set the background colour, or whatnot...?

  }

 // other construction code here

 ...

 // and finish construction

 ActivateL();

 }

 3. http://developer.uiq.com/forum/thread.jspa?threadID=520&tstart=0

 TRgb backgroundColour = KRgbRed;

 backgroundColour.SetAlpha(0x80); // now 50% transparent

        gc.SetBrushColor(backgroundColour);

 gc.SetBrushStyle(CGraphicsContext::ESolidBrush);

 gc.Clear(Rect());

 ...

45 淡化自定义控件的背景 by davey_2

http://wiki.forum.nokia.com/index.php/%E6%B7%A1%E5%8C%96%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6%E7%9A%84%E8%83%8C%E6%99%AF

解决方案:

系统的提示框出现时往往会淡化背景来突出提示框,而在使用自定义控件来作为提示框时我们可以使用以下方案达到相同的效果。

DrawableWindow()->FadeBehind( ETrue );

DrawableWindow()是CCoeControl的一个函数,只要自定义控件是继承自CCoeControl就可以使用该方案淡化背景。

46 HTTP网络连接断开错误处理:

1。下载数据前,先前已经连接的网络遭遇断开。

处理方法是每次下载前使用TNifProgress nifProgress;iConnection.Progress(nifProgress);connected = (nifProgress.iStage == KLinkLayerOpen);做一下判断,当前网络是否连接,如果连接已经断开,则重新选择接入点连接。

另外也可以使用RConnection::ProgressNotification异步监控断连事件, 并自动重新连接。

2。下载数据中,网络遭遇断开

HTTP下载中网络断开,MHFRunL函数const THTTPEvent& aEvent会返回 aEvent.iStatus = -36的错误,这时就需要在default中处理这种错误。

继续阅读