通过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 窗口的创建过程的更多相关文章

  1. 有谁知道Delphi中"窗口"的创建过程?

      求助:有谁知道Delphi中窗口的创建过程,此“窗口”不仅仅指 TForm 类型, 还包括一般的窗口控件,如TButton,TEdit等等,希望有能够十分详细的运作 过程,比如说CreatPara ...

  2. vc++窗口的创建过程(MFC消息机制的经典文章)

    一.什么是窗口类  在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...

  3. VC++窗口创建过程,图形绘制,时钟程序

    创建窗口步骤: (1)注册窗口类(RegisterClassEx) (2)创建窗口(CreateWindowEx) (3)在桌面显示窗口(ShowWindow) (4)更新窗口客户区(UpdateWi ...

  4. Hystrix核心基础 - 滑动窗口创建过程及demo

    前言 RxJava可能有些小伙伴没有听过是什么东西,可能是因为大家平时在做业务需求的时候对异步编程了解得比较少,而RxJava就是这么一个响应式编程框架,RxJava在安卓上面用得非常多,做安卓的朋友 ...

  5. XMPie部署与创建过程 - 快速指南

    XMPie部署与创建过程 1PhotoShop.Indesign.VS2013关系.作用.使用 .1.1目的与过程 1. Photoshop负责导出cpkg文件. 1.1 动态性 如果你想要生成动态的 ...

  6. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  7. uCGUI窗口的创建过程分析

    一.相关结构体和变量 窗口管理结构体 /* 窗口管理结构体 共30个字节 */ struct WM_Obj { GUI_RECT Rect; //窗口尺寸(x0,y0,x1,y1) 8个字节 GUI_ ...

  8. Android Context创建过程

        特定的资源或者类构成了Android应用程序的运行上下文环境 PackageManager, ClassLoader, Assert等等 Android应用程序窗口的运行上下文环境是通过Con ...

  9. win32 api Windows窗口的创建

    windows窗口的创建有以下几个步骤: 1.创建注册窗口类 2.创建窗口句柄 3.显示更新窗口 4.消息循环 1.创建注册窗口类 所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始 ...

随机推荐

  1. debug.keystore文件不存在解决办法

    重装系统之后,丢失了debug.keystore,找了很久都没有找到,根据网上所讲的只要重新运行一个android项目;就会在avd中生成一个新的debug.keystroe,此法也没解决,索性直接重 ...

  2. 获取手机root的方法

  3. C# 可访问一致性不一致

    出现原因,其中一个是返回参数的访问级别小于函数的访问级别, 也就是说当定义一个返回参数的方法的时候,如果返回参数的访问级别低于方法的访问级别就会出现这样的错误,这个是可以理解的,如果返回的参数不能被访 ...

  4. Java的RandomAccessFile

    Java的RandomAccessFile提供对文件的读写功能,与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方.这就是“Random”的意义所在. Rando ...

  5. thinkphp中session跨域问题

    问题描述 <thinkphp实现短信验证注册>中,小编不止记录了短信验证码的实现方法,同时还记录了图片验证码的实现方法. 本地使用,一切正常:后端项目和前端项目都部署到服务器,一切正常:后 ...

  6. iOS开发-javaScript交互

    前言 当前混合开发模式迎来了前所未有的发展,跨平台开发.热更新等优点决定了这种模式的重要地位.虽然前端界面在交互.动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受.在iOS ...

  7. Pagekit安装

    Pagekit 是一个模块化,轻量的 CMS 系统,基于现代化的技术,如 Symfony 组件和 Doctrine.它提供了一个很好的平台,用于主题和延伸开发.Pagekit 为您提供了工具来创造美丽 ...

  8. 程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  9. javascript通过字典思想操作数据

    作为一名前端程序猿,相对于后端操作数据的机会较少.然而,有些时候因为一些特殊的原因(如:需要构造成对应插件需要的数据格式,需要返回特定的数据格式等)而不得不对数据进行筛选.重构.相对于后端语言,我们没 ...

  10. [PDF] PDFOperation--C#PDF文件操作帮助类 (转载)

    点击下载 PDFOperation.rar 这个类是关于PDFOperation的帮助类,主要是实现C#PDF的文件操作,具体实现功能如下1.构造函数2.私有字段3.设置字体4.设置页面大小5.实例化 ...