-----由ARRAY创作,,自由传播~~~~
下面是一个OSG嵌入Win32 API窗口的例子,我自己没事琢磨的~~应该有不少冗余和没用的地方,不过保证是可以用的~~在家里的豪华配置的电脑上(Intel Core 1.78G,Geforce7600GS)偶尔遇到帧速变得很慢的情形,不过在实验室的破机器上(AMD2600,Radeon7500)运行很流畅,呵呵,不知道是什么原因,还请大家指正~~
这个Win32API窗口的例子中,OSG的部分是参考MFC和其它GUI库的嵌入方法设计的,使用了Windows的多线程函数来执行osgViewer的渲染,这一点和MFC的例子相同。
Win32窗口的部分可以参照Win32窗口编程的任意一本书籍,架构都是基本一样的~~事实上研究Win32 API编程对于学习Windows本身极其有好处,而且像MiniGUI这样的GUI库也是模仿Win32 API窗口的函数来构建的,方便学习代码的移植~~
(虽然现在还不可能移植~~MiniGUI不支持OpenGL -______-)
下周可能还会有些事情,然后我打算对2.0版本的一些例子程序作注释,以利自己和大家学习;还有正在做一个OSG加工仿真相关的项目。
另外还有就是OSGQSG翻译的事:其实第三章已经翻译完成了,我和作者Paul Martz联系并获得CGSD的翻译授权之后,已经决定将中文版放在lulu.com(也就是大家下载英文版的地方)上供免费下载,这一工作预计将在数周后完成,主要是文字校对和排版的工作,到时候可能也有纸质的版本可供购买,呵呵,谢谢大家支持。(我不从中获益的,所以这个不算广告,呵呵~~)
-------------------------------------------------------
- #include <windows.h>
- #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 CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
- {
- static TCHAR szAppName[] = TEXT("HelloWin");
- HWND hwnd;
- MSG msg;
- WNDCLASS wndclass;
- wndclass.style = CS_HREDRAW | CS_VREDRAW;
- wndclass.lpfnWndProc = WndProc;
- wndclass.cbClsExtra = 0;
- wndclass.cbWndExtra = 0;
- wndclass.hInstance = hInstance;
- wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
- wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
- wndclass.lpszMenuName = NULL;
- wndclass.lpszClassName = szAppName;
- if (!RegisterClass(&wndclass))
- {
- MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
- return 0;
- }
- hwnd = CreateWindow( szAppName, // window class name
- TEXT ("The Hello Program"), // window caption
- WS_OVERLAPPEDWINDOW, // window style
- 100, // initial x position
- 100, // initial y position
- 800, // initial x size
- 600, // initial y size
- NULL, // parent window handle
- NULL, // window menu handle
- hInstance, // program instance handle
- NULL); // creation parameters
- ShowWindow(hwnd, iCmdShow);
- UpdateWindow(hwnd);
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return (int)msg.wParam;
- }
- void render(void* ptr)
- {
- while (!viewer->done())
- {
- viewer->frame();
- }
- renderok = true;
- }
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_CREATE:
- root = new osg::Group;
- loadedModel = osgDB::readNodeFile("D:/OpenSceneGraph/bin/exe/cessna.osg");
- if (!loadedModel)
- return 1;
- optimizer.optimize(loadedModel.get());
- optimizer.reset();
- root->addChild(loadedModel.get());
- traits = new osg::GraphicsContext::Traits;
- windata = new osgViewer::GraphicsWindowWin32::WindowData(hwnd);
- traits->x = 0;
- traits->y = 0;
- traits->width = 800;
- traits->height = 600;
- 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);
- return 0;
- case WM_PAINT:
- return 0;
- case WM_DESTROY:
- viewer->setDone(true);
- while (!renderok)
- {
- Sleep(10);
- }
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
- }