Remove WinCE support
This commit is contained in:
parent
952128928a
commit
9a0eacdfdb
@ -55,7 +55,6 @@ source/Irrlicht/CAnimatedMeshMD2.cpp
|
|||||||
source/Irrlicht/CZipReader.cpp
|
source/Irrlicht/CZipReader.cpp
|
||||||
source/Irrlicht/CImageLoaderPNG.cpp
|
source/Irrlicht/CImageLoaderPNG.cpp
|
||||||
source/Irrlicht/CImageLoaderBMP.cpp
|
source/Irrlicht/CImageLoaderBMP.cpp
|
||||||
source/Irrlicht/CIrrDeviceWinCE.cpp
|
|
||||||
source/Irrlicht/CVolumeLightSceneNode.cpp
|
source/Irrlicht/CVolumeLightSceneNode.cpp
|
||||||
source/Irrlicht/CDefaultSceneNodeAnimatorFactory.cpp
|
source/Irrlicht/CDefaultSceneNodeAnimatorFactory.cpp
|
||||||
source/Irrlicht/CSkyDomeSceneNode.cpp
|
source/Irrlicht/CSkyDomeSceneNode.cpp
|
||||||
@ -284,7 +283,6 @@ source/Irrlicht/CTriangleSelector.h
|
|||||||
source/Irrlicht/CParticleGravityAffector.h
|
source/Irrlicht/CParticleGravityAffector.h
|
||||||
source/Irrlicht/CGUIModalScreen.h
|
source/Irrlicht/CGUIModalScreen.h
|
||||||
source/Irrlicht/CDefaultSceneNodeFactory.h
|
source/Irrlicht/CDefaultSceneNodeFactory.h
|
||||||
source/Irrlicht/CIrrDeviceWinCE.h
|
|
||||||
source/Irrlicht/CImageLoaderPPM.h
|
source/Irrlicht/CImageLoaderPPM.h
|
||||||
source/Irrlicht/CXMLReaderImpl.h
|
source/Irrlicht/CXMLReaderImpl.h
|
||||||
source/Irrlicht/COpenGLMaterialRenderer.h
|
source/Irrlicht/COpenGLMaterialRenderer.h
|
||||||
|
@ -553,64 +553,6 @@ precision will be lower but speed higher. currently X86 only
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// XBox does not have OpenGL or DirectX9
|
|
||||||
#if defined(_IRR_XBOX_PLATFORM_)
|
|
||||||
#undef _IRR_COMPILE_WITH_OPENGL_
|
|
||||||
#undef _IRR_COMPILE_WITH_DIRECT3D_9_
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//! WinCE does not have OpenGL or DirectX9. use minimal loaders
|
|
||||||
#if defined(_WIN32_WCE)
|
|
||||||
#undef _IRR_COMPILE_WITH_OPENGL_
|
|
||||||
#undef _IRR_COMPILE_WITH_DIRECT3D_8_
|
|
||||||
#undef _IRR_COMPILE_WITH_DIRECT3D_9_
|
|
||||||
|
|
||||||
#undef BURNINGVIDEO_RENDERER_BEAUTIFUL
|
|
||||||
#undef BURNINGVIDEO_RENDERER_FAST
|
|
||||||
#undef BURNINGVIDEO_RENDERER_ULTRA_FAST
|
|
||||||
#define BURNINGVIDEO_RENDERER_CE
|
|
||||||
|
|
||||||
#undef _IRR_COMPILE_WITH_WINDOWS_DEVICE_
|
|
||||||
#define _IRR_COMPILE_WITH_WINDOWS_CE_DEVICE_
|
|
||||||
//#define _IRR_WCHAR_FILESYSTEM
|
|
||||||
|
|
||||||
#undef _IRR_COMPILE_WITH_IRR_MESH_LOADER_
|
|
||||||
//#undef _IRR_COMPILE_WITH_MD2_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_MD3_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_3DS_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_COLLADA_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_CSM_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_BSP_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_DMF_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_LMTS_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_MY3D_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_OBJ_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_OCT_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_OGRE_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_LWO_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_STL_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_IRR_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_COLLADA_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_STL_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_OBJ_WRITER_
|
|
||||||
//#undef _IRR_COMPILE_WITH_BMP_LOADER_
|
|
||||||
//#undef _IRR_COMPILE_WITH_JPG_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_PCX_LOADER_
|
|
||||||
//#undef _IRR_COMPILE_WITH_PNG_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_PPM_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_PSD_LOADER_
|
|
||||||
//#undef _IRR_COMPILE_WITH_TGA_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_WAL_LOADER_
|
|
||||||
#undef _IRR_COMPILE_WITH_BMP_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_JPG_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_PCX_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_PNG_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_PPM_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_PSD_WRITER_
|
|
||||||
#undef _IRR_COMPILE_WITH_TGA_WRITER_
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _IRR_WINDOWS_API_
|
#ifndef _IRR_WINDOWS_API_
|
||||||
#undef _IRR_WCHAR_FILESYSTEM
|
#undef _IRR_WCHAR_FILESYSTEM
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,868 +0,0 @@
|
|||||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
||||||
// This file is part of the "Irrlicht Engine".
|
|
||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
||||||
|
|
||||||
#include "IrrCompileConfig.h"
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_WINDOWS_CE_DEVICE_
|
|
||||||
|
|
||||||
#include "CIrrDeviceWinCE.h"
|
|
||||||
#include "IEventReceiver.h"
|
|
||||||
#include "irrList.h"
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#include "CTimer.h"
|
|
||||||
#include "irrString.h"
|
|
||||||
#include "COSOperator.h"
|
|
||||||
#include "dimension2d.h"
|
|
||||||
#include <winuser.h>
|
|
||||||
#include "irrlicht.h"
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma comment (lib, "aygshell.lib")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
namespace video
|
|
||||||
{
|
|
||||||
#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_
|
|
||||||
IVideoDriver* createDirectX8Driver(const irr::SIrrlichtCreationParameters& params,
|
|
||||||
io::IFileSystem* io, HWND window);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_DIRECT3D_9_
|
|
||||||
IVideoDriver* createDirectX9Driver(const irr::SIrrlichtCreationParameters& params,
|
|
||||||
io::IFileSystem* io, HWND window);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
|
||||||
IVideoDriver* createOpenGLDriver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, this);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct SEnvMapper
|
|
||||||
{
|
|
||||||
HWND hWnd;
|
|
||||||
irr::CIrrDeviceWinCE* irrDev;
|
|
||||||
};
|
|
||||||
|
|
||||||
irr::core::list<SEnvMapper> EnvMap;
|
|
||||||
|
|
||||||
SEnvMapper* getEnvMapperFromHWnd(HWND hWnd)
|
|
||||||
{
|
|
||||||
irr::core::list<SEnvMapper>::Iterator it = EnvMap.begin();
|
|
||||||
for (; it!= EnvMap.end(); ++it)
|
|
||||||
if ((*it).hWnd == hWnd)
|
|
||||||
return &(*it);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
irr::CIrrDeviceWinCE* getDeviceFromHWnd(HWND hWnd)
|
|
||||||
{
|
|
||||||
irr::core::list<SEnvMapper>::Iterator it = EnvMap.begin();
|
|
||||||
for (; it!= EnvMap.end(); ++it)
|
|
||||||
if ((*it).hWnd == hWnd)
|
|
||||||
return (*it).irrDev;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
#ifndef WM_MOUSEWHEEL
|
|
||||||
#define WM_MOUSEWHEEL 0x020A
|
|
||||||
#endif
|
|
||||||
#ifndef WHEEL_DELTA
|
|
||||||
#define WHEEL_DELTA 120
|
|
||||||
#endif
|
|
||||||
|
|
||||||
irr::CIrrDeviceWinCE* dev = 0;
|
|
||||||
irr::SEvent event;
|
|
||||||
SEnvMapper* envm = 0;
|
|
||||||
|
|
||||||
//BYTE allKeys[256];
|
|
||||||
|
|
||||||
static irr::s32 ClickCount=0;
|
|
||||||
if (GetCapture() != hWnd && ClickCount > 0)
|
|
||||||
ClickCount = 0;
|
|
||||||
|
|
||||||
switch (message)
|
|
||||||
{
|
|
||||||
case WM_PAINT:
|
|
||||||
{
|
|
||||||
PAINTSTRUCT ps;
|
|
||||||
BeginPaint(hWnd, &ps);
|
|
||||||
EndPaint(hWnd, &ps);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_ERASEBKGND:
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_SETCURSOR:
|
|
||||||
envm = getEnvMapperFromHWnd(hWnd);
|
|
||||||
if (envm && !envm->irrDev->getWin32CursorControl()->isVisible())
|
|
||||||
{
|
|
||||||
SetCursor(NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Wheel = ((irr::f32)((short)HIWORD(wParam))) / (irr::f32)WHEEL_DELTA;
|
|
||||||
event.MouseInput.Event = irr::EMIE_MOUSE_WHEEL;
|
|
||||||
|
|
||||||
POINT p; // fixed by jox
|
|
||||||
p.x = 0; p.y = 0;
|
|
||||||
ClientToScreen(hWnd, &p);
|
|
||||||
event.MouseInput.X = LOWORD(lParam) - p.x;
|
|
||||||
event.MouseInput.Y = HIWORD(lParam) - p.y;
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
ClickCount++;
|
|
||||||
SetCapture(hWnd);
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Event = irr::EMIE_LMOUSE_PRESSED_DOWN;
|
|
||||||
event.MouseInput.X = (short)LOWORD(lParam);
|
|
||||||
event.MouseInput.Y = (short)HIWORD(lParam);
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
|
||||||
ClickCount--;
|
|
||||||
if (ClickCount<1)
|
|
||||||
{
|
|
||||||
ClickCount=0;
|
|
||||||
ReleaseCapture();
|
|
||||||
}
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Event = irr::EMIE_LMOUSE_LEFT_UP;
|
|
||||||
event.MouseInput.X = (short)LOWORD(lParam);
|
|
||||||
event.MouseInput.Y = (short)HIWORD(lParam);
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_RBUTTONDOWN:
|
|
||||||
ClickCount++;
|
|
||||||
SetCapture(hWnd);
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Event = irr::EMIE_RMOUSE_PRESSED_DOWN;
|
|
||||||
event.MouseInput.X = (short)LOWORD(lParam);
|
|
||||||
event.MouseInput.Y = (short)HIWORD(lParam);
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_RBUTTONUP:
|
|
||||||
ClickCount--;
|
|
||||||
if (ClickCount<1)
|
|
||||||
{
|
|
||||||
ClickCount=0;
|
|
||||||
ReleaseCapture();
|
|
||||||
}
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Event = irr::EMIE_RMOUSE_LEFT_UP;
|
|
||||||
event.MouseInput.X = (short)LOWORD(lParam);
|
|
||||||
event.MouseInput.Y = (short)HIWORD(lParam);
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_MBUTTONDOWN:
|
|
||||||
ClickCount++;
|
|
||||||
SetCapture(hWnd);
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Event = irr::EMIE_MMOUSE_PRESSED_DOWN;
|
|
||||||
event.MouseInput.X = (short)LOWORD(lParam);
|
|
||||||
event.MouseInput.Y = (short)HIWORD(lParam);
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_MBUTTONUP:
|
|
||||||
ClickCount--;
|
|
||||||
if (ClickCount<1)
|
|
||||||
{
|
|
||||||
ClickCount=0;
|
|
||||||
ReleaseCapture();
|
|
||||||
}
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Event = irr::EMIE_MMOUSE_LEFT_UP;
|
|
||||||
event.MouseInput.X = (short)LOWORD(lParam);
|
|
||||||
event.MouseInput.Y = (short)HIWORD(lParam);
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
event.EventType = irr::EET_MOUSE_INPUT_EVENT;
|
|
||||||
event.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
|
|
||||||
event.MouseInput.X = (short)LOWORD(lParam);
|
|
||||||
event.MouseInput.Y = (short)HIWORD(lParam);
|
|
||||||
event.MouseInput.Shift = ((LOWORD(wParam) & MK_SHIFT) != 0);
|
|
||||||
event.MouseInput.Control = ((LOWORD(wParam) & MK_CONTROL) != 0);
|
|
||||||
// left and right mouse buttons
|
|
||||||
event.MouseInput.ButtonStates = wParam & ( MK_LBUTTON | MK_RBUTTON);
|
|
||||||
// middle and extra buttons
|
|
||||||
if (wParam & MK_MBUTTON)
|
|
||||||
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;
|
|
||||||
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_SYSKEYDOWN:
|
|
||||||
case WM_SYSKEYUP:
|
|
||||||
case WM_KEYDOWN:
|
|
||||||
case WM_KEYUP:
|
|
||||||
{
|
|
||||||
event.EventType = irr::EET_KEY_INPUT_EVENT;
|
|
||||||
event.KeyInput.Key = (irr::EKEY_CODE)wParam;
|
|
||||||
event.KeyInput.PressedDown = (message==WM_KEYDOWN || message == WM_SYSKEYDOWN);
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
/*
|
|
||||||
WORD KeyAsc=0;
|
|
||||||
GetKeyboardState(allKeys);
|
|
||||||
ToAscii(wParam,lParam,allKeys,&KeyAsc,0);
|
|
||||||
*/
|
|
||||||
// event.KeyInput.Shift = ((allKeys[VK_SHIFT] & 0x80)!=0);
|
|
||||||
// event.KeyInput.Control = ((allKeys[VK_CONTROL] & 0x80)!=0);
|
|
||||||
// event.KeyInput.Char = (KeyAsc & 0x00ff); //KeyAsc >= 0 ? KeyAsc : 0;
|
|
||||||
|
|
||||||
if (dev)
|
|
||||||
dev->postEventFromUser(event);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WM_SIZE:
|
|
||||||
{
|
|
||||||
// resize
|
|
||||||
dev = getDeviceFromHWnd(hWnd);
|
|
||||||
if (dev)
|
|
||||||
dev->OnResized();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
|
|
||||||
//! constructor
|
|
||||||
CIrrDeviceWinCE::CIrrDeviceWinCE(const SIrrlichtCreationParameters& params)
|
|
||||||
: CIrrDeviceStub(params), HWnd(0),
|
|
||||||
Win32CursorControl(0), ChangedToFullScreen(false), Resized(false),
|
|
||||||
ExternalWindow(false)
|
|
||||||
{
|
|
||||||
#ifdef _DEBUG
|
|
||||||
setDebugName("CIrrDeviceWinCE");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
core::stringc winversion;
|
|
||||||
getWindowsVersion(winversion);
|
|
||||||
Operator = new COSOperator(winversion);
|
|
||||||
os::Printer::log(winversion.c_str(), ELL_INFORMATION);
|
|
||||||
|
|
||||||
HINSTANCE hInstance = GetModuleHandle(0);
|
|
||||||
|
|
||||||
// create the window only if we do not use the null device
|
|
||||||
if (!CreationParams.WindowId && (CreationParams.DriverType != video::EDT_NULL))
|
|
||||||
{
|
|
||||||
const wchar_t* ClassName = L"CIrrDeviceWinCE";
|
|
||||||
|
|
||||||
// Register Class
|
|
||||||
WNDCLASS wc;
|
|
||||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
||||||
wc.lpfnWndProc = WndProc;
|
|
||||||
wc.cbClsExtra = 0;
|
|
||||||
wc.cbWndExtra = 0;
|
|
||||||
wc.hInstance = hInstance;
|
|
||||||
wc.hIcon = NULL;
|
|
||||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
||||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
|
||||||
wc.lpszMenuName = 0;
|
|
||||||
wc.lpszClassName = ClassName;
|
|
||||||
|
|
||||||
// if there is an icon, load it
|
|
||||||
wc.hIcon = (HICON)LoadImageW(hInstance, L"irrlicht.ico", IMAGE_ICON, 0,0, 0);
|
|
||||||
|
|
||||||
RegisterClass(&wc);
|
|
||||||
|
|
||||||
// calculate client size
|
|
||||||
|
|
||||||
RECT clientSize;
|
|
||||||
clientSize.top = 0;
|
|
||||||
clientSize.left = 0;
|
|
||||||
clientSize.right = CreationParams.WindowSize.Width;
|
|
||||||
clientSize.bottom = CreationParams.WindowSize.Height;
|
|
||||||
|
|
||||||
DWORD style = WS_POPUP;
|
|
||||||
|
|
||||||
if (!CreationParams.Fullscreen)
|
|
||||||
style = WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
|
||||||
|
|
||||||
AdjustWindowRectEx(&clientSize, style, FALSE, 0);
|
|
||||||
|
|
||||||
const s32 realWidth = clientSize.right - clientSize.left;
|
|
||||||
const s32 realHeight = clientSize.bottom - clientSize.top;
|
|
||||||
|
|
||||||
const s32 windowLeft = core::s32_max ( 0, (GetSystemMetrics(SM_CXSCREEN) - realWidth) >> 1 );
|
|
||||||
const s32 windowTop = core::s32_max ( 0, (GetSystemMetrics(SM_CYSCREEN) - realHeight) >> 1 );
|
|
||||||
|
|
||||||
// create window
|
|
||||||
|
|
||||||
HWnd = CreateWindowW( ClassName, L"", style, windowLeft, windowTop,
|
|
||||||
realWidth, realHeight, NULL, NULL, hInstance, NULL);
|
|
||||||
|
|
||||||
ShowWindow(HWnd , SW_SHOW);
|
|
||||||
UpdateWindow(HWnd);
|
|
||||||
|
|
||||||
// fix ugly ATI driver bugs. Thanks to ariaci
|
|
||||||
MoveWindow(HWnd, windowLeft, windowTop, realWidth, realHeight, TRUE);
|
|
||||||
}
|
|
||||||
else if (CreationParams.WindowId)
|
|
||||||
{
|
|
||||||
// attach external window
|
|
||||||
HWnd = static_cast<HWND>(CreationParams.WindowId);
|
|
||||||
RECT r;
|
|
||||||
GetWindowRect(HWnd, &r);
|
|
||||||
CreationParams.WindowSize.Width = r.right - r.left;
|
|
||||||
CreationParams.WindowSize.Height = r.bottom - r.top;
|
|
||||||
CreationParams.Fullscreen = false;
|
|
||||||
ExternalWindow = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create cursor control
|
|
||||||
|
|
||||||
Win32CursorControl = new CCursorControl(CreationParams.WindowSize, HWnd, CreationParams.Fullscreen);
|
|
||||||
CursorControl = Win32CursorControl;
|
|
||||||
|
|
||||||
// create driver
|
|
||||||
|
|
||||||
createDriver();
|
|
||||||
|
|
||||||
if (VideoDriver)
|
|
||||||
createGUIAndScene();
|
|
||||||
|
|
||||||
// register environment
|
|
||||||
|
|
||||||
SEnvMapper em;
|
|
||||||
em.irrDev = this;
|
|
||||||
em.hWnd = HWnd;
|
|
||||||
EnvMap.push_back(em);
|
|
||||||
|
|
||||||
// set this as active window
|
|
||||||
SetActiveWindow(HWnd);
|
|
||||||
SetForegroundWindow(HWnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! destructor
|
|
||||||
CIrrDeviceWinCE::~CIrrDeviceWinCE()
|
|
||||||
{
|
|
||||||
// unregister environment
|
|
||||||
|
|
||||||
if (ChangedToFullScreen)
|
|
||||||
SHFullScreen(HWnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON | SHFS_SHOWSIPBUTTON);
|
|
||||||
|
|
||||||
irr::core::list<SEnvMapper>::Iterator it = EnvMap.begin();
|
|
||||||
for (; it!= EnvMap.end(); ++it)
|
|
||||||
if ((*it).hWnd == HWnd)
|
|
||||||
{
|
|
||||||
EnvMap.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! create the driver
|
|
||||||
void CIrrDeviceWinCE::createDriver()
|
|
||||||
{
|
|
||||||
switch(CreationParams.DriverType)
|
|
||||||
{
|
|
||||||
case video::EDT_DIRECT3D8:
|
|
||||||
#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_
|
|
||||||
VideoDriver = video::createDirectX8Driver(CreationParams, FileSystem, HWnd);
|
|
||||||
if (!VideoDriver)
|
|
||||||
{
|
|
||||||
os::Printer::log("Could not create DIRECT3D8 Driver.", ELL_ERROR);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
os::Printer::log("DIRECT3D8 Driver was not compiled into this dll. Try another one.", ELL_ERROR);
|
|
||||||
#endif // _IRR_COMPILE_WITH_DIRECT3D_8_
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case video::EDT_DIRECT3D9:
|
|
||||||
#ifdef _IRR_COMPILE_WITH_DIRECT3D_9_
|
|
||||||
VideoDriver = video::createDirectX9Driver(CreationParams, FileSystem, HWnd);
|
|
||||||
if (!VideoDriver)
|
|
||||||
{
|
|
||||||
os::Printer::log("Could not create DIRECT3D9 Driver.", ELL_ERROR);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
os::Printer::log("DIRECT3D9 Driver was not compiled into this dll. Try another one.", ELL_ERROR);
|
|
||||||
#endif // _IRR_COMPILE_WITH_DIRECT3D_9_
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case video::EDT_OPENGL:
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
|
||||||
if (CreationParams.Fullscreen)
|
|
||||||
switchToFullScreen();
|
|
||||||
VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem);
|
|
||||||
if (!VideoDriver)
|
|
||||||
{
|
|
||||||
os::Printer::log("Could not create OpenGL driver.", ELL_ERROR);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
os::Printer::log("OpenGL driver was not compiled in.", ELL_ERROR);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case video::EDT_SOFTWARE:
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_SOFTWARE_
|
|
||||||
if (CreationParams.Fullscreen)
|
|
||||||
switchToFullScreen();
|
|
||||||
VideoDriver = video::createSoftwareDriver(CreationParams.WindowSize, CreationParams.Fullscreen, FileSystem, this);
|
|
||||||
#else
|
|
||||||
os::Printer::log("Software driver was not compiled in.", ELL_ERROR);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case video::EDT_BURNINGSVIDEO:
|
|
||||||
#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_
|
|
||||||
if (CreationParams.Fullscreen)
|
|
||||||
switchToFullScreen();
|
|
||||||
VideoDriver = video::createBurningVideoDriver(CreationParams, FileSystem, this);
|
|
||||||
#else
|
|
||||||
os::Printer::log("Burning's Video driver was not compiled in.", ELL_ERROR);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case video::EDT_NULL:
|
|
||||||
// create null driver
|
|
||||||
VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
os::Printer::log("Unable to create video driver of unknown type.", ELL_ERROR);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! runs the device. Returns false if device wants to be deleted
|
|
||||||
bool CIrrDeviceWinCE::run()
|
|
||||||
{
|
|
||||||
os::Timer::tick();
|
|
||||||
|
|
||||||
MSG msg;
|
|
||||||
|
|
||||||
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
|
||||||
{
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
|
|
||||||
if (ExternalWindow && msg.hwnd == HWnd)
|
|
||||||
WndProc(HWnd, msg.message, msg.wParam, msg.lParam);
|
|
||||||
else
|
|
||||||
DispatchMessage(&msg);
|
|
||||||
|
|
||||||
if (msg.message == WM_QUIT)
|
|
||||||
Close = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Close)
|
|
||||||
resizeIfNecessary();
|
|
||||||
|
|
||||||
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
|
|
||||||
return !Close;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Pause the current process for the minimum time allowed only to allow other processes to execute
|
|
||||||
void CIrrDeviceWinCE::yield()
|
|
||||||
{
|
|
||||||
Sleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Pause execution and let other processes to run for a specified amount of time.
|
|
||||||
void CIrrDeviceWinCE::sleep(u32 timeMs, bool pauseTimer)
|
|
||||||
{
|
|
||||||
const bool wasStopped = Timer ? Timer->isStopped() : true;
|
|
||||||
if (pauseTimer && !wasStopped)
|
|
||||||
Timer->stop();
|
|
||||||
|
|
||||||
Sleep(timeMs);
|
|
||||||
|
|
||||||
if (pauseTimer && !wasStopped)
|
|
||||||
Timer->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CIrrDeviceWinCE::resizeIfNecessary()
|
|
||||||
{
|
|
||||||
if (!Resized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
RECT r;
|
|
||||||
GetClientRect(HWnd, &r);
|
|
||||||
|
|
||||||
char tmp[255];
|
|
||||||
|
|
||||||
if (r.right < 2 || r.bottom < 2)
|
|
||||||
{
|
|
||||||
sprintf(tmp, "Ignoring resize operation to (%ld %ld)", r.right, r.bottom);
|
|
||||||
os::Printer::log(tmp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf(tmp, "Resizing window (%ld %ld)", r.right, r.bottom);
|
|
||||||
os::Printer::log(tmp);
|
|
||||||
|
|
||||||
getVideoDriver()->OnResize(irr::core::dimension2d<irr::u32>(r.right, r.bottom));
|
|
||||||
getWin32CursorControl()->OnResize(getVideoDriver()->getScreenSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
Resized = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! sets the caption of the window
|
|
||||||
void CIrrDeviceWinCE::setWindowCaption(const wchar_t* text)
|
|
||||||
{
|
|
||||||
SetWindowTextW(HWnd, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(BITMAPV4HEADER)
|
|
||||||
typedef struct {
|
|
||||||
DWORD bV4Size;
|
|
||||||
LONG bV4Width;
|
|
||||||
LONG bV4Height;
|
|
||||||
WORD bV4Planes;
|
|
||||||
WORD bV4BitCount;
|
|
||||||
DWORD bV4V4Compression;
|
|
||||||
DWORD bV4SizeImage;
|
|
||||||
LONG bV4XPelsPerMeter;
|
|
||||||
LONG bV4YPelsPerMeter;
|
|
||||||
DWORD bV4ClrUsed;
|
|
||||||
DWORD bV4ClrImportant;
|
|
||||||
DWORD bV4RedMask;
|
|
||||||
DWORD bV4GreenMask;
|
|
||||||
DWORD bV4BlueMask;
|
|
||||||
DWORD bV4AlphaMask;
|
|
||||||
DWORD bV4CSType;
|
|
||||||
DWORD un[9];
|
|
||||||
} BITMAPV4HEADER, *PBITMAPV4HEADER;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//! presents a surface in the client area
|
|
||||||
bool CIrrDeviceWinCE::present(video::IImage* image, void* windowId, core::rect<s32>* src)
|
|
||||||
{
|
|
||||||
HWND hwnd = HWnd;
|
|
||||||
if ( windowId )
|
|
||||||
hwnd = (HWND)windowId;
|
|
||||||
|
|
||||||
HDC dc = GetDC(hwnd);
|
|
||||||
|
|
||||||
if ( dc )
|
|
||||||
{
|
|
||||||
RECT rect;
|
|
||||||
GetClientRect(hwnd, &rect);
|
|
||||||
const void* memory = (const void *)image->lock();
|
|
||||||
|
|
||||||
BITMAPV4HEADER bi;
|
|
||||||
memset (&bi, 0, sizeof(bi));
|
|
||||||
bi.bV4Size = sizeof(BITMAPINFOHEADER);
|
|
||||||
bi.bV4BitCount = image->getBitsPerPixel();
|
|
||||||
bi.bV4Planes = 1;
|
|
||||||
bi.bV4Width = image->getDimension().Width;
|
|
||||||
bi.bV4Height = 0 - image->getDimension().Height;
|
|
||||||
bi.bV4V4Compression = BI_BITFIELDS;
|
|
||||||
bi.bV4AlphaMask = image->getAlphaMask ();
|
|
||||||
bi.bV4RedMask = image->getRedMask ();
|
|
||||||
bi.bV4GreenMask = image->getGreenMask();
|
|
||||||
bi.bV4BlueMask = image->getBlueMask();
|
|
||||||
|
|
||||||
int r = 0;
|
|
||||||
if ( src )
|
|
||||||
{
|
|
||||||
r = StretchDIBits(dc, 0,0, rect.right, rect.bottom,
|
|
||||||
src->UpperLeftCorner.X, src->UpperLeftCorner.Y,
|
|
||||||
src->getWidth(), src->getHeight(),
|
|
||||||
memory, (const BITMAPINFO*)(&bi), DIB_RGB_COLORS, SRCCOPY);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = StretchDIBits(dc, 0,0, rect.right, rect.bottom,
|
|
||||||
0, 0, image->getDimension().Width, image->getDimension().Height,
|
|
||||||
memory, (const BITMAPINFO*)(&bi), DIB_RGB_COLORS, SRCCOPY);
|
|
||||||
}
|
|
||||||
|
|
||||||
image->unlock();
|
|
||||||
|
|
||||||
ReleaseDC(hwnd, dc);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! notifies the device that it should close itself
|
|
||||||
void CIrrDeviceWinCE::closeDevice()
|
|
||||||
{
|
|
||||||
MSG msg;
|
|
||||||
PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);
|
|
||||||
PostQuitMessage(0);
|
|
||||||
PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);
|
|
||||||
if (!ExternalWindow)
|
|
||||||
{
|
|
||||||
DestroyWindow(HWnd);
|
|
||||||
const fschar_t* ClassName = __TEXT("CIrrDeviceWin32");
|
|
||||||
HINSTANCE hInstance = GetModuleHandle(0);
|
|
||||||
UnregisterClass(ClassName, hInstance);
|
|
||||||
}
|
|
||||||
Close=true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns if window is active. if not, nothing need to be drawn
|
|
||||||
bool CIrrDeviceWinCE::isWindowActive() const
|
|
||||||
{
|
|
||||||
bool ret = (GetActiveWindow() == HWnd);
|
|
||||||
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns if window has focus
|
|
||||||
bool CIrrDeviceWinCE::isWindowFocused() const
|
|
||||||
{
|
|
||||||
bool ret = (GetFocus() == HWnd);
|
|
||||||
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns if window is minimized
|
|
||||||
bool CIrrDeviceWinCE::isWindowMinimized() const
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
WINDOWPLACEMENT plc;
|
|
||||||
plc.length=sizeof(WINDOWPLACEMENT);
|
|
||||||
bool ret=false;
|
|
||||||
if (GetWindowPlacement(HWnd,&plc))
|
|
||||||
ret=(plc.showCmd & SW_SHOWMINIMIZED);
|
|
||||||
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
|
|
||||||
return ret;
|
|
||||||
#endif
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! switches to fullscreen
|
|
||||||
bool CIrrDeviceWinCE::switchToFullScreen()
|
|
||||||
{
|
|
||||||
ChangedToFullScreen = SHFullScreen(HWnd, SHFS_HIDESIPBUTTON | SHFS_HIDETASKBAR) != 0;
|
|
||||||
return ChangedToFullScreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! returns the win32 cursor control
|
|
||||||
CIrrDeviceWinCE::CCursorControl* CIrrDeviceWinCE::getWin32CursorControl()
|
|
||||||
{
|
|
||||||
return Win32CursorControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Return pointer to a list with all video modes supported by the gfx adapter.
|
|
||||||
/** \return Pointer to video modes list */
|
|
||||||
video::IVideoModeList* CIrrDeviceWinCE::getVideoModeList()
|
|
||||||
{
|
|
||||||
if (!VideoModeList.getVideoModeCount())
|
|
||||||
{
|
|
||||||
// enumerate video modes.
|
|
||||||
DWORD i=0;
|
|
||||||
DEVMODE mode;
|
|
||||||
memset(&mode, 0, sizeof(mode));
|
|
||||||
mode.dmSize = sizeof(mode);
|
|
||||||
|
|
||||||
while (EnumDisplaySettings(NULL, i, &mode))
|
|
||||||
{
|
|
||||||
VideoModeList.addMode(core::dimension2d<u32>(mode.dmPelsWidth, mode.dmPelsHeight),
|
|
||||||
mode.dmBitsPerPel);
|
|
||||||
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &mode))
|
|
||||||
VideoModeList.setDesktop(mode.dmBitsPerPel, core::dimension2d<u32>(mode.dmPelsWidth, mode.dmPelsHeight));
|
|
||||||
}
|
|
||||||
|
|
||||||
return &VideoModeList;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CIrrDeviceWinCE::getWindowsVersion(core::stringc& out)
|
|
||||||
{
|
|
||||||
out = "WinCE";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Notifies the device, that it has been resized
|
|
||||||
void CIrrDeviceWinCE::OnResized()
|
|
||||||
{
|
|
||||||
Resized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Sets if the window should be resizable in windowed mode.
|
|
||||||
void CIrrDeviceWinCE::setResizable(bool resize)
|
|
||||||
{
|
|
||||||
if (ExternalWindow || !getVideoDriver() || CreationParams.Fullscreen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
LONG style = WS_POPUP;
|
|
||||||
|
|
||||||
if (!resize)
|
|
||||||
style = WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
|
||||||
else
|
|
||||||
style = WS_THICKFRAME | WS_SYSMENU | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_MAXIMIZEBOX;
|
|
||||||
|
|
||||||
if (!SetWindowLong(HWnd, GWL_STYLE, style))
|
|
||||||
os::Printer::log("Could not change window style.");
|
|
||||||
|
|
||||||
RECT clientSize;
|
|
||||||
clientSize.top = 0;
|
|
||||||
clientSize.left = 0;
|
|
||||||
clientSize.right = getVideoDriver()->getScreenSize().Width;
|
|
||||||
clientSize.bottom = getVideoDriver()->getScreenSize().Height;
|
|
||||||
|
|
||||||
AdjustWindowRectEx(&clientSize, style, FALSE, 0);
|
|
||||||
|
|
||||||
const s32 realWidth = clientSize.right - clientSize.left;
|
|
||||||
const s32 realHeight = clientSize.bottom - clientSize.top;
|
|
||||||
|
|
||||||
const s32 windowLeft = (GetSystemMetrics(SM_CXSCREEN) - realWidth) / 2;
|
|
||||||
const s32 windowTop = (GetSystemMetrics(SM_CYSCREEN) - realHeight) / 2;
|
|
||||||
|
|
||||||
SetWindowPos(HWnd, HWND_TOP, windowLeft, windowTop, realWidth, realHeight,
|
|
||||||
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_SHOWWINDOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Minimizes the window.
|
|
||||||
void CIrrDeviceWinCE::minimizeWindow()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Maximize window
|
|
||||||
void CIrrDeviceWinCE::maximizeWindow()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//! Restore original window size
|
|
||||||
void CIrrDeviceWinCE::restoreWindow()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace
|
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_WINDOWS_CE_DEVICE_
|
|
||||||
|
|
@ -1,296 +0,0 @@
|
|||||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
||||||
// This file is part of the "Irrlicht Engine".
|
|
||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
||||||
|
|
||||||
#ifndef __C_IRR_DEVICE_WINCE_H_INCLUDED__
|
|
||||||
#define __C_IRR_DEVICE_WINCE_H_INCLUDED__
|
|
||||||
|
|
||||||
#include "IrrCompileConfig.h"
|
|
||||||
#ifdef _IRR_COMPILE_WITH_WINDOWS_CE_DEVICE_
|
|
||||||
|
|
||||||
#include "CIrrDeviceStub.h"
|
|
||||||
#include "IrrlichtDevice.h"
|
|
||||||
#include "IImagePresenter.h"
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <windowsx.h>
|
|
||||||
#include <commctrl.h>
|
|
||||||
#include <aygshell.h>
|
|
||||||
#include <sipapi.h>
|
|
||||||
#include <gx.h>
|
|
||||||
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
class CIrrDeviceWinCE : public CIrrDeviceStub, video::IImagePresenter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
//! constructor
|
|
||||||
CIrrDeviceWinCE( const SIrrlichtCreationParameters& params);
|
|
||||||
|
|
||||||
//! destructor
|
|
||||||
virtual ~CIrrDeviceWinCE();
|
|
||||||
|
|
||||||
//! runs the device. Returns false if device wants to be deleted
|
|
||||||
virtual bool run();
|
|
||||||
|
|
||||||
//! Cause the device to temporarily pause execution and let other processes to run
|
|
||||||
// This should bring down processor usage without major performance loss for Irrlicht
|
|
||||||
virtual void yield();
|
|
||||||
|
|
||||||
//! Pause execution and let other processes to run for a specified amount of time.
|
|
||||||
virtual void sleep(u32 timeMs, bool pauseTimer);
|
|
||||||
|
|
||||||
//! sets the caption of the window
|
|
||||||
virtual void setWindowCaption(const wchar_t* text);
|
|
||||||
|
|
||||||
//! returns if window is active. if not, nothing need to be drawn
|
|
||||||
virtual bool isWindowActive() const;
|
|
||||||
|
|
||||||
//! returns if window has focus
|
|
||||||
virtual bool isWindowFocused() const;
|
|
||||||
|
|
||||||
//! returns if window is minimized
|
|
||||||
virtual bool isWindowMinimized() const;
|
|
||||||
|
|
||||||
//! presents a surface in the client area
|
|
||||||
virtual bool present(video::IImage* surface, void* windowId = 0, core::rect<s32>* src=0 );
|
|
||||||
|
|
||||||
//! notifies the device that it should close itself
|
|
||||||
virtual void closeDevice();
|
|
||||||
|
|
||||||
//! \return Returns a pointer to a list with all video modes
|
|
||||||
//! supported by the gfx adapter.
|
|
||||||
video::IVideoModeList* getVideoModeList();
|
|
||||||
|
|
||||||
//! Notifies the device, that it has been resized
|
|
||||||
void OnResized();
|
|
||||||
|
|
||||||
//! Sets if the window should be resizable in windowed mode.
|
|
||||||
virtual void setResizable(bool resize=false);
|
|
||||||
|
|
||||||
//! Minimizes the window.
|
|
||||||
virtual void minimizeWindow();
|
|
||||||
|
|
||||||
//! Maximizes the window.
|
|
||||||
virtual void maximizeWindow();
|
|
||||||
|
|
||||||
//! Restores the window size.
|
|
||||||
virtual void restoreWindow();
|
|
||||||
|
|
||||||
//! Get the device type
|
|
||||||
virtual E_DEVICE_TYPE getType() const
|
|
||||||
{
|
|
||||||
return EIDT_WINCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Implementation of the win32 cursor control
|
|
||||||
class CCursorControl : public gui::ICursorControl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
CCursorControl(const core::dimension2d<u32>& wsize, HWND hwnd, bool fullscreen)
|
|
||||||
: WindowSize(wsize), InvWindowSize(0.0f, 0.0f),
|
|
||||||
HWnd(hwnd), BorderX(0), BorderY(0),
|
|
||||||
UseReferenceRect(false), IsVisible(true)
|
|
||||||
{
|
|
||||||
if (WindowSize.Width!=0)
|
|
||||||
InvWindowSize.Width = 1.0f / WindowSize.Width;
|
|
||||||
|
|
||||||
if (WindowSize.Height!=0)
|
|
||||||
InvWindowSize.Height = 1.0f / WindowSize.Height;
|
|
||||||
|
|
||||||
if (!fullscreen)
|
|
||||||
{
|
|
||||||
BorderX = GetSystemMetrics(SM_CXDLGFRAME);
|
|
||||||
BorderY = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYDLGFRAME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Changes the visible state of the mouse cursor.
|
|
||||||
virtual void setVisible(bool visible)
|
|
||||||
{
|
|
||||||
IsVisible = visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Returns if the cursor is currently visible.
|
|
||||||
virtual bool isVisible() const
|
|
||||||
{
|
|
||||||
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
|
|
||||||
return IsVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Sets the new position of the cursor.
|
|
||||||
virtual void setPosition(const core::position2d<f32> &pos)
|
|
||||||
{
|
|
||||||
setPosition(pos.X, pos.Y);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Sets the new position of the cursor.
|
|
||||||
virtual void setPosition(f32 x, f32 y)
|
|
||||||
{
|
|
||||||
if (!UseReferenceRect)
|
|
||||||
setPosition(core::round32(x*WindowSize.Width), core::round32(y*WindowSize.Height));
|
|
||||||
else
|
|
||||||
setPosition(core::round32(x*ReferenceRect.getWidth()), core::round32(y*ReferenceRect.getHeight()));
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Sets the new position of the cursor.
|
|
||||||
virtual void setPosition(const core::position2d<s32> &pos)
|
|
||||||
{
|
|
||||||
setPosition(pos.X, pos.Y);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Sets the new position of the cursor.
|
|
||||||
virtual void setPosition(s32 x, s32 y)
|
|
||||||
{
|
|
||||||
RECT rect;
|
|
||||||
|
|
||||||
if (UseReferenceRect)
|
|
||||||
{
|
|
||||||
SetCursorPos(ReferenceRect.UpperLeftCorner.X + x,
|
|
||||||
ReferenceRect.UpperLeftCorner.Y + y);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (GetWindowRect(HWnd, &rect))
|
|
||||||
SetCursorPos(x + rect.left + BorderX, y + rect.top + BorderY);
|
|
||||||
}
|
|
||||||
|
|
||||||
CursorPos.X = x;
|
|
||||||
CursorPos.Y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Returns the current position of the mouse cursor.
|
|
||||||
virtual const core::position2d<s32>& getPosition()
|
|
||||||
{
|
|
||||||
updateInternalCursorPosition();
|
|
||||||
return CursorPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Returns the current position of the mouse cursor.
|
|
||||||
virtual core::position2d<f32> getRelativePosition()
|
|
||||||
{
|
|
||||||
updateInternalCursorPosition();
|
|
||||||
|
|
||||||
if (!UseReferenceRect)
|
|
||||||
{
|
|
||||||
return core::position2d<f32>(CursorPos.X * InvWindowSize.Width,
|
|
||||||
CursorPos.Y * InvWindowSize.Height);
|
|
||||||
}
|
|
||||||
|
|
||||||
return core::position2d<f32>(CursorPos.X / (f32)ReferenceRect.getWidth(),
|
|
||||||
CursorPos.Y / (f32)ReferenceRect.getHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Sets an absolute reference rect for calculating the cursor position.
|
|
||||||
virtual void setReferenceRect(core::rect<s32>* rect=0)
|
|
||||||
{
|
|
||||||
if (rect)
|
|
||||||
{
|
|
||||||
ReferenceRect = *rect;
|
|
||||||
UseReferenceRect = true;
|
|
||||||
|
|
||||||
// prevent division through zero and uneven sizes
|
|
||||||
|
|
||||||
if (!ReferenceRect.getHeight() || ReferenceRect.getHeight()%2)
|
|
||||||
ReferenceRect.LowerRightCorner.Y += 1;
|
|
||||||
|
|
||||||
if (!ReferenceRect.getWidth() || ReferenceRect.getWidth()%2)
|
|
||||||
ReferenceRect.LowerRightCorner.X += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
UseReferenceRect = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Used to notify the cursor that the window was resized. */
|
|
||||||
virtual void OnResize(const core::dimension2d<u32>& size)
|
|
||||||
{
|
|
||||||
WindowSize = size;
|
|
||||||
if (size.Width!=0)
|
|
||||||
InvWindowSize.Width = 1.0f / size.Width;
|
|
||||||
else
|
|
||||||
InvWindowSize.Width = 0.f;
|
|
||||||
|
|
||||||
if (size.Height!=0)
|
|
||||||
InvWindowSize.Height = 1.0f / size.Height;
|
|
||||||
else
|
|
||||||
InvWindowSize.Height = 0.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//! Updates the internal cursor position
|
|
||||||
void updateInternalCursorPosition()
|
|
||||||
{
|
|
||||||
POINT p;
|
|
||||||
if (!GetCursorPos(&p))
|
|
||||||
{
|
|
||||||
DWORD xy = GetMessagePos();
|
|
||||||
p.x = GET_X_LPARAM(xy);
|
|
||||||
p.y = GET_Y_LPARAM(xy);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (UseReferenceRect)
|
|
||||||
{
|
|
||||||
CursorPos.X = p.x - ReferenceRect.UpperLeftCorner.X;
|
|
||||||
CursorPos.Y = p.y - ReferenceRect.UpperLeftCorner.Y;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RECT rect;
|
|
||||||
if (GetWindowRect(HWnd, &rect))
|
|
||||||
{
|
|
||||||
CursorPos.X = p.x-rect.left-BorderX;
|
|
||||||
CursorPos.Y = p.y-rect.top-BorderY;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// window seems not to be existent, so set cursor to
|
|
||||||
// a negative value
|
|
||||||
CursorPos.X = -1;
|
|
||||||
CursorPos.Y = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
core::position2d<s32> CursorPos;
|
|
||||||
core::dimension2d<s32> WindowSize;
|
|
||||||
core::dimension2d<f32> InvWindowSize;
|
|
||||||
HWND HWnd;
|
|
||||||
|
|
||||||
s32 BorderX, BorderY;
|
|
||||||
core::rect<s32> ReferenceRect;
|
|
||||||
bool UseReferenceRect;
|
|
||||||
bool IsVisible;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//! returns the win32 cursor control
|
|
||||||
CCursorControl* getWin32CursorControl();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//! create the driver
|
|
||||||
void createDriver();
|
|
||||||
|
|
||||||
//! switchs to fullscreen
|
|
||||||
bool switchToFullScreen();
|
|
||||||
|
|
||||||
void getWindowsVersion(core::stringc& version);
|
|
||||||
|
|
||||||
void resizeIfNecessary();
|
|
||||||
|
|
||||||
HWND HWnd;
|
|
||||||
CCursorControl* Win32CursorControl;
|
|
||||||
|
|
||||||
bool ChangedToFullScreen;
|
|
||||||
bool Resized;
|
|
||||||
bool ExternalWindow;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace irr
|
|
||||||
|
|
||||||
#endif // _IRR_COMPILE_WITH_WINDOWS_CE_DEVICE_
|
|
||||||
#endif // __C_IRR_DEVICE_WINCE_H_INCLUDED__
|
|
Loading…
x
Reference in New Issue
Block a user