cocos2dx & cocostudio 实现模态对话框
ui部分使用了cocoStudio,注意这里没有实现怎么屏蔽其他的输入事件,其他的文档已经太多了,我这里使用的cocoStudio的控件自己的特性。
这里强烈推荐一下cocoStudio,虽然现在还有不完善的地方,但是我个人感觉做的很不错了。
下面是代码,编译的时候请开启c++11.
//UI_ModalDialogue_Layer.h

#ifndef __UI_MODAL_DIALOGUE_LAYER_H__
#define __UI_MODAL_DIALOGUE_LAYER_H__ #include "cocos2d.h"
#include "cocos-ext.h"
#include <functional> typedef std::function<void(void)> pCall; class UI_ModalDialogue_Layer : public cocos2d::extension::UILayer
{
public: enum DialogueType
{
DT_Normal = ,
DT_Ok,
DT_Yes_No,
};
enum ResultTag
{
RT_Ok = ,
RT_YES,
RT_NO,
};
private:
UI_ModalDialogue_Layer(void);
~UI_ModalDialogue_Layer(void); CREATE_FUNC(UI_ModalDialogue_Layer); virtual bool init(); public:
static void DoModal(const char* szTitle,const char* szContent,DialogueType type=DT_Normal,pCall p=nullptr);
static void HideModal(); private:
void updateLayer(const char* szTitle,const char* szContent,DialogueType type,pCall p);
void btn_Click( cocos2d::CCObject* pSender ); private:
static UI_ModalDialogue_Layer* s_pInstance; cocos2d::extension::UILabel* m_pLabCaption;
cocos2d::extension::UILabel* m_pLabContent;
cocos2d::extension::UIButton* m_pBtn_Ok;
cocos2d::extension::UIButton* m_pBtn_Yes;
cocos2d::extension::UIButton* m_pBtn_No; DialogueType m_Type;
pCall m_pFunc;
}; #endif //__UI_MODAL_DIALOGUE_LAYER_H__

UI_ModalDialogue_Layer.cpp

#include "UI_ModalDialogue_Layer.h" USING_NS_CC;
USING_NS_CC_EXT; #define MODAL_DIALOGUE_ZORDER 9999 UI_ModalDialogue_Layer* UI_ModalDialogue_Layer::s_pInstance = NULL; UI_ModalDialogue_Layer::UI_ModalDialogue_Layer(void)
{
} UI_ModalDialogue_Layer::~UI_ModalDialogue_Layer(void)
{ } bool UI_ModalDialogue_Layer::init()
{
if (!UILayer::init())
{
return false;
} UIWidget* pWidget = CCUIHELPER->createWidgetFromJsonFile("ui/Model_Dialogue/Model_Dialogue.ExportJson");
addWidget( pWidget ); m_pLabCaption = (UILabel*)getWidgetByName("lbl_Caption");
m_pLabContent = (UILabel*)getWidgetByName("lbl_Content"); m_pBtn_Ok = (UIButton*)getWidgetByName("btn_OK");
m_pBtn_Ok->addReleaseEvent(this,coco_releaseselector(UI_ModalDialogue_Layer::btn_Click));
m_pBtn_Ok->setWidgetTag(RT_Ok); m_pBtn_Yes = (UIButton*)getWidgetByName("btn_Yes");
m_pBtn_Yes->addReleaseEvent(this,coco_releaseselector(UI_ModalDialogue_Layer::btn_Click));
m_pBtn_Yes->setWidgetTag(RT_YES); m_pBtn_No = (UIButton*)getWidgetByName("btn_No");
m_pBtn_No->addReleaseEvent(this,coco_releaseselector(UI_ModalDialogue_Layer::btn_Click));
m_pBtn_No->setWidgetTag(RT_NO); return true;
} void UI_ModalDialogue_Layer::btn_Click( CCObject* pSender )
{
HideModal(); if (m_pFunc)
{
UIButton* pBtn = dynamic_cast<UIButton*>(pSender);
CC_ASSERT( pBtn );
int nTag = pBtn->getWidgetTag();
if ( RT_Ok==nTag || RT_YES==nTag )
{
m_pFunc();
}
}
} void UI_ModalDialogue_Layer::updateLayer(const char* szTitle,const char* szContent,DialogueType type,pCall p)
{
s_pInstance->m_pLabCaption->setText(szTitle);
s_pInstance->m_pLabContent->setText(szContent);
s_pInstance->m_Type = type;
s_pInstance->m_pFunc = p; if (DT_Normal==s_pInstance->m_Type)
{
m_pBtn_Ok->setVisible(false);
m_pBtn_Yes->setVisible(false);
m_pBtn_No->setVisible(false);
}
else if (DT_Ok==m_Type)
{
m_pBtn_Ok->setVisible(true);
m_pBtn_Yes->setVisible(false);
m_pBtn_No->setVisible(false);
}
else if (DT_Yes_No==m_Type)
{
m_pBtn_Ok->setVisible(false);
m_pBtn_Yes->setVisible(true);
m_pBtn_No->setVisible(true);
}
else
{
CCLOG("UI_ModalDialogue_Layer::error m_Type");
}
} void UI_ModalDialogue_Layer::DoModal(const char* szTitle,const char* szContent,DialogueType type,pCall p)
{
if (!s_pInstance)
{
s_pInstance = UI_ModalDialogue_Layer::create();
s_pInstance->retain(); //let it leak,that's allright
}
CC_ASSERT(s_pInstance);
s_pInstance->HideModal(); s_pInstance->updateLayer(szTitle,szContent,type,p); CCScene* pCurrentScene = CCDirector::sharedDirector()->getRunningScene();
CC_ASSERT(pCurrentScene);
pCurrentScene->addChild(s_pInstance,MODAL_DIALOGUE_ZORDER); CCLOG("UI_ModalDialogue_Layer::ShowModal()"); } void UI_ModalDialogue_Layer::HideModal()
{
if (s_pInstance&&s_pInstance->getParent())
{
s_pInstance->removeFromParent();
CCLOG("UI_ModalDialogue_Layer::HideModal()");
}
}

