使用WTL+OGRE编写3D程序(2) - 窗口消息函数

来源:互联网 发布:风油精 知乎 肛门 编辑:程序博客网 时间:2024/06/07 04:10

(接上文)

我使用一个Static渲染3D场景,最基本的需要我们处理的消息和这些消息中的任务是:

WM_PAINT     ---         在窗口更新时将3D场景渲染到窗口

WM_SIZE       ---         在窗口大小改变时更新相应的场景大小和比例,当然对于Static之类的控件来说没有什么必要,但是如果你想在一个一般的View里渲染,这是必须的

WM_CREATE ---        完成OGRE的初始化

WM_DESTROY/WM_QUIT --- 完成OGRE的释放

WM_ERASEBKG --- 这个没什么用,直接返回TRUE告诉系统我们将自己绘制背景

下面是消息响应函数的代码:

 

// Message Handler
public:
    LRESULT OnCreate(UINT 
/*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        Initialize();
        bHandled 
= FALSE;
        
return 1;
    }

    LRESULT OnEraseBackground(UINT 
/*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        
return 1;   // no background needed
    }

    LRESULT OnPaint(UINT 
/*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        T
* pT = static_cast<T*>(this);
        
if(wParam != NULL)
        {
            pT
->Render((HDC)wParam);
        }
        
else
        {
            CPaintDC dc(m_hWnd);
            pT
->Render(dc.m_hDC);
        }
        
return 0;
    }

    LRESULT OnSize(UINT 
/*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
    {        
        
if(m_pRenderWindow)
        {
            m_pRenderWindow
->resize(LOWORD(lParam), HIWORD(lParam));
        }

        bHandled 
= FALSE;
        
return 1;
    }

    LRESULT OnQuit(UINT 
/*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {        
        T
* pT = static_cast<T*>(this);
        pT
->ReleaseOgre();

        SAFE_DELETE(m_pRoot);

        bHandled 
= FALSE;
        
return 1;
    }

 其中m_pRenderWindow是OGRE创建的一个渲染窗口,Render是主要的渲染函数,Initialize中完成了OGRE的初始化,OK,到这里窗口控件方面的工作基本完成了,接下来主要是关于OGRE的初始化以及渲染时机的问题,在下一节我会完成最后这部分(也是最重要部分)的讲述。

原创粉丝点击