Symbian学习笔记(14):使用Browser Control API

再把这个Browser Control API也总结一下吧,只是做个引导,其实要掌握它的用法最好的方法是打开 9.1\S60_3rd\S60Ex\BrCtlSampleApp 这个例子来阅读,它几乎涵盖了这个API的所有使用方法。

而我在UniNews中只使用了它最基本的用法,下面给出代码:

首先,在H文件中声明一个控件成员:
#include < coecntrl.h >
#include
< brctlinterface.h >
#include
< brctldefs.h >
#include
< brctllayoutobserver.h >
#include
< brctllinkresolver.h >

class CUniNewsWebContainer: public CCoeControl,MCoeControlObserver,MBrCtlLoadEventObserver ... {
public:
//Constructorsanddestructor
~CUniNewsWebContainer();
staticCUniNewsWebContainer*NewL(constTRect&aRect);
staticCUniNewsWebContainer*NewLC(constTRect&aRect);

private:
//Newfunctions
voidConstructL(constTRect&aRect);
CUniNewsWebContainer();

public:
//Functionsfrombaseclasses
TKeyResponseOfferKeyEventL(constTKeyEvent&aKeyEvent,TEventCodeaType);
voidHandleBrowserLoadEventL(TBrCtlDefs::TBrCtlLoadEventaLoadEvent,TUintaSize,TUint16aTransactionId);
voidLoadContentL(TIntid);

private:
//Functionsfrombaseclasses
voidSizeChanged();
TIntCountComponentControls()
const;
CCoeControl
*ComponentControl(TIntaIndex)const;
voidDraw(constTRect&aRect)const;
voidHandleControlEventL(CCoeControl*aControl,TCoeEventaEventType);

HBufC8
*ReadFileLC(constTDesC&aFileName);
private:
//data
CBrCtlInterface*iBrowser;
TUintiCapabilities;
TIntiCommandBase;
}
;
主要声明了三个成员,其中CBrCtlInterface是主要的browser控件,其它两个是构造时的所需要的参数。而这个类派生于接口MBrCtlLoadEventObserver,所以实现它的方法void HandleBrowserLoadEventL(TBrCtlDefs::TBrCtlLoadEvent aLoadEvent,TUint aSize,TUint16 aTransactionId);

在实现文件CPP中,我们需要构造它:
void CUniNewsWebContainer::ConstructL( const TRect & aRect) ... {
//Createawindowforthisapplicationview
CreateWindowL();
SetRect(aRect);

//addyourcodehere...
iBrowser=CreateBrowserControlL(this
,aRect
,iCapabilities
,iCommandBase
,NULL
//softkeyobserver
,NULL//linkresolver
,NULL//specialloadobserver
,NULL//layoutobserver
,NULL//dialogprovider
);
iBrowser
->ActivateL();
if(iBrowser)...{
iBrowser
->AddLoadEventObserverL(this);
iBrowser
->SetBrowserSettingL(TBrCtlDefs::ESettingsFontSize,TBrCtlDefs::EFontSizeLevelNormal);


}

ActivateL();
}

在构造函数中我们初始化那两个参数:
CUniNewsWebContainer::CUniNewsWebContainer() ... {
//Noimplementationrequired
iCapabilities=TBrCtlDefs::ECapabilityDisplayScrollBar|TBrCtlDefs::ECapabilityLoadHttpFw;
iCommandBase
=TBrCtlDefs::ECommandIdBase;
iBrowser
=NULL;
}

删除的时候记得将它的事件监听器都注销掉:
CUniNewsWebContainer:: ~ CUniNewsWebContainer() ... {
//Noimplementationrequired
if(iBrowser)...{
iBrowser
->RemoveLoadEventObserver(this);
}

deleteiBrowser;
iBrowser
=NULL;
}

此外,它跟其它控件一样,在Resize时要处理一下,并且它也需要声明自己是一个组件等等的。
而方法HandleBrowserLoadEventL只需要简单地重绘一下即可。

真正的使用在这儿呢,很简单:
void CUniNewsWebContainer::LoadContentL(TIntid)
... {
if(iBrowser)...{
TFileNamefname;
fname.Format(KContentFile,id);
iBrowser
->LoadUrlL(fname);
}

}

就是一句话 LoadUrlL就可以了,这个URL可以是http:// 也可以是 file://,很方便。

不过经常我们是需要将内存里的内容加载显示出来,那就稍稍多做一点工作:
void CUniNewsWebContainer::LoadContentL(TIntid)
... {
if(iBrowser)...{
TFileNamefname;
fname.Format(KContentFile,id);

HBufC8
*buf=ReadFileLC(fname);

_LIT(KURL,
"data:%d");
TBuf
<32>url;
url.Format(KURL,id);

_LIT8(KDataType,
"text/html");
TDataTypedataType(KDataType());
TUiduid;
uid.iUid
=KCharacterSetIdentifierUtf8;

iBrowser
->LoadDataL(url,*buf,dataType,uid);
CleanupStack::PopAndDestroy();
}

}

这里的URL用data:// 开头主要是用于历史记录作个标签罢了。而内容格式是text/html,不过要换成TDataType类型。而字符集使用UTF8。

我试了一下,觉得加载到内存再显示的效果比直接加载文件要快(主要是指切换页面时)。

另外,这个控件有个BUG,在退出时会有内存泄露,按网上的说法,在构造后激活它即可,但是我试了也没有效果?!

你可能感兴趣的:(html,工作,Symbian)