irrwowview

Tutorial 14: Win32 Window

Tutorial 14: Win32 Window
这个例子演示如何把IrrLicht嵌到win32窗口中运行。当然在MFCdotNET窗口框架中使用也是没问题的。

程序效果如下图所示:

 

Lets start!

首先,我们使用windows API创建一个windows窗口。我不打算解释这些代码,因为这是windows系统特有的。要得到详细资料可以查看MSDN或者windows方面的书。

#include <irrlicht.h>

 

#include <windows.h> // this example only runs with windows

 

 

 

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()

 

//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hpre, LPSTR cmd, int cc)

 

{

 

          HINSTANCE hInstance = 0;

 

          // create dialog

 

 

 

          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;

 

 

 

          // create ok button

 

 

 

          hOKButton = CreateWindow(

 

              "BUTTON", "OK - Close", WS_CHILD | WS_VISIBLE | BS_TEXT,

 

                    windowWidth - 160, windowHeight - 40, 150, 30, hWnd, NULL,

 

                    hInstance, NULL);

 

 

 

          // create some text

 

         

 

          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);

 

 

 

          // create window to put irrlicht in

 

 

 

          HWND hIrrlichtWindow =
    CreateWindow("BUTTON", "", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,

 

                               50, 80, 320, 220, hWnd, NULL, hInstance, NULL);

 

 

 

这样,我们就拥有一些窗口了,可以创建一个IrrLicht设备嵌窗口。为此我们使用IrrLichtcreateEx()函数。只需要窗口的句柄(HWND)作为windowsID参数并启动引擎。这就可以了。

          // create irrlicht device in the button window

 

 

 

          irr::SIrrlichtCreationParameters param;

 

          param.WindowId = reinterpret_cast(hIrrlichtWindow); // hColorButton

 

          param.DriverType = video::EDT_OPENGL;

 

 

 

          irr::IrrlichtDevice* device = irr::createDeviceEx(param);

 

         

 

          // setup a simple 3d scene

 

 

 

          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"));

 

 

 

          // show and execute dialog

 

 

 

          ShowWindow(hWnd , SW_SHOW);

 

          UpdateWindow(hWnd);

 

现在只缺调用IrrLichtDevice::run()方法进行绘制循环了。通常的做法就行了。但这里有另一种替换的写法:你可以使用GetMessage()DispatchMessage()等函数写自己的消息循环。而调用Device->run()会导致由IrrLicht分派消息。如果你想使用自己的消息循环,可以不调用Device->run()方法,但这样IrrLicht引擎将不会接收用户的输入,而你必须自己使用窗口消息,DirectInput等。

          while (device->run())

 

          {

 

                    driver->beginScene(true, true, 0);

 

                    smgr->drawAll();

 

                    driver->endScene();

 

          }

 

 

 

          // the alternative, own message dispatching loop without Device->run() would

 

          // look like this:

 

 

 

          /*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();

 

          }*/

 

 

 

          device->closeDevice();

 

          device->drop();

 

 

 

          return 0;

 

}

就这样,IrrLicht可以运行在你的windows窗口了。

 

posted on 2008-07-04 11:28 shjy 阅读(284) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理