Danbias/WindowManager/Window.cpp

164 lines
3.8 KiB
C++

#include "Window.h"
#include <WindowsX.h>
using namespace Oyster;
HWND Window::Handle = NULL;
std::stringstream Window::Log = std::stringstream();
RECT Window::WindowRect = RECT();
RECT Window::Size = RECT();
RECT Window::ClientRect = RECT();
WNDPROC Window::wndProc = NULL;
bool Window::isCaptured = false;
bool Window::shouldCapture = false;
int Window::OffsetMouseX=0;
int Window::OffsetMouseY=0;
bool Window::init( const LPCSTR appName, const LPCSTR className, const HINSTANCE &hInstance, const int &nCmdShow, WNDPROC wProc, bool handleLoop )
{
if( Handle != NULL )
{
Log<< "Faulty Init, First window Exists";
return true;
}
// Register window class
WNDCLASSEXA window = { 0 };
window.cbSize = sizeof( WNDCLASSEXA );
window.style = CS_HREDRAW | CS_VREDRAW;
window.lpfnWndProc = wProc;
if(handleLoop)
{
window.lpfnWndProc = Window::InputMethod;
Window::wndProc = wProc;
}
window.hInstance = hInstance;
window.hIcon = LoadIcon( NULL, IDI_APPLICATION );
window.hCursor = LoadCursor( NULL, IDC_ARROW );
window.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
window.lpszMenuName = NULL;
window.lpszClassName = className;
if( !RegisterClassExA( &window ) )
{
Log << "Failed to Register Window.\n";
return false;
}
Handle = CreateWindowEx( NULL,
className,
appName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800, //rc.right - rc.left,
600, //rc.bottom - rc.top,
NULL,
NULL,
hInstance,
NULL );
if( Handle == NULL )
{
Log << "Failed to Init Window.\n";
return false;
}
WINDOWINFO wi;
wi.cbSize = sizeof(WINDOWINFO);
GetWindowInfo(Handle,&wi);
WindowRect = wi.rcClient;
Size.right = Size.left = WindowRect.right - WindowRect.left;
Size.top = Size.bottom = WindowRect.bottom - WindowRect.top;
ClientRect.left= ClientRect.top=0;
ClientRect.right = Size.left;
ClientRect.bottom = Size.top;
ShowWindow( Handle, nCmdShow );
return true;
}
void Window::deFocus( ) { SetFocus( GetDesktopWindow() ); }
bool Window::isInFocus( ) { return Handle == GetFocus( ); }
bool Window::mouseIsInWindow(POINT point )
{
return PtInRect( &WindowRect, point )!=0;
}
LRESULT CALLBACK Window::InputMethod( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch (message)
{
case WM_KEYDOWN:
Oyster::Input::Controller::KeyPressed(wParam);
break;
case WM_KEYUP:
Oyster::Input::Controller::KeyReleased(wParam);
break;
case WM_MOUSEMOVE:
if(!isCaptured)
if(shouldCapture)
SetCapture(Handle);
POINT pt;
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
if(PtInRect(&ClientRect,pt)!=0)
Oyster::Input::Controller::MouseMove(GET_X_LPARAM(lParam)+OffsetMouseX,GET_Y_LPARAM(lParam)+OffsetMouseY);
else
{
if(shouldCapture)
{
pt.x = Input::Controller::GetX();
pt.y = Input::Controller::GetY();
ClientToScreen(Handle, &pt);
SetCursorPos(pt.x-OffsetMouseX,pt.y-OffsetMouseY);
}
}
break;
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN:
{
Oyster::Input::Controller::MouseBtnPressed(wParam);
break;
}
case WM_LBUTTONUP:
{
Oyster::Input::Controller::MouseBtnReleased(MK_LBUTTON);
break;
}
case WM_MBUTTONUP:
{
Oyster::Input::Controller::MouseBtnReleased(MK_MBUTTON);
break;
}
case WM_RBUTTONUP:
{
Oyster::Input::Controller::MouseBtnReleased(MK_RBUTTON);
break;
}
case WM_XBUTTONUP:
{
Oyster::Input::Controller::MouseBtnReleased(wParam);
break;
}
default:
return wndProc(hWnd, message, wParam, lParam);
}
return 0;
}
void Window::CaptureMouse(bool b)
{
shouldCapture=b;
isCaptured=false;
if(!b)
SetCapture(NULL);
}
void Window::SetMouseOffset(int x,int y)
{
OffsetMouseX=x;
OffsetMouseY=y;
}