S60中的编辑框控件有很多种(普通编辑框、全局文本、IP地址、日期等等),这里只介绍普通编辑框——CEikEdwin。
一、创建编辑框
创建编辑框有两种方法:
1. 通过资源创建
1)资源定义
RESOURCE EDWIN r_example_editor
{
flags = EEikEdwinWidthInPixels; // 以像素为单位
width = 240; // 控件宽度
lines = 2; // 行数
maxlength = 1024; // 文本最大长度
}
2)生成代码
TResourceReader reader;
iCoeEnv->CreateResourceReaderLC( reader, R_EXAMPLE_EDITOR );
iEditor = new ( ELeave ) CEikEdwin;
iEditor->SetContainerWindowL( *this );
iEditor->ConstructFromResourceL( reader );
CleanupStack::PopAndDestroy(); // Resource reader
// 之后就可以对iEditor对象进行操作。比如SetFocus,SetExtent等。
2. 通过代码创建
代码如下:
iEditor = new (ELeave) CEikEdwin;
iEditor->SetContainerWindowL(*this );
iEditor->ConstructL(EEikEdwinWidthInPixels, 240, 1024, 2);
// 之后可以对iEditor对象进行操作
// iEditor->SetFocus( ETrue );
二、更新编辑框文本
不能使用向CEikLabel的SetText函数,编辑框的文本是有CPlainText类来编辑的。例如
_LIT( KLabelRecvData, "Display recv data." );
CPlainText *text = iEdwinRecvData->Text();
text->InsertL( 0, KLabelRecvData );
更多的操作,比如删除,追加文本利用SDK中的API都可以实现。也可参考Nokia论坛:http://wiki.forum.nokia.com/index.php/Using_CEikEdwin_Text_Editor
三、可能遇到的问题
在最开始使用编辑框时,你可能会遇到下面问题:
1)不响应键盘输入
在OfferKeyEventL函数中调用CEikEdwin的OfferKeyEventL函数。比如:
TKeyResponse CEditControlAppViewContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,
TEventCode aType)
{
return iEditor->OfferKeyEventL( aKeyEvent, aType );
}
2)调用了OfferKeyEventL函数仍然不响应键盘输入
一般都是在复合控件中使用编辑框,那么复合控件一定在一个View中。
我最开始遇到的问题是:S60 3rd新建的UI Application程序框架中,包含×××AppUi类和×××AppView两个类。实际上AppView继承的是CCoeControl类。我在这个类中添加一个编辑框,程序运行后,编辑框不响应键盘输入。
解决方法:我将×××AppView改成×××AppViewContainer类,然后创建一个继承与CAknView的×××AppView类,这样一个View对应一个Container,这样在Container中的编辑框可以正常响应键盘输入了。