使用WTL+OGRE编写3D程序(2) - 窗口消息函数
2013-03-03 17:49
337 查看
(接上文)
我使用一个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的初始化以及渲染时机的问题,在下一节我会完成最后这部分(也是最重要部分)的讲述。
我使用一个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的初始化以及渲染时机的问题,在下一节我会完成最后这部分(也是最重要部分)的讲述。
相关文章推荐
- 使用WTL+OGRE编写3D程序(4) - 多窗口的渲染
- 使用WTL+OGRE编写3D程序(1) - 基本框架
- 使用WTL+OGRE编写3D程序(3) - 场景的创建和渲染
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
- 编写一个程序,使用getpid函数来获取当前进程的进程ID
- 使用Qt Designer和手动编写代码两种方式实现多窗口切换程序(Qt基础)
- GUI程序如何使用控制台输出调试信息[zz][MFC调用win32窗口显示调试信息,使用AllocConsole 函数 ]
- 一次配置 使用opencv库中的函数编写程序需要配置环境
- C语言宏定义##连接符和#符的使用(MFC就是靠##自动把消息和消息函数对应起来了,借助宏来减少switch case代码的编写量)
- windows下32位汇编语言学习笔记 第四章 第一个窗口程序 1 (消息的使用和入口代码)
- 编写程序删除一个字符串(不能使用任何操纵字符串的函数,不使用下标)
- C#编写Windows服务程序 (服务端),客户端使用 消息队列 实现淘宝 订单全链路效果
- 编写一个程序,要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。 程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。 请使用3个数组处理函数来分别进行输入、显示和计算
- 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的
- 使用Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法
- [VB.NET]各们,请问如何使用vb.net编写两个进程间消息通信的程序啊
- 编写一段程序,从标准输入读取string对象的序列直到连续出现两个相同的单词或者所有单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次是使用break语句终止循环。输出连续重复出现的单词,或者输出一个消息说明没有人任何单词是重复出现的。
- 编写一个函数,接受三个string参数,s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用他替换通用的简写形式,如,将“tho”,将“”“”
- 1.19 编写函数reverse(s)将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。
- C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果