Symbian - CEikRichTextEditor 陷阱
来源:互联网 发布:c 调用tensorflow 编辑:程序博客网 时间:2024/06/05 04:25
Symbian - CEikRichTextEditor 陷阱
问题:CEikRichTextEditor 的父控件(parent control)必须拥有自己的窗口(window)?!
哈哈,看来不是这样的,因为有 SetMopParent()。看如下的一个实例,
现在有三个层次嵌套起来的复合控件(compound contol),我们姑且称之为 grandfather control, father control,child control,并且一个 CEikRichTextEditor 对象 iRtEd 是 child control 的子控件, 如果这三层控件都拥有自己的窗口,也就是 owning a window,那么就没有任何问题了,无论如何,iRtEd 都可以被正确创建。
但是,如果只有 grandfather control 拥有自己的窗口,father control 和 child control 都没有自己的窗口,而是通过 SetContainerWindowL() 来共享 grandfather control 的窗口,那么问题就来了。
按照惯例,在 new CEikRichTextEditor 以后,调用 SetParent() 和 SetContainerWindowL() 即可,但是 CEikRichTextEditor 比较特殊,如果仅仅做了这两个步骤,你肯定会得到一个 KERN-EXEC 3 的 Panic。是因为 child control 从 grandfather control 层层传递过来的 window 并没有交给 CEikRichTextEditor,所以你在调用 CEikRichTextEditor::ConstructL(const CCoeControl* aParent, TInt aNumberOfLines, TInt aTextLimit, TInt aEdwinFlags, TInt aFontControlFlags=EGulFontControlAll, TInt aFontNameFlags=EGulNoSymbolFonts) 的时候,会出现 KERN-EXEC 3 Panic,原因是 aParent(也就是 child control)的 window 环境并没有传递给这个CEikRichTextEditor 对象(iRtEd),它认为用没有 window 的父控件构造自己是非法的,所以有这个错误。那么如何让这个 CEikRichTextEditor 对象(iRtEd)得到 child control 的 window 环境呢?就是调用 CCoeControl::SetMopParent(MObjectProvider *aParent)。下面是 SetMopParent 的说明,
IMPORT_C void SetMopParent(MObjectProvider *aParent);
Description
Sets the context - that is, the enclosing parent control - for this control.
Description
Sets the context - that is, the enclosing parent control - for this control.
所以,做如下的调用之后,
iRtEd = new (ELeave) CEikRichTextEditor;
iRtEd->SetAknEditorCase( EAknEditorLowerCase );
iRtEd->SetAknEditorFlags( EAknEditorFlagFixedCase );
iRtEd->SetParent( this );
iRtEd->SetContainerWindowL( *this );
iRtEd->SetMopParent( this );
iRtEd->ConstructL( this, 0, 0, 0 );
iRtEd->SetAknEditorCase( EAknEditorLowerCase );
iRtEd->SetAknEditorFlags( EAknEditorFlagFixedCase );
iRtEd->SetParent( this );
iRtEd->SetContainerWindowL( *this );
iRtEd->SetMopParent( this );
iRtEd->ConstructL( this, 0, 0, 0 );
CEikRichTextEditor 对象即可在你构造的多层次复合控件环境中被正确创建,并且被 ActivateL(),所以千万不要忽视了 SetMopParent()。这个问题浪费了我不少时间,我查过 Symbian 和 S60 的资料,并且看过数个例子,包括“S60_Platform_Rich_Text_Editor_Example_v2_0_en.zip”,但是,这只是 CEikRichTextEditor 对象在一个单层复合控件环境中的示例,也就是说,CEikRichTextEditor 的父控件拥有 window,所以你不会碰到这个问题。
- Symbian - CEikRichTextEditor 陷阱
- Symbian - E32User-CBase 46 陷阱
- CEikRichTextEditor 切换中文
- 如何改变CEikRichTextEditor的字体
- CEikRichTextEditor 实现的两种方式
- “陷阱”
- 陷阱!!!!!!!!!
- Symbian
- symbian
- symbian
- symbian
- CEikRichTextEditor、CEikEdwin的文本layout的API接口
- 理想陷阱
- AJAX陷阱
- Deque陷阱
- DB2陷阱
- 美人陷阱
- 词法陷阱
- 读取Window 密钥函数 DecodeProductKey
- [YC] Symbian S60位图处理那些事
- Symbian/S60:删除指针后,在何种情形下才需要置空(ptr = NULL)
- Symbian周期函数(CPeriodic)(
- [代码]使用LINQ的查询结果填充XML树(LINQ to XML)
- Symbian - CEikRichTextEditor 陷阱
- configure Spring+Hibernate+JPA for work with two databases
- Symbian S60系列应用的全屏处理
- How to use CPeriodic for a steady stream of ticks
- [代码]使用函数构造创建具有属性的元素(LINQ to XML)
- 麦考林
- JS 打开新窗口没有工具栏 地址栏,同时关闭当前窗口
- [代码]创建XDocument对象(LINQ to XML)
- zz iccr做覆盖率分析