zoukankan      html  css  js  c++  java
  • 简单自定义控件在view下可以运行在传统模式下运行显示空白

    简单自定义控件-在view下可以运行-在传统模式下运行显示空白

    问题描述

    我写了一个自定义控件
    头文件

    #include <coecntrl.h>

    class CSimControl : public CCoeControl  
    {
    public:
        
    static CSimControl* NewL(const TRect& aRect,const CCoeControl* aParent);
        
    static CSimControl* NewLC(const TRect& aRect,const CCoeControl* aParent);
    public:
        CSimControl();
        
    virtual ~CSimControl();
        
    void Draw(const TRect& aRect) const;
        
    void SizeChanged();
    private:
        
    void ConstructL(const TRect& aRect,const CCoeControl* aParent );
    };

    代码文件

    #include "SimControl.h"

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    CSimControl::CSimControl()
    {

    }

    CSimControl::
    ~CSimControl()
    {

    }

    CSimControl
    * CSimControl::NewL( const TRect& aRect,const CCoeControl* aParent )
    {
        CSimControl
    * self = CSimControl::NewLC(aRect,aParent);
        CleanupStack::Pop();
        
    return self;
    }

    CSimControl
    * CSimControl::NewLC( const TRect& aRect,const CCoeControl* aParent )
    {
        CSimControl
    * self = new(ELeave)CSimControl();
        CleanupStack::PushL(self);
        self
    ->ConstructL(aRect,aParent);
        
    return self;
    }

    void CSimControl::Draw( const TRect& aRect ) const
    {

        CWindowGc
    & gc = SystemGc();
        gc.Clear(aRect);
        
        gc.SetPenStyle(CGraphicsContext::ESolidPen);
        gc.SetPenColor(KRgbBlack);
        gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
        gc.SetBrushColor(KRgbBlack);

        gc.DrawEllipse(aRect);
    }

    void CSimControl::SizeChanged()
    {
        
    }

    void CSimControl::ConstructL(const TRect& aRect,const CCoeControl* aParent )
    {
        
    if (aParent == NULL)
        {
            CreateWindowL();
        } 
    else
        {
            SetContainerWindowL(
    *aParent);
        }
        SetRect(aRect);
        ActivateL();
    }
     

    我在 view 下可以显示这个控件,但是在传统模式下无法运行,传统模式下的代码

    #include "SimControlLX2Container.h"

    #include 
    <eiklabel.h>  // for example label control


    // ================= MEMBER FUNCTIONS =======================

    // ---------------------------------------------------------
    // CSimControlLX2Container::ConstructL(const TRect& aRect)
    // EPOC two phased constructor
    // ---------------------------------------------------------
    //
    void CSimControlLX2Container::ConstructL(const TRect& aRect)
        {
        CreateWindowL();

        iLabel 
    = new (ELeave) CEikLabel;
        iLabel
    ->SetContainerWindowL( *this );
        iLabel
    ->SetTextL( _L("Example View") );

        iToDoLabel 
    = new (ELeave) CEikLabel;
        iToDoLabel
    ->SetContainerWindowL( *this );
        iToDoLabel
    ->SetTextL( _L("Add Your controls\n here") );

            iSimControl 
    = CSimControl::NewL(aRect,NULL);
            iSimControl
    ->SetContainerWindowL(*this);
        SetRect(aRect);
        ActivateL();
        }

    // Destructor
    CSimControlLX2Container::~CSimControlLX2Container()
        {
        delete iLabel;
        delete iToDoLabel;
            delete iSimControl;
        }

    // ---------------------------------------------------------
    // CSimControlLX2Container::SizeChanged()
    // Called by framework when the view size is changed
    // ---------------------------------------------------------
    //
    void CSimControlLX2Container::SizeChanged()
        {
        
    // TODO: Add here control resize code etc.
        iLabel->SetExtent( TPoint(10,10), iLabel->MinimumSize() );
        iToDoLabel
    ->SetExtent( TPoint(10,100), iToDoLabel->MinimumSize() );
        }

    // ---------------------------------------------------------
    // CSimControlLX2Container::CountComponentControls() const
    // ---------------------------------------------------------
    //
    TInt CSimControlLX2Container::CountComponentControls() const
        {
        
    return 3// return nbr of controls inside this container
        }

    // ---------------------------------------------------------
    // CSimControlLX2Container::ComponentControl(TInt aIndex) const
    // ---------------------------------------------------------
    //
    CCoeControl* CSimControlLX2Container::ComponentControl(TInt aIndex) const
        {
        
    switch ( aIndex )
            {
            
    case 0:
                
    return iLabel;
            
    case 1:
                
    return iToDoLabel;
                    
    case 2:
                            
    return iSimControl;        default:
                
    return NULL;
            }
        }

    // ---------------------------------------------------------
    // CSimControlLX2Container::Draw(const TRect& aRect) const
    // ---------------------------------------------------------
    //
    void CSimControlLX2Container::Draw(const TRect& aRect) const
        {
        CWindowGc
    & gc = SystemGc();
        
    // TODO: Add your drawing code here
        
    // example code...
        gc.SetPenStyle( CGraphicsContext::ENullPen );
        gc.SetBrushColor( KRgbGray );
        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
        gc.DrawRect( aRect );
        }

    // ---------------------------------------------------------
    // CSimControlLX2Container::HandleControlEventL(
    //     CCoeControl* aControl,TCoeEvent aEventType)
    // ---------------------------------------------------------
    //
    void CSimControlLX2Container::HandleControlEventL(
        CCoeControl
    * /*aControl*/,TCoeEvent /*aEventType*/)
        {
        
    // TODO: Add your control event handler code here
        }


    // End of File  

    运行后,屏幕一片空白
    找了好长时间也不有找到原因,后来在网友的帮助下终于找到原因了

    就是在 Container 中的 SizeChange 方法也要添加代码

    void CSimControlLX2Container::SizeChanged()
        {
        
    // TODO: Add here control resize code etc.
        iLabel->SetExtent( TPoint(10,10), iLabel->MinimumSize() );
        iToDoLabel
    ->SetExtent( TPoint(10,100), iToDoLabel->MinimumSize() );
        TSize aSize;
        aSize.SetSize(
    200,200);
        iSimControl
    ->SetExtent(TPoint(10,10
    ),aSize);
        }

    加粗部分是

    现在还有一个缺点是,没有画全,不过没有关系,这个应该在后面就可以解决了

    终于走出了一步了

  • 相关阅读:
    Java RMI 使用例子
    Hessian 使用例子
    Spring 使用javaconfig配置aop
    Spring 使用xml配置aop
    Spring Junit集成测试
    Spring 使用javaconfig配置
    Spring @Autowired注解用在集合上面,可以保持接口的所有实现类
    在linux上搭建nexus私服(CentOS7)
    PostgresSQL使用Copy命令能大大提高数据导入速度
    PHP curl get post请求
  • 原文地址:https://www.cnblogs.com/zziss/p/1657666.html
Copyright © 2011-2022 走看看