zoukankan      html  css  js  c++  java
  • 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,开始进行消息循环。那么进行到这里,整个应用程序就创建完成了。

  • 相关阅读:
    vs2005新控件演示系列之 向导《Wizard》
    搬家、钱、欲望、环境与命运
    母版页里面查找Repeater内控件,并构造URL
    恭喜哦!我在这里排名到250了!)(*&^%$#
    sql查询语言[我是网管论坛转载的精华贴]
    WCF 3.5对HTTP编程的增强
    WCF基础知识问与答
    印第安人的灵魂——敏捷回顾
    元数据交换绑定的秘密
    “轻松掌握WCF 帮你找到入门砖”访谈实录
  • 原文地址:https://www.cnblogs.com/tszhao/p/3161328.html
Copyright © 2011-2022 走看看