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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

Win32 或 MFC 下初始化OGRE 窗口 这个问题经常有人要问, 网上其实能够搜索得到, 为什么还有这么多人要问:一是,原来网上的版本有些旧, 会出一些错误二是, 可能不太清楚,今天我也写一个吧, 尽量详细,(可能也不太清楚^-^)(注: 今天的例子为了便于理解, 我使用Win32窗口的框架, 不用MFC, 当然,Win32窗口跟MFC其实是一样的, 稍微转化一下即可)新建一个Win32窗口的程序,本例子中名称为:Win32Ogre,所有 阅读详情

相关推荐

create windowl

      函数功能:该函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。该函数也指定该窗口的父窗口或所属窗口(如果存在的话),及窗口的菜单。若要使用除CreateWindow函数支持的风格外的扩展风格,则使用CreateWindowEx函数代替CreateWindow函数。    函数原型:HWND CreateWindow(LPC

518

ogre在Linux下如何创建窗口,一步步搭建Ogre - 菜鸟学Ogre教程_Linux编程_Linux公社-Linux系统门户网站...

这次的教程是完全脱离了wiki的框架,白手起家搭建OgreOgre的最基本的生命周期如下:1.创建根对象;2.定义Ogre将要用到的资源;3.选择并设置渲染引擎(指的是DirectX,OpenGL等等);4.创建渲染窗口;5.初始化资源;6.创建场景;7.设置第三方库插件;8.创建帧监听;9.开始渲染循环。第一步:创建Root对象Root对象是Ogre库的核心,它必须被最先创建。在头文件中加入...

weixin_34917128的博客 633

Ogre中的多窗口渲染方法

最近由于工作的关系,希望用一个3D图形引擎实现棋牌类的2D游戏桌面。为了提供尽可能好的兼容性,选择了Ogre作为后台渲染引擎,因为它的评价在开源3D引擎中很不错,而且同时支持OpenglD3D,所以没有多想就选择了它。到后期才发现,Ogre虽然是号称“Object Oriented Graphics Render Engine”,而且确实在场景,相机,窗口等等的三维对象的建模上做得相当不错,但是

痞子龙3D编程 3539

OGRE3D入门探索01:将渲染窗口嵌入到Win32窗口

从《OGRE3D引擎入门重拾》这篇文章开始,本系列关注OGRE3D渲染引擎及其周边应用。 本文以一个简单的示例来说明如何将Ogre的渲染窗口嵌入到另一个父窗口中, 为了增加趣味性(就是这么任性哈)我特意增加了FMOD的音乐播放支持。 首先将代码贴上来吧 /////////////////////////////////////////////////...

akzc42847的博客 344

oooo

为什么80%的码农都做不了架构师?>>> ...

weixin_33810006的博客 237

记录Ogre

// Do not add this to the application RenderSystem *rs = mRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem"); // or use "OpenGL Rendering Subsystem" mRoot->setRenderSystem(rs); rs->setConfig

zhang_475815的专栏 986

Ogre源码分析之Root类、Facade模式

Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点。因为它是整个Ogre引擎的外观(Façade)类。通过Root对象来开启停止Ogre是最简单的一种方式;当你构造构造一个Root实例的时候你就启动了整个Ogre,当析构的时候(让它停止活动或者执行delete删除它)Ogre也就关闭了。 API手册中这样介绍到:Ogre::Roo

无敌的专栏 3189

Ogre引擎源码——Timer

一个图形绘制引擎底层有很多工具类(utility),通过读基础工具类源码可以学习到不少东西。 本文通过解读Ogre的Timer来了解一般计时器的实现方式。

Benjamin's IT Life 4824

Ogre Timer 类 解析

Ogre Timer     一个图形绘制引擎底层有很多工具类(utility),通过读基础工具类源码可以学习到不少东西。         Ogre引擎中与Timer相关的文件大致不多,大致如下(只列出头文件) WIN32/OgreTimerImp.h GLX/OgreTimerImp.h OSX/OgreTimerImp.h iPhone/OgreTimerImp.h

终极程序 963

Ogre 实用技巧

如何用ExampleApplication建立一个应用程序如果你还不知道这个是如何工作的,你必须在Ogre指南章节中读更多关于这个的知识:完全理解它确实很重要。简言之,它需要创建一个继承自ExampleApplication的类(class)。这个类能够执行函数createScene()及createFrameListener()。它大致上看上去如下:#include "ExampleAp

痞子龙3D编程 2892

Ogre源码分析(一)Root类,Facade模式

<br />Ogre中的Root对象是一个Ogre应用程序的主入口点。因为它是整个Ogre引擎的外观(Façade)类。通过Root对象来开启停止Ogre是最简单的一种方式;当你构造构造一个Root实例的时候你就启动了整个Ogre,当析构的时候(让它停止活动或者执行delete删除它)Ogre也就关闭了。<br />API手册中这样介绍到:Ogre::Root 类代表了客户应用程序的入口点。在这里,应用程序可以获得系统的重要的访问权,也就是获取渲染系统 ,管理配置文件,日志,访问系统的其他类(果然是Fa

rbagglo的专栏 2755

转:Ogre源码分析之Root类、Facade模式

Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点。因为它是整个Ogre引擎的外观(Façade)类。通过Root对象来开启停止Ogre是最简单的一种方式;当你构造构造一个Root实例的时候你就启动了整个Ogre,当析构的时候(让它停止活动或者执行delete删除它)Ogre也就关闭了。 API手册中这样介绍到:Ogre...

aolan7349的博客 151

Ogre应用指南

如何用ExampleApplication建立一个应用程序 如果你还不知道这个是如何工作的,你必须在Ogre指南章节中读更多关于这个的知识:完全理解它确实很重要。简言之,它需要创建一个继承自ExampleApplication的类(class)。这个类能够执行函数createScene()及createFrameListener()。它大致上看上去如下: #include "ExampleAp

linxv01的专栏 505

Ogre 实用技巧-基础、涉及各个方面

转自:http://blog.csdn.net/pizi0475/article/details/5451188 如果你还不知道这个是如何工作的,你必须在Ogre指南章节中读更多关于这个的知识:完全理解它确实很重要。简言之,它需要创建一个继承自ExampleApplication的类(class)。这个类能够执行函数createScene()及createFrameListener()。它大致上

Wait的专栏 854

从零配置OGRE 3D引擎:C++图形开发入门与旋转立方体实战

3D图形渲染引擎是现代游戏开发可视化应用的核心组件,它封装了底层图形API的复杂性,为开发者提供了高效的场景管理与渲染能力。其技术价值在于平衡性能与易用性,让开发者能够专注于内容创作与逻辑实现,广泛应用于游戏、仿真、数据可视化等领域。本文以经典的OGRE引擎为例,通过详细的编译配置依赖管理指南,结合CMake构建工具vcpkg包管理器,手把手带领读者完成环境搭建,并实现一个包含光照与动画的旋转立方体示例,深入讲解场景图、资源管理等核心概念。

weixin_33739541的博客 327
上一篇: bmp2png---using libpng
下一篇: lua cmake
pubhobo
博客等级 码龄19年 20粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值