UI库阶段性进展(把背景图元设定为Wnd基类的成员)

  把背景图元设定为Wnd基类的成员 主要是为了所有控件配置背景方便(基本所有的控件都是有背景的);

  下面是读取背景配置的示例代码:

        ATT_STRING(ATT_BG_IMG, m_strBgImg)
        ATT_COLOR(ATT_BG_COLOR, m_dwBgColor)
        ATT_CUSTOM(ATT_BG_MODE, OnSetBgMode)
        ATT_CUSTOM(ATT_BG_STRETCH, OnSetBgStretch)

 

      背景支持三种方式,纯色、单张背景图,九宫格拉伸的背景图;

      通过给wnd基类设定一个colorblockrender和一个texturerender来实现三种背景图;

      button等多态(包括disable状态)的控件,通过上次实现的texture设定纹理坐标实现;

 

      由于支持三种方式,在wnd基类中设定三个虚方法:

	virtual BOOL          InitColorBG();
	virtual BOOL          InitImgBG();
	virtual BOOL          InitNrgBG();

  分别初始化三种背景,子类控件可以重载实现自己的初始化过程,例如button在初始化的时候背景是一个序列的状态都在一张图中,

我们就可以重载InitImgBG的方法,然后再重载的方法中指定初始化的纹理坐标,示例代码如下:

BOOL CColorfulButton::InitImgBG()
{
    ...... 

    m_pBgTextureRender->SetWndRect(&m_rc);
    if(m_bDisable)
        m_pBgTextureRender->SetTextureUVByRatio(4,4);
    else
        m_pBgTextureRender->SetTextureUVByRatio(1,4);
    ......

    AddChildNode(dynamic_cast<CColorfulTreeNode *>(m_pBgTextureRender));

    return TRUE;
}

 

 

//根据pos指定计算控件位置,更新2维和3维空间的坐标
BOOL CalcWndPosition();

由于initialize方法是虚方法,wnd的实现中调用CalcWndPosition,由于render的消息是从后向前发,所以不能先调用积累wnd的initialize方法,

所以需要将该方法放到外部调用,以保证映射的3维坐标是准备好的;

 

 

 

 

posted @ 2012-12-13 02:53  健忘猪  阅读(363)  评论(0编辑  收藏  举报