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()的调用是需要窗口资源的,重画时会遇到空指针的调用。