再把这个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,在退出时会有内存泄露,按网上的说法,在构造后激活它即可,但是我试了也没有效果?!
而我在UniNews中只使用了它最基本的用法,下面给出代码:
首先,在H文件中声明一个控件成员:








































在实现文件CPP中,我们需要构造它:


























在构造函数中我们初始化那两个参数:







删除的时候记得将它的事件监听器都注销掉:










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










就是一句话 LoadUrlL就可以了,这个URL可以是http:// 也可以是 file://,很方便。
不过经常我们是需要将内存里的内容加载显示出来,那就稍稍多做一点工作:























这里的URL用data:// 开头主要是用于历史记录作个标签罢了。而内容格式是text/html,不过要换成TDataType类型。而字符集使用UTF8。
我试了一下,觉得加载到内存再显示的效果比直接加载文件要快(主要是指切换页面时)。
另外,这个控件有个BUG,在退出时会有内存泄露,按网上的说法,在构造后激活它即可,但是我试了也没有效果?!