如果你在编写多重控件时,请一定记住要使用的函数。

    技术2022-05-19  19

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


    最新回复(0)