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 ...
随机推荐
- html5小趣味知识点系列(一)pubdate
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- iOS开发 Xcode8 问题
一.证书管理 用Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书.建议大家勾选这个Automatically manage signing(Ps.但是在b ...
- 什么是bin文件?
知道多问bin文件几个为什么.是在出现下面这个问题时引发的. 出现这种问题:未能载入文件或程序集"DAL"或它的某一个依赖项. 系统找不到指定的文件 ...
- Centos 初始化服务器防火墙没有启动找不到/etc/sysconfig/iptables
个人博客:https://blog.sharedata.info/ 具体步骤:添加规则然后重启防火墙自动生成防火墙文件1.iptables -P OUTPUT ACCEPT #添加出规则2.servi ...
- Python 集合、字典、运算符
先区分一下序列类型和散列类型: 序列类型:list.string.tuple,他们中的元素是有序的. 散列类型:set.dict,他们中的元素无序的. 序列类型有序,可以用索引.而散列类型中的元素是无 ...
- ArcGIS Scalebar 比例尺 充满div
说明:本篇博文地图充满div,上一篇博文是充满整个body 运行效果: 2.HTML代码 <!DOCTYPE html> <html> <head> <met ...
- 6.2-SingletonBeanRegistry-DefaultSingletonBeanRegistry
SingletonBeanRegistry package org.springframework.beans.factory.config; public interface SingletonBe ...
- Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks
Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks S. Chen, C. F. N. Cow ...
- Symfony 如何使用ckeditor
首先: 1)加载以下两个bundle "egeloen/ckeditor-bundle": "^4.0","helios-ag/fm-elfinder ...
- 销售订单、外向交货单、交货 bapi
转自[http://www.cnblogs.com/elegantok/archive/2009/10/18/1585398.html]***********SALES ORDER INPUT CRE ...