cpp blog上面看到一哥们写的 下拉列表

#ifndef DROPDOWNLIST_H_INCLUDED
#define DROPDOWNLIST_H_INCLUDED

namespace azl
{

#define DROPDOWNLIST_NORMAL_COLOR       cocos2d::ccc4(128, 128, 128, 255)
#define DROPDOWNLIST_SELECTED_COLOR     cocos2d::ccc4(200, 200, 200, 255)
#define DROPDOWNLIST_HIGHLIGHT_COLOR    cocos2d::ccc4(60, 60, 200, 255)

#define DROPDOWNLIST_NORMAL_COLOR3       cocos2d::ccc3(128, 128, 128)
#define DROPDOWNLIST_SELECTED_COLOR3     cocos2d::ccc3(200, 200, 200)
#define DROPDOWNLIST_HIGHLIGHT_COLOR3    cocos2d::ccc3(60, 60, 200)

class DropDownList : public cocos2d::CCLayer
{
public:
    class TouchHelper : public cocos2d::CCObject, public cocos2d::CCTouchDelegate
    {
    protected:
        TouchHelper(DropDownList& list)
            : list_(list)
        {
            cocos2d::CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, cocos2d::kCCMenuHandlerPriority, true);
        }

public:
        static TouchHelper* create(DropDownList& list)
        {
            return new TouchHelper(list);
        }

void destroy()
        {
            cocos2d::CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
            autorelease();
        }

virtual bool ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
        {
            list_.onClose();
            return true;
        }

DropDownList& list_;
    };

protected:
    DropDownList(cocos2d::CCLabelTTF* label, cocos2d::CCSize size)
        : label_(label)
        , show_(false)
        , lastSelectedIndex_(0)
        , helper_(NULL)
        , item_(NULL)
    {
        menu_ = cocos2d::CCMenu::create();
        menu_->setPosition(cocos2d::CCPoint(size.width / 2, size.height / 2));
        menu_->setVertexZ(0.1f);
        menu_->retain();

label_->setPosition(cocos2d::CCPoint(size.width / 2, size.height / 2));
        addChild(label_);

setContentSize(size);
    }

public:
    ~DropDownList()
    {
        menu_->release();
    }

static DropDownList* create(cocos2d::CCLabelTTF* label, cocos2d::CCSize size)
    {
        DropDownList* list = new DropDownList(label, size);
        list->autorelease();
        return list;
    }

std::string getString()
    {
        return label_->getString();
    }

int getSelectedIndex()
    {
        return lastSelectedIndex_;
    }

void setSelectedIndex(int index)
    {
        lastSelectedIndex_ = index;

for (int i = 0, j = (int)labels_.size(); i < j; ++i)
        {
            if (i == lastSelectedIndex_)
            {
                layers_[i]->setColor(DROPDOWNLIST_HIGHLIGHT_COLOR3);
                label_->setString(labels_[i]->getString());
            }
            else
            {
                layers_[i]->setColor(DROPDOWNLIST_NORMAL_COLOR3);
            }
        }
    }

void setDropMenuItem(cocos2d::CCMenuItem* item)
    {
        CC_ASSERT(item_ == NULL);
        item_ = item;

addChild(item_);

cocos2d::CCSize size = getContentSize();
        item_->setAnchorPoint(cocos2d::CCPoint(1.0f, 0.5f));
        item_->setPosition(size.width, size.height / 2.0f);

label_->setAnchorPoint(cocos2d::CCPoint(0.0f, 0.5f));
        label_->setPosition(cocos2d::CCPoint(4, size.height / 2.0f));
    }

public:
    void onEnter()
    {
        setTouchEnabled(true);
        cocos2d::CCLayer::onEnter();
    }

void registerWithTouchDispatcher()
    {
        cocos2d::CCDirector* pDirector = cocos2d::CCDirector::sharedDirector();
        pDirector->getTouchDispatcher()->addTargetedDelegate(this, cocos2d::kCCMenuHandlerPriority, true);
    }

virtual bool ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
    {
        if (!show_)
        {
            cocos2d::CCRect rect;
            rect.origin = cocos2d::CCPointZero;
            rect.size = getContentSize();
            cocos2d::CCPoint position = convertTouchToNodeSpace(touch);

if (rect.containsPoint(position))
            {
                show_ = true;
                helper_ = TouchHelper::create(*this);
                addChild(menu_);

for (int i = 0, j = (int)labels_.size(); i < j; ++i)
                {
                    if (i == lastSelectedIndex_)
                    {
                        layers_[i]->setColor(DROPDOWNLIST_HIGHLIGHT_COLOR3);
                    }
                    else
                    {
                        layers_[i]->setColor(DROPDOWNLIST_NORMAL_COLOR3);
                    }
                }

if (item_)
                {
                    item_->selected();
                }

return true;
            }
        }
       
        return false;
    }

void addLabel(cocos2d::CCLabelTTF* label)
    {
        cocos2d::CCSize size = getContentSize();

cocos2d::CCLayerColor* normal   = cocos2d::CCLayerColor::create(DROPDOWNLIST_NORMAL_COLOR, size.width, size.height);
        cocos2d::CCLayerColor* selected = cocos2d::CCLayerColor::create(DROPDOWNLIST_SELECTED_COLOR, size.width, size.height);

layers_.push_back(normal);
        labels_.push_back(label);
        
        cocos2d::CCMenuItem* item = cocos2d::CCMenuItemSprite::create(
                normal, 
                selected, 
                NULL,
                this,
                cocos2d::SEL_MenuHandler(&DropDownList::onSelected)
            );

label->setPosition(cocos2d::CCPoint(size.width / 2, size.height / 2));
        item->addChild(label);
        item->setTag((int)labels_.size() - 1);
        item->setPosition(0, - (int)labels_.size() * size.height);

menu_->addChild(item);
    }

void onSelected(cocos2d::CCObject* sender)
    {
        cocos2d::CCMenuItem* item = dynamic_cast<cocos2d::CCMenuItem*>(sender);

if (item)
        {
            lastSelectedIndex_ = item->getTag();
            label_->setString(labels_[item->getTag()]->getString());
        }

onClose();
    }

void onClose()
    {
        removeChild(menu_, true);
        
        helper_->destroy();
        helper_ = NULL;

show_ = false;

if (item_)
        {
            item_->unselected();
        }
    }

private:
    cocos2d::CCMenu* menu_;
    cocos2d::CCLabelTTF* label_;
    std::vector<cocos2d::CCLabelTTF*> labels_;
    std::vector<cocos2d::CCLayerColor*> layers_;
    bool show_;
    int lastSelectedIndex_;
    TouchHelper* helper_;
    cocos2d::CCMenuItem* item_;
};

}

