从基本的函数和WIN32API实现OGRE窗口

从基本的函数和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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值