#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

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

  1. c++ cpp和hpp

    首先,我们可以将所有东西都放在一个.cpp文件内,编译器会将这个.cpp编译成.obj,即编译单元.一个程序可以由一个编译单元组成,也可以由多个编译单元组成.一个.cpp对应一个.obj,然后将所有的 ...

  2. [转载]新功能:用微软的Live Writer离线写博文

    原文地址:Writer离线写博文">新功能:用微软的Live Writer离线写博文作者:新浪博客 Writer离线写博文" title="[转载]新功能:用微软的 ...

  3. C语言中头文件和cpp文件解析

    务必提前预读这里的内容:http://www.cnblogs.com/stemon/p/3999844.html 回到cpp文件与头文件各写什么内容的话题上: 理论上来说cpp文件与头文件里的内容,只 ...

  4. windows下用vscode写C++

    [本文参考:https://www.cnblogs.com/zhuzhenwei918/p/9057289.html  和 https://www.zhihu.com/question/3031589 ...

  5. Matlab与C++混合编程 1--在C++中调用自己写的matlab函数

    在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...

  6. 开始写博客的第一天,如何用c实现“hello wolrd”

    “hello world” 应该是大多数人学习的第一个代码 那也就作为我第一篇博客的开端吧 实现的代码如下 #include <stdio.h> int main() { printf(& ...

  7. 面向对象进阶时,if语句写错位置

    这周blog我也不知道要写什么,因为这章我其实学得有点懵,前面那几天我纠结了好久代码,一直不知道原因错在哪里.后来经过询问老师才知道自己调用错了构造方法,相信也有跟我一样的新手会犯这个错误.我在创建关 ...

  8. 写个续集,填坑来了!关于“Thread.sleep(0)这一行‘看似无用’的代码”里面留下的坑。

    "我报名参加金石计划1期挑战--瓜分10万奖池,这是我的第2篇文章,点击查看活动详情" 你好呀,我是居家十三天只出了一次小区门的歪歪. 这篇文章是来填坑的,我以前写文章的时候也会去 ...

  9. luac++

    Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 洪亮 305 2014年08月09日 发布   1 推荐 21 收藏,14.9k 浏览 关于cocos2d-x下Lua调用C++的文档看了 ...

随机推荐

  1. windows下安装 sphinx 数据库全文搜索引擎

    此次演示的环境是:win7系统,64位,php5.4.x,apache sphinx,斯芬克斯(英语不好的同学可以直接读这个音),意狮身人面像 特点:创建索引速度快,3分钟左右能创建100万条记录的索 ...

  2. jsp中frameset frame不显示页面

    今天玩frameset 的时候,无论我怎么改,页面死活不显示出来,网上找了很多答案,各种复制都不行,后来终于找到答案了,在使用frameset 的时候,不能将frameset 的内容放在body标签里 ...

  3. [转]Android SHA1与Package获取方式

    转自高德地图LBS Android SHA1与Package获取方式 获取应用包名 打开Android 应用工程的 AndroidManifest.xml配置文件,package 属性所对应的内容为应 ...

  4. LeetCode Shortest Distance from All Buildings

    原题链接在这里:https://leetcode.com/problems/shortest-distance-from-all-buildings/ 题目: You want to build a ...

  5. storm kafka整合

    public class KafkaTopo { public static void main(String[] args) { String zkRoot = "/kafka-storm ...

  6. C语言之memcpy函数

    昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: ...

  7. JSP知识体系大全

    Jsp动态网页 Web页面之间有3种关系: 包含  请求转发  重定向 l Jsp的运行原理:(3个) Jsp页面不能直接运行 1.容器调用jsp引擎编译jsp文件  成一个java文本(Servle ...

  8. An internal error occurred during: "Building workspace".

    当在eclipse中的web工程中增加了extjs4,出现An internal error occurred during: "Building workspace". Java ...

  9. 批处理命令——if

    [1]if命令简介 if,大家肯定见多了,一个没有用过if的程序员不是一个好产品经理(呵呵~~). if,判断选择的作用,自从写了几年代码,我才真正弄明白了一件事,为什么当初上学时候考试总要做那么多的 ...

  10. 将HTML5 Canvas的内容保存为图片借助toDataURL实现

    将HTML5 Canvas的内容保存为图片主要思想是借助Canvas自己的API - toDataURL()来实现,具体实现如下,感兴趣的朋友可以参考下哈,希望对你有所帮助 <html> ...