#endif

时间: 2024-10-03 20:26:40

cpp blog上面看到一哥们写的 下拉列表的相关文章

给群里的哥们写的sql(row_number、rank、dense_rank)

<span style="font-size:18px;">最近精力比较有限,有些常用的东西就先记录下来.方便以后自己查阅和总结.</span> 一个哥们想要实现如下效果: DEPTNO ENAME SAL TOP3 部门工资 排序 ---------- ---------- ---------- ---------- 20 KING 5000 1 8750 2 20 CLARK 2450 2 8750 2 20 MILLER 1300 3 8750 2 10

用Emacs写cnblogs-从此写blog变的很easy!

*/--> 用Emacs写cnblogs-从此写blog变的很easy! Table of Contents 1 需求说明 2 解决问题 3 结语 1 需求说明 在进入正题前还是先扯些废话吧!这Emacs还是大二的时候自己玩linux的时候,我的小学同学给我介绍的,第一次就教我安装,还把他的配置文件分享给我了,[虽然都是很简单的配置,俺这同学不太喜欢弄这些虚无的东西,可我就比较喜欢].Orgmode是大四的时候,自己找老师问关于Emacs的东西的时候,我的好好东老师给我推荐的,这才进入了orgm

秒杀多线程第十一篇 读者写者问题