//使用的时候这样,最后一个传一个lamda表达式,很方便.
UI_ModalDialogue_Layer::DoModal("321","4343",UI_ModalDialogue_Layer::DT_Yes_No,[&](){this->foo();} );
cocos2dx & cocostudio 实现模态对话框的更多相关文章
- cocos2d-x 模态对话框的实现
心情不好,恩.不扯淡了.直接讲. ================================== 在泰然看了一篇实现模态对话框的文章,写的还不错,然后在其基础上加了我简单加了一层灰色透明背景,这 ...
- MFC编程 | 非模态对话框的定义
因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // 非模态对话框的定义 // 通过单文档菜单调用一个非模态窗口 1.首先在工程里插入一个对话框(如:IDD_DLG_TEST ...
- bootstrap dialog 使用模态对话框
bootstrap3-dialog 使用模态对话框 <div class="modal fade"> <div class="modal-dialog& ...
- 【原创】WinForm 模态对话框
今天解决的一个问题,记录下,以备后用. 问题描述:WinForm程序有超时自动退出功能,但是有些模态对话框不关掉的话会退出失败,原因(猜测): 程序倒计时用的System.Windows.Forms. ...
- 关于easyUI的模态对话框
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址.博客园蜗牛cnblogs.com/tdws 会用easyUI的模态对话框会是我们的开发更加简洁,只需下载这个插件,把需要的文件拖到项目 ...
- 自定义AlertView实现模态对话框
在Windows应用程序中,经常使用模态(Model)对话框来和用户进行简单的交互,比如登录框.在IOS应用程序中,有时我们也希望做同样的事情.但IOS的UI库中,没有模态对话框,最接近那个样子的应该 ...
- MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...
- MFC编程入门之十一(对话框:模态对话框及其弹出过程)
加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有了些解了,有个好的开始对于以后的学习大有裨益.趁热打铁,这一节讲讲什么是对话框和非模态对话框,以及模态对话框怎样弹出. 一.模态对话框和非 ...
- MFC学习笔记(一)向模态对话框传递数据
声明构造函数为2个参数,具有默认参数的参数须放在后面. CDialogDimmer::CDialogDimmer(CString name,CWnd* pParent /*=NULL*/) : CDi ...
随机推荐
- python 基础 9.11 更改数据
#/usr/bin/python #-*- coding:utf-8 -*- #@Time :2017/11/24 4:45 #@Auther :liuzhenchuan #@File :更改 ...
- recognition rate generalization识别率 泛化
http://www1.inf.tu-dresden.de/~ds24/lehre/ml_ws_2013/ml_11_hinge.pdf Two extremes: • Big
- 《linux 内核全然剖析》 fork.c 代码分析笔记
fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录眼下最大的pid数值 void verify_area(void * addr,int s ...
- jetty源代码剖析
近期使用jetty自己写了一个web server,如今闲了花了一天的时间看了一jetty的源代码,主要以server的启动为主线.进行了剖析,经过阅读对jetty的源代码大赞,写的简洁.清晰.架构也 ...
- Swift学习笔记十一:方法
方法是与某些特定类型相关联的功能/函数.在Swift中,结构体和枚举能够定义方法:其实这是Swift与C/Objective-C的主要差别之中的一个. 在Objective-C中,类是唯一能 ...
- bug-3——onload,onbeforeunload,Onunload的区别
window.onload事件设置页面加载时执行的动作,即进入页面的时候执行的动作. window.onunload已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用 一般用于设置 ...
- PHP的依赖管理工具----composer
安装Composer 参考:https://getcomposer.org/doc/01-basic-usage.md composer 是PHP依赖管理工具 PHP最低版本要求5.3.2,需要允许o ...
- spark0.9.0安装
利用周末的时间安装学习了下最近很火的Spark0.9.0(江湖传言,要革hadoop命,O(∩_∩)O),并体验了该框架下的机器学习包MLlib(spark解决的一个重点就是高效的运行迭代算法),下面 ...
- 通过systemd配置Docker
1. systemd Service相关目录 通常情况下,我们有3种方式可以配置etcd中的service.以docker为例,1)在目录/etc/systemd/system/docker.serv ...
- Chrome Extension 扩展程序 小白入门
Chrome Extension 扩展程序 前请说明:本文适用于之前从来没有接触过chrome extension扩展程序的同学~ 编写demo 创建项目文件夹chrome_ext_demo,在项目根 ...