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 ...
随机推荐
- ios 即时通讯 xmpp
[iPhone高级] 基于XMPP的IOS聊天客户端程序(XMPP服务器架构) http://blog.csdn.NET/kangx6/article/details/7739828 [iPhone高 ...
- Java线程面试题:设计四个线程,其中两个线程每次对 j 加 1,另外两个每次对 j 减 1,程序如下。
package thread; /** * Java线程面试题 * @author zhongfg * @date 2015-06-16 */ public class ThreadInterview ...
- lua例子getglobal()
#include <stdio.h> #define MAX_COLOR 255 extern "C" { #include "lua-5.2.2/src/l ...
- Collective Mindsets (medium) (逻辑题)
B - Collective Mindsets (medium) Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I6 ...
- 【学员管理系统】0x04 数据库连接优化
[学员管理系统]0x04 pymysql数据库连接优化 写在前面 项目详细需求参见:Django项目之[学员管理系统] 优化实现 把操作封装成函数 我们之前使用pymysql操作数据库的操作都是写死 ...
- Django自定义对象转成json字符串
1.定义转换函数:def convert_to_builtin_type(obj): print 'default(', repr(obj), ')' # 把MyObj对象转换成dict类型的对象 d ...
- k近邻算法(k-nearest neighbor,k-NN)
kNN是一种基本分类与回归方法.k-NN的输入为实例的特征向量,对应于特征空间中的点:输出为实例的类别,可以取多类.k近邻实际上利用训练数据集对特征向量空间进行划分,并作为其分类的"模型&q ...
- Android 常用的权限
添加WiFi以及访问网络的权限: <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE&q ...
- node-sass 安装失败的解决措施[转]
转自:http://blog.csdn.net/nzb329/article/details/51935236 在编译一个项目的时候,一直报错 后来发现是因为node-sass没有装成功, 最终的解决 ...
- QT设置TextEdit颜色
//设置textEdit颜色 QPalette palette= ui->receiveTextEdit->palette(); palette.setColor(QPalette::Ba ...