OSG+Duilib显示osg
2016-06-13 23:35
232 查看
OSG+VS2015+Win10配置
OSG-Win32窗口显示osg
今天就分享一下duilib中如何显示osg。
duilib库这里不作过多的介绍,duilib的配置也很简单。
我们直接新建一个win32工程:
xml文件
新建头文件
main_windows.h
用于定义我们的窗口类:
接下来实现OsgWnd :
新建源文件
main_window.cc
新建源文件
main.cc:
运行结果:
![](http://img.blog.csdn.net/20160613232510338)
notice
这个跟之前的win32程序下显示osg没有什么大的区别,注意这个:
windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
如果注释上面的这句话,运行结果为
![](http://img.blog.csdn.net/20160613232925437)
可以看到osg与duilib没有了任何关系,osg显示为
traits->x = 10;
traits->y = 20;
traits->width = 100;
traits->height = 80;
OSG-Win32窗口显示osg
今天就分享一下duilib中如何显示osg。
duilib库这里不作过多的介绍,duilib的配置也很简单。
我们直接新建一个win32工程:
xml文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 窗口的初始尺寸 --> <Window size="1900,950" caption="0,0,0,32" roundcorner="2,2"> <Font id="0" name="微软雅黑" size="12" bold="false"/> <Font id="1" name="微软雅黑" size="14" bold="false"/> <Font id="2" name="微软雅黑" size="13" bold="true"/> <!-- 整个窗口的背景 --> <VerticalLayout bkcolor="FFF6F6FA"> <VerticalLayout name="BrowserClientLayout" bkcolor="FFF6F6F6"/> </VerticalLayout > </Window>
新建头文件
main_windows.h
用于定义我们的窗口类:
#include "UIlib.h" class OsgWnd : public DuiLib::WindowImplBase { public: OsgWnd() {} virtual ~OsgWnd() {} protected: // Override -------------------------------------------------------- virtual LPCTSTR GetWindowClassName() const override { return _T("OsgWnd"); } virtual DuiLib::CDuiString GetSkinFile() override { return _T("main.xml"); } virtual DuiLib::CDuiString GetSkinFolder() override { return _T(""); } virtual void InitWindow() override; virtual void OnFinalMessage(HWND hWnd) override; virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) override; virtual void Notify(DuiLib::TNotifyUI& msg) override; virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) override; private: };
接下来实现OsgWnd :
新建源文件
main_window.cc
#include "main_window.h" #include<map> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgViewer/api/win32/GraphicsWindowWin32> #include <osgUtil/Optimizer> #include <osgGA/TrackballManipulator> #include <osgDB/ReadFile> #include <process.h> osg::ref_ptr<osgViewer::Viewer> viewer; osg::observer_ptr<osgViewer::GraphicsWindow> window; osg::ref_ptr<osg::Group> root; osg::ref_ptr<osg::Node> loadedModel; osgUtil::Optimizer optimizer; osg::ref_ptr<osg::GraphicsContext::Traits> traits; osg::ref_ptr<osg::Referenced> windata; osg::GraphicsContext* gc; osg::ref_ptr<osg::Camera> camera; bool renderok; LRESULT OsgWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LRESULT res = __super::OnCreate(uMsg, wParam, lParam, bHandled); LONG styleValue = ::GetWindowLong(*this, GWL_STYLE); styleValue &= ~WS_CAPTION; ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); return res; } void render(void* ptr) { while (!viewer->done()) { viewer->frame(); } renderok = true; } void OsgWnd::InitWindow() { root = new osg::Group; loadedModel = osgDB::readNodeFile("cessna.osg"); optimizer.optimize(loadedModel.get()); optimizer.reset(); root->addChild(loadedModel.get()); traits = new osg::GraphicsContext::Traits; windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd); traits->x = 10; traits->y = 20; traits->width = 100; traits->height = 80; traits->windowDecoration = false; traits->doubleBuffer = true; traits->sharedContext = 0; traits->inheritedWindowData = windata; traits->setInheritedWindowPixelFormat = true; gc = osg::GraphicsContext::createGraphicsContext(traits.get()); camera = new osg::Camera; camera->setGraphicsContext(gc); camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height)); viewer = new osgViewer::Viewer; viewer->addSlave(camera.get()); viewer->setSceneData(root.get()); viewer->setCameraManipulator(new osgGA::TrackballManipulator); viewer->addEventHandler(new osgViewer::StatsHandler); viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer->realize(); renderok = false; _beginthread(render, 0, NULL); } void OsgWnd::OnFinalMessage(HWND hWnd) { } void OsgWnd::Notify(DuiLib::TNotifyUI& msg) { __super::Notify(msg); } LRESULT OsgWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { return __super::HandleMessage(uMsg, wParam, lParam); }
新建源文件
main.cc:
#include "UIlib.h" #include "main_window.h" using namespace DuiLib; #ifdef _DEBUG # ifdef _UNICODE # pragma comment(lib, "DuiLib_ud.lib") # else # pragma comment(lib, "DuiLib_d.lib") # endif #else # ifdef _UNICODE # pragma comment(lib, "DuiLib_u.lib") # else # pragma comment(lib, "DuiLib.lib") # endif #endif using DuiLib::CPaintManagerUI; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); OsgWnd duiFrame; duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); duiFrame.CenterWindow(); duiFrame.ShowModal(); return 0; }
运行结果:
notice
这个跟之前的win32程序下显示osg没有什么大的区别,注意这个:
windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
如果注释上面的这句话,运行结果为
可以看到osg与duilib没有了任何关系,osg显示为
traits->x = 10;
traits->y = 20;
traits->width = 100;
traits->height = 80;
相关文章推荐
- 程序,控制期和view的生命周期
- include require区别
- request.getSession()方法的应用
- requestWindowFeature()为什莫要放在setContentView(0前面
- Uiautomator2——1
- LightOJ——1012Guilty Prince(连通块并查集)
- [javaSE] GUI(练习-列出指定目录内容)
- LeetCode-232.Implement Queue using Stacks
- break,continue在循环语句中的具体用法
- 静电的ui教程
- 生成随机字符串(UUID方法)
- 调整UILabel行高间距并返回自定义宽高度
- @RequestBody 和@ResponseBody 注解详解
- Top K Frequent Elements
- 从零开始做UI-静电的sketch设计教室 视频教程
- 消息推送业务逻辑处理 “MessageUI”
- 【转】iOS学习之Storyboard中的UIScrollView使用自动布局
- Android UI 之 Tab类型界面总结
- 在Jenkins中使用Git托管项目的源码创建Build Job(托管在GitHub上面)
- BUI之遮罩层