cocos2dx Tab选项卡控件的实现
选项卡控件在游戏和应用中很是常见,但是cocostudio里并没有实现好的选项卡控件,于是自己封装了 一个,效果如下:

代码:
TabUiControl.h
#pragma once //std
#include <string> //cocos
#include "cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h" using namespace std; USING_NS_CC;
using namespace cocos2d::ui;
using namespace cocostudio;
using namespace cocostudio::timeline; typedef std::function<void(int)> OnTabActioveCallback; //tab控件数据
struct STabBtnData
{
STabBtnData()
{
_pTabBtn = nullptr;
_pBtnTxt = nullptr;
_pContentNode = nullptr;
}
ui::Button *_pTabBtn; //按钮
Text * _pBtnTxt; //按钮文字
Node *_pContentNode; //对应的内容node指针
}; //选项卡控件
class TabUiControl
{
public:
TabUiControl();
virtual ~TabUiControl();
//初始化tab
bool InitTab(Node *pRootNode, int tabCount, bool bHaveContenNode = true,const char *pTabBtnName = "tabBtn", const char *pTabTxtName = "btnTxt", const char *pContentName = "tabContent");
//tab单击事件
void OnTabClick(Ref *pSender);
//激活tab
void ActiveTab(int index);
//设置激活颜色
void SetActiveTxtColor(const Color4B &color){ _activeTxtColor = color; }
//设置未激活颜色
void SetUnActiveTxtColor(const Color4B &color){ _unActiveTxtColor = color; }
//设置选中回调
void SetActiveCallback(OnTabActioveCallback call){ _onActiveCallback = call; }
private:
//初始化静态数据
static void InitDefData();
protected:
static const int MaxTabCount=; //最大tab数量
static int TabValue[MaxTabCount]; //tab 值
int _tabCount; //tab数量
int _tabMaxZorder; //tabMaxZorder
STabBtnData *_pTabBtnData; //tab 数据
Color4B _activeTxtColor; //激活tabBtn文字颜色
Color4B _unActiveTxtColor; //未激活tabBtn文字颜色
OnTabActioveCallback _onActiveCallback; //tab被激活回调
bool _bHaveContenNode; //tab是否有对应的内容节点
private:
};
TabUiControl.cpp
#include "TabUiControl.h" int TabUiControl::TabValue[MaxTabCount]; TabUiControl::TabUiControl()
:_activeTxtColor(, , , ), _unActiveTxtColor(, , , )
{
InitDefData(); _tabMaxZorder = ;
_tabCount = ;
_pTabBtnData = nullptr;
_onActiveCallback = nullptr;
_bHaveContenNode = false; } TabUiControl::~TabUiControl()
{ CC_SAFE_DELETE_ARRAY(_pTabBtnData);
}
void TabUiControl::InitDefData()
{
static bool BInitOk = false;
if (!BInitOk)
{
for (int i = ; i < MaxTabCount; i++)
{
TabValue[i] = i;
} BInitOk = true;
} } bool TabUiControl::InitTab(Node *pRootNode, int tabCount, bool bHaveContenNode, const char *pTabBtnName, const char *pTabTxtName, const char *pContentName)
{
bool ret = false;
do
{
CC_BREAK_IF(!pTabBtnName || !pTabTxtName || !pRootNode || !pContentName);
CC_BREAK_IF(tabCount > MaxTabCount || tabCount <= ); //分配tab 数据
_pTabBtnData = new STabBtnData[tabCount];
_tabCount = tabCount;
_bHaveContenNode = bHaveContenNode; //临时变量
ui::Button *pTempBtn = nullptr;
Text *pTempTxt = nullptr;
Node *pNode = nullptr;
char tc[] = { };
int i = ;
Widget::ccWidgetClickCallback callback = CC_CALLBACK_1(TabUiControl::OnTabClick, this); for (i = ; i < tabCount; i++)
{
//内容节点指针
if (bHaveContenNode)
{
sprintf(tc, "%s%d", pContentName, i);
pNode = StudioUiBase::FindUiChildNode(pRootNode, tc);
CC_BREAK_IF(!pNode);
_pTabBtnData[i]._pContentNode = pNode;
} //tabBtn
sprintf(tc, "%s%d", pTabBtnName, i);
pNode = StudioUiBase::FindUiChildNode(pRootNode, tc);
pTempBtn = dynamic_cast<ui::Button*>(pNode);
CC_BREAK_IF(!pTempBtn);
//btnTxt
pNode = StudioUiBase::FindUiChildNode(pTempBtn, pTabTxtName);
pTempTxt = dynamic_cast<Text*>(pNode);
CC_BREAK_IF(!pTempTxt);
//tab 值
pTempBtn->setUserData(&(TabValue[i]));
//事件
pTempBtn->addClickEventListener(callback);
//保存
_pTabBtnData[i]._pTabBtn = pTempBtn;
_pTabBtnData[i]._pBtnTxt = pTempTxt; }
CC_BREAK_IF(i != tabCount); //获取最大的zorder-----------
int zoreder = ;
_tabMaxZorder = ;
for (i = ; i < tabCount; i++)
{
zoreder = _pTabBtnData[i]._pTabBtn->getLocalZOrder();
if (zoreder>_tabMaxZorder)
_tabMaxZorder = zoreder;
} ret = true;
} while (); return ret;
} void TabUiControl::ActiveTab(int index)
{
if (index >= && index < _tabCount)
{
int zorder = _tabMaxZorder; //选中设置
_pTabBtnData[index]._pTabBtn->setLocalZOrder(_tabMaxZorder);
_pTabBtnData[index]._pTabBtn->setBright(true);
_pTabBtnData[index]._pBtnTxt->setTextColor(_activeTxtColor); //内容可见性
if (_bHaveContenNode)
_pTabBtnData[index]._pContentNode->setVisible(true); //左边的tab
for (int i = index - ; i >= ; i--)
{
//未选中设置
zorder--;
_pTabBtnData[i]._pTabBtn->setLocalZOrder(zorder);
_pTabBtnData[i]._pTabBtn->setBright(false);
_pTabBtnData[i]._pBtnTxt->setTextColor(_unActiveTxtColor); //内容可见性
if (_bHaveContenNode)
_pTabBtnData[i]._pContentNode->setVisible(false);
} //右边的tab
for (int i = index + ; i < _tabCount; i++)
{
//未选中设置
zorder--;
_pTabBtnData[i]._pTabBtn->setLocalZOrder(zorder);
_pTabBtnData[i]._pTabBtn->setBright(false);
_pTabBtnData[i]._pBtnTxt->setTextColor(_unActiveTxtColor); //内容可见性
if (_bHaveContenNode)
_pTabBtnData[i]._pContentNode->setVisible(false);
} //回调
if (_onActiveCallback)
{
_onActiveCallback(index);
} }
} void TabUiControl::OnTabClick(Ref *pSender)
{
do
{
ui::Button *pBtn = dynamic_cast<ui::Button*>(pSender);
CC_BREAK_IF(!pBtn);
void *pUserData = pBtn->getUserData();
CC_BREAK_IF(!pUserData);
int *pValue = (int*)(pUserData);
//激活tab
ActiveTab(*pValue); } while ();
}
使用代码:
//初始化tab
_tabControl.InitTab(pTabNode, );
//默认显示0
_tabControl.ActiveTab();
InitTab函数简要说明:
//pRootNode:tab 和内容节点的父节点 tabCount:tab总数,bHaveContenNode:tab是否有对应的内容节点,pTabBtnName:tab控件名前缀
//pTabTxtName:tab文本名称,pContentName:内容节点控件名前缀
在InitTab中根据pRootNode节点分别找出所有的tab按钮和对应的内容节点,最大的zorder等数据,在tab按钮响应函数里设置激活时的相关属性
cocos2dx Tab选项卡控件的实现的更多相关文章
- 在VC++中使用Tab Control控件
系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用 查阅MSDN文档,对于创建T ...
- C++ MFC Tab Control控件的详细使用
1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置I ...
- TabControl 选项卡控件
TabControl 控件是由System.Windows.Forms.TabControl类提供的,作用就是讲相关的组件组合到一系列选项卡页面上. MulitiLine 属性用来设置是否显示多行 ...
- KRBTabControl(中文)Windows选项卡控件
本文阐述了如何在C#使自定义Windows选项卡控件. Download demo project - 82.4 KB Download source - 252 KB 介绍 本文讨论如何使用.NET ...
- 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- MFC编程 | tab control控件的使用
因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // tab control控件的使用 // 建立一个Cluster窗口,通过tab可以切换成C-Means和Fuzzy C- ...
- 基于duilib实现的可滑动tab标签控件
最近一直在忙棋牌游戏大厅的开发,使用了duilib界面库,在大厅界面游戏菜单的展现上需要用到滑动的效果,类似悠扬棋牌,jj棋牌的菜单左右(上下)滑动的效果.通过自己的设计思路完善了一个可滑动的tab标 ...
- 在WinForm应用程序中,使用选项卡控件来加载不同的Form界面!
TabPage tp=new TabPage(); your选项卡控件.Controls.Add(tp); From1 frm=new Form1(); frm.TopLevel = false; f ...
- C# 选项卡控件
选项卡控件,它提供一系列操作按钮,单击不同的按钮可以在各个页面之间进行切换. 在Windows Form应用程序中,选项卡控件即“TebPage”控件,它公开“TebPage”属性,表示一个由“Tab ...
随机推荐
- Spring3之MVC
模式-视图-控制器(MVC)是UI设计中常见的设计模式, 该模式区分应用程序中的模式.视图和控制器三个角色,消除了业务逻辑与UI的耦合.模式负责封装视图展示的应用数据.视图应该只显示数据,不包含任何业 ...
- 4.关于phpstudy for linux 的安装(LNMP)更好的环境请看8.LNMP环境
phpstudy真的很坑爹! 所以我在后面重新写了一个LNMP环境的集成包应用! 首先,我们在自己本地开发的时候一般使用的虚拟机的权限账号都是最高的,也就是我们的root账户 PS:我已经更改镜像源为 ...
- Linux操作系统的简单认识
1:Linux操作系统的历史 Linux操作系统是由unix操作系统发展而来的,但是Unix是收费的系统,而Linux操作系统的免费的,开源的,所以使用比较广泛,但是它是基于命令行的,不提供图形化用户 ...
- 关于Ajax的实现
AJAX:Asynchronous Javascript And XML.异步的JavaScript和XML. 同步请求: 异步请求: 1.1.1 XMLHttpRequest对象的介绍: 方法 ...
- Linux 的使用基础---Shell程序设计
Shell是Linux系统中的一个重要的层次,它是用户与系统交互作用的界面.Shell除了作为命令解释程序以外,还是一种高级程序设计语言.利用Shell程序设计语言可以编写出功能很强.但代码简单的程序 ...
- JavaScript入门(9)
一.Math对象 Math对象,提供对数据的数学计算 使用Math的属性和方法,代码如下: <script type="text/javascript"> var my ...
- JAXB - Hello World
We'll stick with the tradition and use a sort of "Hello World" XML document to illustrate ...
- Hive体系结构介绍
http://www.aboutyun.com/thread-6217-1-1.html 1.Hive架构与基本组成 下面是Hive的架构图. 图1.1 Hive体系结构 Hive ...
- scala学习笔记:match与unapply()
编写如下代码: object MatchTest { def foo(a : Any) : String = { a match { case 1 => "int:1" ca ...
- DevExpress的 ASPxGridview控件的自动配置效果
[淘宝小店:http://shop107919332.taobao.com ] 软件运行界面.是不是很漂亮? 这里是系统配置页面,可以随时根据需要配置每张表的每个字段的显示顺序,可见与否,只读与否,编 ...