(接上文)
我使用一个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;
}
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的初始化以及渲染时机的问题,在下一节我会完成最后这部分(也是最重要部分)的讲述。