再把这个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>


classCUniNewsWebContainer:publicCCoeControl,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中,我们需要构造它:

voidCUniNewsWebContainer::ConstructL(constTRect&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只需要简单地重绘一下即可。
真正的使用在这儿呢,很简单:
voidCUniNewsWebContainer::LoadContentL(TIntid)

...{

if(iBrowser)...{
TFileNamefname;
fname.Format(KContentFile,id);
iBrowser->LoadUrlL(fname);
}
}
就是一句话 LoadUrlL就可以了,这个URL可以是http:// 也可以是 file://,很方便。
不过经常我们是需要将内存里的内容加载显示出来,那就稍稍多做一点工作:
voidCUniNewsWebContainer::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,在退出时会有内存泄露,按网上的说法,在构造后激活它即可,但是我试了也没有效果?!