与上一篇<秒杀多线程第十篇 生产者消费者问题>的生产者消费者问题一样,读者写者也是一个非常著名的同步问题.读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件. 上面是读者写者问题示意图,类似于生产者消费者问题的分析过程,首先来找找哪些是属于“等待”情况. 第一.写者要等到没有读者时才能去写文件. 第二.所有读者要等待写者完成写文件后才能去读文件. 找完“等待”情况后,再看看有没有要互斥访问的资源.由

多线程面试题系列(14):读者写者问题继 读写锁SRWLock

在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程).对于读取者线程,读写锁会允许他们并发的执行.当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待.因此用读写锁来解决读者写者问题会使代码非常清晰和简洁. 下面就来看看如何使用读写锁,要注意编译读写锁程序需要V

c++ cpp和hpp的关系

首先,我们可以将所有东西都放在一个.cpp文件内,编译器会将这个.cpp编译成.obj,即编译单元.一个程序可以由一个编译单元组成,也可以由多个编译单元组成.一个.cpp对应一个.obj,然后将所有的.obj链接起来(通过一个叫链接器的程序),组成一个.exe,即程序.如果一个.cpp要用到另一个.cpp定义的函数怎么办,只需在这个.cpp中写上它的函数声明. 链接器将所有的obj链接起来,但是如果碰巧有相同的函数或外部变量怎么办?C++可以通过一种叫做链接属性的关键字来限定,某个函数是属于整个

每次翻开自己以前写的文章,总是感觉自己不断在成长

今天忽然看起有人写blog来总结知识,忽然间想起了这个....破烂不堪的blog,看自己写过的文章,真是很想全部删除了,但是想着这些都是自己成长的经历,都是自己的教训育经验,所以我最后还是想保留了. 也许有人会问我,为什么写博客会断断续续,原因是我觉得写blog得对得起大家,写的应该是受过检验的知识,而不是一堆自己做的笔记,也许是对也许是错.在写blog的过程中,我不停地发现自己总结能力确实很欠缺,于是乎不想负责任,直接就开了某云笔记撸给自己看算了,撸了很久的有道云笔记后,有时候自己去重新看自己

第一篇blog(处女座)

时间一分一秒的过去,转眼之间,已经是研二下学期,匆匆忙忙中,自己捡到了一些芝麻,幸好西瓜没有丢掉! 无意之中看到了一篇blog,没错,就是在这里! http://kb.cnblogs.com/page/566318/ 分享给更多的朋友们,宝宝们要好好看啊!写的真的很不错! 最起码,我是这样觉得! 所以我也就将我的处女座blog奉献出来,虽然我之前一直也在写日志,看过上面这篇blog,感觉是时候写一些东西,带分享性的,向大牛们学习! 既然是这样,不如给自己一个规划吧!一个月写一篇blog,应该不难

我写的Android图表库XCL-Charts,整理好现在开源了!!!

XCL-Charts v0.1 Android开源图表库,基于原生的Canvas来绘制各种图表.目前支持3D/非3D柱形图.3D/非3D饼图.堆叠图.面积图.折线图.曲线图.环形图.南丁格尔玫瑰图.仪表盘.圆形图等等,并支持图表的混合显示及同数据源不同类型图表切换的功能. License 采用Apache v2 License开源协议. 开源中国上的代码托管地址: https://git.oschina.net/xclcharts/XCL-Charts 开源中国项目地址: http://www.

MNIST手写数字图片识别(线性回归、CNN方法的手工及框架实现)(未完待续)

0-Background 作为Deep Learning中的Hello World 项目无论如何都要做一遍的. 代码地址:Github 练习过程中将持续更新blog及代码. 第一次写博客,很多地方可能语言组织不清,请多多提出意见..谢谢~ 0.1 背景知识: Linear regression CNN LeNet-5 AlexNet ResNet VGG 各种regularization方式 0.2 Catalog 1-Prepare 2-MNIST 3-LinearRegression 1-P