iStatusBar = CStatusBar::NewL(rect);
iStatusBar->SetContainerWindowL(*this);
iStatusBar->SetMopParent(this);
在创建多重控件的时候,如果你只拥有一个窗口资源,一定不要忘记调用SetContainerWindowL函数。
如果忘记调用,会有潜在的危险。如在landscape 和 portrait 模式下切换时,会遇到意想不到的crash,诸如 KERN-EXEC 3等等。
例子:
void CholyshitAppView::HandleResourceChange( TInt aType )
{
CCoeControl::HandleResourceChange(aType);
if ( KEikDynamicLayoutVariantSwitch == aType)
{
SetExtentToWholeScreen();
TRect rect(Rect().iTl.iX,
Rect().iTl.iY,
Rect().iBr.iX,
KStatusBarHeight);
iStatusBar->SetRect(rect);
}
}
SetRect 会调用子模块的SizeChanged(),如果这时候你重画控件的时候,就会碰到KERN-EXEC 3退出。因为Draw()的调用是需要窗口资源的,重画时会遇到空指针的调用。