123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- <html>
- <head>
- <title>Irrlicht Engine Tutorial</title>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- </head>
- <body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
- <br>
- <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
- <tr>
- <td bgcolor="#666699" width="10"><b><a href="http://irrlicht.sourceforge.net" target="_blank"><img src="../../media/irrlichtlogo.jpg" width="88" height="31" border="0"></a></b></td>
- <td bgcolor="#666699" width="100%">
- <div align="center">
- <div align="left"><b><font color="#FFFFFF">Tutorial 14. Win32 Window</font></b></div>
- </div>
- </td>
- </tr>
- <tr bgcolor="#eeeeff">
- <td height="90" colspan="2">
- <div align="left">
- <p> This example only runs in Windows and demonstrates that Irrlicht can
- run inside a win32 window. MFC and .NET Windows.Forms windows are possible
- too. </p>
- <p>The program which is described here will look like this:</p>
- <p align="center"><img src="../../media/014shot.jpg" width="256" height="200"><br>
- </p>
- </div>
- </td>
- </tr>
- </table>
- <br>
- <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
- <tr>
- <td bgcolor="#666699"> <b><font color="#FFFFFF">Lets start!</font></b></td>
- </tr>
- <tr>
- <td height="90" bgcolor="#eeeeff" valign="top"> <div align="left">
- <div align="left">
- <p> In the begining, we create a windows window using the windows API.
- I'm not going to explain this code, because it is windows specific.
- See the MSDN or a windows book for details.</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre>#include <irrlicht.h>
- #include <windows.h> <font color="#006600">// this example only runs with windows</font>
- using namespace irr;
- #pragma comment(lib, "irrlicht.lib")
- HWND hOKButton;
- HWND hWnd;
- static LRESULT CALLBACK CustomWndProc(HWND hWnd, UINT message,
- WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_COMMAND:
- {
- HWND hwndCtl = (HWND)lParam;
- int code = HIWORD(wParam);
- if (hwndCtl == hOKButton)
- {
- DestroyWindow(hWnd);
- PostQuitMessage(0);
- return 0;
- }
- }
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- int main()
- <font color="#006600">//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hpre, LPSTR cmd, int cc)</font>
- {
- HINSTANCE hInstance = 0;
- <font color="#006600"> // create dialog</font>
- const char* Win32ClassName = "CIrrlichtWindowsTestDialog";
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = (WNDPROC)CustomWndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = DLGWINDOWEXTRA;
- wcex.hInstance = hInstance;
- wcex.hIcon = NULL;
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
- wcex.lpszMenuName = 0;
- wcex.lpszClassName = Win32ClassName;
- wcex.hIconSm = 0;
- RegisterClassEx(&wcex);
- DWORD style = WS_SYSMENU | WS_BORDER | WS_CAPTION |
- WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_MAXIMIZEBOX
- | WS_MINIMIZEBOX | WS_SIZEBOX;
- int windowWidth = 440;
- int windowHeight = 380;
- hWnd = CreateWindow( Win32ClassName, "Irrlicht Win32 window example",
- style, 100, 100, windowWidth, windowHeight,
- NULL, NULL, hInstance, NULL);
- RECT clientRect;
- GetClientRect(hWnd, &clientRect);
- windowWidth = clientRect.right;
- windowHeight = clientRect.bottom;
- <font color="#006600"> // create ok butt</font>on
- hOKButton = CreateWindow(
- "BUTTON", "OK - Close", WS_CHILD | WS_VISIBLE | BS_TEXT,
- windowWidth - 160, windowHeight - 40, 150, 30, hWnd, NULL,
- hInstance, NULL);
- <font color="#006600"> // create some text</font>
-
- CreateWindow("STATIC",
- "This is Irrlicht running inside a standard Win32 window.\n"\
- "Also mixing with MFC and .NET Windows.Forms is possible.",
- WS_CHILD | WS_VISIBLE, 20, 20, 400, 40, hWnd, NULL, hInstance, NULL);
- <font color="#006600"> // create window to put irrlicht in</font>
- HWND hIrrlichtWindow =<br /> CreateWindow("BUTTON", "", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
- 50, 80, 320, 220, hWnd, NULL, hInstance, NULL);
- </pre></td>
- </tr>
- </table>
- <p>So now that we have some window, we can create an Irrlicht device
- inside of it. We use Irrlicht createEx() function for this. We only
- need the handle (HWND) to that window, set it as windowsID parameter
- and start up the engine as usual. That's it.</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre><font color="#006600"> // create irrlicht device in the button window</font>
- irr::SIrrlichtCreationParameters param;
- param.WindowId = reinterpret_cast<s32>(hIrrlichtWindow); // hColorButton
- param.DriverType = video::EDT_OPENGL;
- irr::IrrlichtDevice* device = irr::createDeviceEx(param);
-
- <font color="#006600"> // setup a simple 3d scene</font>
- irr::scene::ISceneManager* smgr = device->getSceneManager();
- video::IVideoDriver* driver = device->getVideoDriver();
- scene::ICameraSceneNode* cam = smgr->addCameraSceneNode();
- cam->setTarget(core::vector3df(0,0,0));
- scene::ISceneNodeAnimator* anim =
- smgr->createFlyCircleAnimator(core::vector3df(0,10,0), 30.0f);
- cam->addAnimator(anim);
- anim->drop();
- scene::ISceneNode* cube = smgr->addCubeSceneNode(25);
- cube->setMaterialFlag(video::EMF_LIGHTING, false);
-
- cube->setMaterialTexture(0, driver->getTexture("../../media/rockwall.bmp"));
- smgr->addSkyBoxSceneNode(
- driver->getTexture("../../media/irrlicht2_up.jpg"),
- driver->getTexture("../../media/irrlicht2_dn.jpg"),
- driver->getTexture("../../media/irrlicht2_lf.jpg"),
- driver->getTexture("../../media/irrlicht2_rt.jpg"),
- driver->getTexture("../../media/irrlicht2_ft.jpg"),
- driver->getTexture("../../media/irrlicht2_bk.jpg"));
- <font color="#006600"> // show and execute dialog</font>
- ShowWindow(hWnd , SW_SHOW);
- UpdateWindow(hWnd);
- </pre></td>
- </tr>
- </table>
- <p>Now the only thing missing is the drawing loop using IrrlichtDevice::run().
- We do this as usual. But instead of this, there is another possibility:
- You can also simply use your own message loop using GetMessage, DispatchMessage
- and whatever. Calling<br />
- Device->run() will cause Irrlicht to dispatch messages internally
- too. You need not call Device->run() if you want to do your own
- message dispatching loop, but Irrlicht will not be able to fetch user
- input then and you have to do it on your own using the window messages,
- DirectInput, or whatever.</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre> while (device->run())
- {
- driver->beginScene(true, true, 0);
- smgr->drawAll();
- driver->endScene();
- }
- <font color="#006600"> // the alternative, own message dispatching loop without Device->run() would
- // look like this:</font>
- <font color="#006600">/*MSG msg;
- while (true)
- {
- if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- if (msg.message == WM_QUIT)
- break;
- }
-
- // advance virtual time
- device->getTimer()->tick();
- // draw engine picture
- driver->beginScene(true, true, 0);
- smgr->drawAll();
- driver->endScene();
- }*/</font>
- device->closeDevice();
- device->drop();
- return 0;
- }</pre></td>
- </tr>
- </table>
- <p> That's it, Irrlicht now runs in your own windows window.</p>
- </div>
- </div>
- </td>
- </tr>
- </table>
- <p> </p>
- </body>
- </html>
|