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 ...
随机推荐
- iOS之自定义UITabBar替换系统默认的(添加“+”号按钮)
自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个“+号按钮”,下面我们来聊聊具体的实现. 1.自定义WBTabBar,让其继承自UITabBar,代码如下: // / ...
- Objective-C中NSArray和NSMutableArray是如何使用的?
Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象.但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才 ...
- [转]使用Oracle SQL Developer连接数据库并创建用户
本文转自:http://blog.csdn.net/xw13106209/article/details/6594738 1.使用sys账户创建数据库连接 安装Oracle 11g会自带一个叫做SQL ...
- 在重命名SqlServer数据库是,报5030错误的解决办法
数据库不能重名名5030的错误,其实很简单原因就是有应用程序正在占用这个连接,使用这样一行命令就可以查询出正在占用的连接 use master select spid from master.dbo. ...
- 世界上最方便的SharePoint移动客户端--Rshare
Rshare我试用了一段时间,同时也测试了其他家产品,使用后的感觉是Rshare无愧于世界上最方面的SharePoint移动客户端. 1.界面设计很方便,设计中充分考虑到移动客户的使用习惯及喜好,设计 ...
- (原创)openvswitch实验连载2-cisco模拟器IOU-Web安装及网络环境配置
IOU的使用可以选择自己到官网https://docs.google.com/file/d/0B2AgRhS2cfxCQ01tN2NrQ0pvNUk/edit下载iou-web 软件,然后部署在lin ...
- Linux Shell脚本编程--cut命令
cut cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符 [root@www ...
- MFC多视图共用一文档实现
项目过程中有定制视图的需求,具体为打开程序默认双视图并且共用一个文档.在网上找了许多类似的资料,都不尽完善.本文直接从达到目的的角度叙述,实现原理不再多说. 1.在自己的App类中定义public变量 ...
- iOS 安全:UIWebView访问Https站点防止中间人攻击
尽管Https协议能够提供数据的加密.身份的认证等安全服务,但并不是没有漏洞.HTTPS协议安全隐患的存在可能使用户受到各种极具破坏力的网络攻击.其中中间人攻击(Man In The Middle, ...
- Mysql 的变量
变量 MySQL是一门编程语言.所以存在变量.流程控制.函数.存储过程.触发器 MySQL分系统变量,与自定义变量 MySQL的某些功能是通过系统变量来实现的.例如:autocommit 查看系统变量 ...