Cinder-2 窗口的创建过程
通过TinderBox生成的代码很简单,整个代码如下:
#include "cinder/app/AppNative.h"
#include "cinder/gl/gl.h" using namespace ci;
using namespace ci::app;
using namespace std; class CinderProjectApp : public AppNative {
public:
void setup();
void mouseDown( MouseEvent event );
void update();
void draw();
}; void CinderProjectApp::setup()
{
} void CinderProjectApp::mouseDown( MouseEvent event )
{
} void CinderProjectApp::update()
{
} void CinderProjectApp::draw()
{
// clear out the window with black
gl::clear( Color( 0, 0, 0 ) );
} CINDER_APP_NATIVE( CinderProjectApp, RendererGl )
整个程序看不到主函数在哪里。那么接下来,我们一步一步分析。
首先,是CinderProjectApp这个类,继承自AppNative,AppNative根据平台不同,被typedef成不同的类,在windows平台,其实质就是AppBasic类。稍后我们再来看这个类的具体实现。
先来看看CINDER_APP_NATIVE这个宏,这个宏也是根据平台不同,而展开为不同形式,针对windows,其typedef为CINDER_APP_BASIC,这个宏里实现了WinMain方法:
#define CINDER_APP_BASIC( APP, RENDERER ) \
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { \
cinder::app::AppBasic::prepareLaunch(); \
cinder::app::AppBasic *app = new APP; \
cinder::app::RendererRef ren( new RENDERER ); \
cinder::app::AppBasic::executeLaunch( app, ren, #APP ); \
cinder::app::AppBasic::cleanupLaunch(); \
return 0; \
}
cinder::app::AppBasic::prepareLaunch(); 对于windows来说,没有做任何事情。
cinder::app::AppBasic *app = new APP; 创建一个CinderProjectApp对象。
cinder::app::RendererRef ren( new RENDERER ); 创建呈现对象,本例中是RendererGl对象。
cinder::app::AppBasic::executeLaunch( app, ren, #APP ); 这个方法是最主要的方法,接下来会主要对该方法进行讲解。
cinder::app::AppBasic::cleanupLaunch(); 对windows来说,也没有做任何事情。与cinder::app::AppBasic::prepareLaunch()相对应。
接下来,我们重点讲解一下executeLaunch方法。该方法的原型如下:
static void executeLaunch( AppBasic *app, RendererRef renderer, const char *title );
这个过程中,会调用prepareSettings方法,这个方法在我们自己的类中可以进行重写,修改一些配置。初始化整个程序的GDI+环境。
在prepareSettings方法中,如果设置Settings的prepareWindow方法,那么根据你传入的参数,可以创建1个或更多个指定的窗口,如果没有设置该方法,那么会创建一个默认的窗口。
在所有的窗口都创建完成之后,会调用App的setup方法,这个方法在我们自己的类中可以进行重写,这个setup方法在整个程序中只调用一次。
调用完setup方法,那么就会遍历所有的窗口,发送resize信号,APP的resize也可重写。
开始进行第一次update,接着,遍历所有窗口进行redraw,开始进行消息循环。那么进行到这里,整个应用程序就创建完成了。
Cinder-2 窗口的创建过程的更多相关文章
- 有谁知道Delphi中"窗口"的创建过程?
求助:有谁知道Delphi中窗口的创建过程,此“窗口”不仅仅指 TForm 类型, 还包括一般的窗口控件,如TButton,TEdit等等,希望有能够十分详细的运作 过程,比如说CreatPara ...
- vc++窗口的创建过程(MFC消息机制的经典文章)
一.什么是窗口类 在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...
- VC++窗口创建过程,图形绘制,时钟程序
创建窗口步骤: (1)注册窗口类(RegisterClassEx) (2)创建窗口(CreateWindowEx) (3)在桌面显示窗口(ShowWindow) (4)更新窗口客户区(UpdateWi ...
- Hystrix核心基础 - 滑动窗口创建过程及demo
前言 RxJava可能有些小伙伴没有听过是什么东西,可能是因为大家平时在做业务需求的时候对异步编程了解得比较少,而RxJava就是这么一个响应式编程框架,RxJava在安卓上面用得非常多,做安卓的朋友 ...
- XMPie部署与创建过程 - 快速指南
XMPie部署与创建过程 1PhotoShop.Indesign.VS2013关系.作用.使用 .1.1目的与过程 1. Photoshop负责导出cpkg文件. 1.1 动态性 如果你想要生成动态的 ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- uCGUI窗口的创建过程分析
一.相关结构体和变量 窗口管理结构体 /* 窗口管理结构体 共30个字节 */ struct WM_Obj { GUI_RECT Rect; //窗口尺寸(x0,y0,x1,y1) 8个字节 GUI_ ...
- Android Context创建过程
特定的资源或者类构成了Android应用程序的运行上下文环境 PackageManager, ClassLoader, Assert等等 Android应用程序窗口的运行上下文环境是通过Con ...
- win32 api Windows窗口的创建
windows窗口的创建有以下几个步骤: 1.创建注册窗口类 2.创建窗口句柄 3.显示更新窗口 4.消息循环 1.创建注册窗口类 所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始 ...
随机推荐
- 【转】国内较快的maven镜像
国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ====================国内OSChina提供的镜像,非常不错=========== ...
- HibernateTemplate的find(String querystring)返回值具体解释
项目源代码中出现例如以下代码: HibernateTemplate ht =-- List<Object[]> tempList = ht.find(String querystring) ...
- 指向函数的指针 分类: C/C++ 2015-07-13 11:03 14人阅读 评论(0) 收藏
原文网址:http://www.cnblogs.com/zxl2431/archive/2011/03/25/1995285.html 讲的很清楚,备份记录. (一) 用函数指针变量调用函数 可以用指 ...
- C++ Virtual介绍 分类: C/C++ 2015-06-16 21:36 26人阅读 评论(0) 收藏
参考链接:http://www.cnblogs.com/xd502djj/archive/2010/09/22/1832912.html 学过C++的人都知道在类Base中加了Virtual关键字的函 ...
- LeetCode——Remove Element
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- C# StringExt 字符串扩展
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- oracle口令管理之允许某个用户最多尝试三次登录
如果一个用户连续三次登录失败,则锁定该用户两天,两天之后该用户才能重新登录. 创建profile文件: 更新账户: 三次登录失败后用户就会被锁定: 用户锁住之后要怎么给他解锁: 解锁之后就可以正常登录 ...
- 使用泛型定义一个可重用的Dao
dao用来和数据库进行交互,一个项目中,可能有用户表,产品表等等,不可能为每一个表都建立一个dao,使用泛型可以实现通吃. UserDao.java public class UserDao < ...
- 基于bootstrap的datetimepicker插件
1.当时使用的资源地址:http://www.bootcss.com/p/bootstrap-datetimepicker/ 2.如何让时间只显示到日期,不显示具体时刻 控制显示精度的是datetim ...
- JavaScript 应用开发 #5:为完成的任务添加样式
判断一下任务的状态,如果是完成的任务,可以在任务项目的上面,添加一个额外的 css 类,在这个 css 类里,可以去定义完成的任务的样式.比如,把文字的颜色变成浅友色,并且在文字上面添加一条删除线.这 ...