从基本的函数和WIN32API实现OGRE窗口
转载:http://lyme.blog.sohu.com/99908122.html
#include "Ogre.h"
#include "OgreConfigFile.h"
#include "OgreStringConverter.h"
#include "windows.h"
// declare wndproc
LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
// main func entry point
INT APIENTRY WinMain(HINSTANCE hInst,HINSTANCE,LPSTR strCmdLine,INT nCmdShow)
{
// code to create window
// ---------------------------------------------------------------------------------
char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;
// 用描述主窗口的参数填充WNDCLASSEX结构
wndclass.cbSize = sizeof(wndclass); //结构的大小
wndclass.style = NULL; //固定窗口大小
wndclass.lpfnWndProc = MainWndProc; //窗口函数指针
wndclass.cbClsExtra = 0; //没有额外的类内存
wndclass.cbWndExtra = 0; //没有额外的窗口内存
wndclass.hInstance = hInst; //实例句柄
wndclass.hIcon = ::LoadIcon(NULL,IDI_APPLICATION); //使用预定义图标
wndclass.hCursor = ::LoadCursor(NULL,IDC_ARROW); //使用预定义光标
wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
//使用白色背景画刷
wndclass.lpszMenuName = NULL; //不指定菜单
wndclass.lpszClassName = szClassName; //窗口类的名称
wndclass.hIconSm = NULL; //没有类的小图标
// 注册这个窗口类
::RegisterClassEx(&wndclass);
// 创建主窗口
HWND hwnd = ::CreateWindowEx(0,
szClassName,
"For Ogre Test!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
NULL,
NULL,
hInst,
NULL);
if(hwnd == NULL)
{
::MessageBox(NULL,"创建窗口出错!","error",MB_OK);
return -1;
}
// codes manage the ogre system
// ---------------------------------------------------------------------------------
using namespace Ogre;
// start by root
Root* root = new Root;
// load plugins
root->loadPlugin("RenderSystem_Direct3D9");
//root->loadPlugin(RenderSystem_GL);
root->loadPlugin("Plugin_OctreeSceneManager");
root->loadPlugin("Plugin_ParticleFX");
// set render system
RenderSystemList* mRSList = root->getAvailableRenderers();
RenderSystemList::iterator i = mRSList->begin();
std::string str = i[0]->getName();
::MessageBox(NULL,str.c_str(),"Renders",MB_OK);
RenderSystem* mRSys = root->getRenderSystemByName("Direct3D9 Rendering Subsystem");
if(mRSys == NULL)
::MessageBox(NULL,"cannot find d3d render","error",MB_OK);
root->setRenderSystem(mRSys);
mRSys->setConfigOption("Full Screen","No");
mRSys->setConfigOption("Video Mode","800 x 600 @ 32-bit colour");
// create render window
NameValuePairList opts;
opts["externalWindowHandle"] = StringConverter::toString(hwnd);
RenderWindow* mWindow = root->initialise(false);
mWindow = root->createRenderWindow("My Window",800,600,false,&opts);
//RenderWindow* mWindow = root->getAutoCreatedWindow();
// do not create log, just create LogManager
LogManager* logMgr = new LogManager;
Log* log = LogManager::getSingleton().createLog("mylog.log",true,true,false);
// create scene manager
SceneManager* sceneMgr = root->createSceneManager(ST_GENERIC);
sceneMgr = root->createSceneManager("TerrainSceneManager");
if(sceneMgr == NULL)
::MessageBox(NULL,"cannot create scene manager","error",MB_OK);
// create camera
Camera* cam = sceneMgr->createCamera("MainCamera");
Radian rad((Real)30.0f);
cam->setFOVy(rad);
cam->setNearClipDistance(5.0f);
cam->setFarClipDistance(1000.0f);
cam->setAspectRatio(Real(1.333333f));
// set rendering modes
PolygonMode mPolygonMode = PolygonMode::PM_SOLID;
cam->setPolygonMode(mPolygonMode);
// create viewport
Viewport* vp = mWindow->addViewport(cam);
vp->setBackgroundColour(ColourValue(15,15,15));
// create frame listener
//FrameListener* mFrameListener = new FrameListener;
// mount to root
//root->addFrameListener(mFrameListener);
// start rendering
root->startRendering();
//--------------------------------------------------------------------------------
// 显示窗口,刷新窗口客户区
::ShowWindow(hwnd,nCmdShow);
::UpdateWindow(hwnd);
// 从消息队列中取出消息,交给窗口函数处理,直到GetMessage返回FALSE,结束消息循环
MSG msg;
while(::GetMessage(&msg,NULL,0,0))
{ // 转化键盘消息
::TranslateMessage(&msg);
// 将消息发送到相应的窗口函数
::DispatchMessage(&msg);
}
// 当GetMessage返回FALSE的时候程序结束
return msg.wParam;
} //WinMain
// the wndproc func
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//char szText[] = "示例窗口~~ ";
switch(message)
{
/*case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc = ::BeginPaint(hwnd,&ps);
::TextOut(hdc,10,10,szText,strlen(szText));
::EndPaint(hdc,&ps);
return 0;*/
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
}
return ::DefWindowProc(hwnd,message,wParam,lParam);
} //MainWndProc