Added Window::GetStyle()

Useful with external windows


Former-commit-id: 62974c8cdfb6919bc1e85507cc8adc8101daba1a
This commit is contained in:
Lynix 2013-05-01 01:36:13 +02:00
parent 961c658ae1
commit 7908839785
4 changed files with 87 additions and 27 deletions

View File

@ -56,6 +56,7 @@ class NAZARA_API NzWindow : NzNonCopyable
unsigned int GetHeight() const; unsigned int GetHeight() const;
NzVector2i GetPosition() const; NzVector2i GetPosition() const;
NzVector2ui GetSize() const; NzVector2ui GetSize() const;
nzUInt32 GetStyle() const;
NzString GetTitle() const; NzString GetTitle() const;
unsigned int GetWidth() const; unsigned int GetWidth() const;

View File

@ -26,7 +26,7 @@
#define GWL_USERDATA GWLP_USERDATA #define GWL_USERDATA GWLP_USERDATA
#endif #endif
// N'est pas définit avec MinGW apparemment // N'est pas définit avec MinGW
#ifndef MAPVK_VK_TO_VSC #ifndef MAPVK_VK_TO_VSC
#define MAPVK_VK_TO_VSC 0 #define MAPVK_VK_TO_VSC 0
#endif #endif
@ -43,6 +43,7 @@ NzWindowImpl::NzWindowImpl(NzWindow* parent) :
m_cursor(nullptr), m_cursor(nullptr),
m_handle(nullptr), m_handle(nullptr),
m_callback(0), m_callback(0),
m_style(0),
m_maxSize(-1), m_maxSize(-1),
m_minSize(-1), m_minSize(-1),
m_parent(parent), m_parent(parent),
@ -148,24 +149,27 @@ bool NzWindowImpl::Create(NzVideoMode mode, const NzString& title, nzUInt32 styl
#if !NAZARA_UTILITY_THREADED_WINDOW #if !NAZARA_UTILITY_THREADED_WINDOW
m_sizemove = false; m_sizemove = false;
#endif #endif
m_style = style;
return m_handle != nullptr; return m_handle != nullptr;
} }
bool NzWindowImpl::Create(NzWindowHandle handle) bool NzWindowImpl::Create(NzWindowHandle handle)
{ {
if (!handle) m_handle = reinterpret_cast<HWND>(handle);
if (!m_handle || !IsWindow(m_handle))
{ {
NazaraError("Invalid handle"); NazaraError("Invalid handle");
return false; return false;
} }
m_handle = reinterpret_cast<HWND>(handle);
m_eventListener = false; m_eventListener = false;
m_ownsWindow = false; m_ownsWindow = false;
#if !NAZARA_UTILITY_THREADED_WINDOW #if !NAZARA_UTILITY_THREADED_WINDOW
m_sizemove = false; m_sizemove = false;
#endif #endif
m_style = RetrieveStyle(m_handle);
return true; return true;
} }
@ -228,6 +232,11 @@ NzVector2ui NzWindowImpl::GetSize() const
return NzVector2ui(rect.right-rect.left, rect.bottom-rect.top); return NzVector2ui(rect.right-rect.left, rect.bottom-rect.top);
} }
nzUInt32 NzWindowImpl::GetStyle() const
{
return m_style;
}
NzString NzWindowImpl::GetTitle() const NzString NzWindowImpl::GetTitle() const
{ {
unsigned int titleSize = GetWindowTextLengthW(m_handle); unsigned int titleSize = GetWindowTextLengthW(m_handle);
@ -570,7 +579,6 @@ bool NzWindowImpl::HandleMessage(HWND window, UINT message, WPARAM wParam, LPARA
m_parent->PushEvent(event); m_parent->PushEvent(event);
} }
} }
#endif #endif
case WM_KEYDOWN: case WM_KEYDOWN:
@ -985,28 +993,6 @@ void NzWindowImpl::Uninitialize()
UnregisterClassW(className, GetModuleHandle(nullptr)); UnregisterClassW(className, GetModuleHandle(nullptr));
} }
LRESULT CALLBACK NzWindowImpl::MessageHandler(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
NzWindowImpl* me;
if (message == WM_CREATE)
{
me = reinterpret_cast<NzWindowImpl*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);
SetWindowLongPtr(window, GWL_USERDATA, reinterpret_cast<LONG_PTR>(me));
}
else
me = reinterpret_cast<NzWindowImpl*>(GetWindowLongPtr(window, GWL_USERDATA));
if (me)
{
if (me->HandleMessage(window, message, wParam, lParam))
return 0;
else if (me->m_callback)
return CallWindowProcW(reinterpret_cast<WNDPROC>(me->m_callback), window, message, wParam, lParam);
}
return DefWindowProcW(window, message, wParam, lParam);
}
NzKeyboard::Key NzWindowImpl::ConvertVirtualKey(WPARAM key, LPARAM flags) NzKeyboard::Key NzWindowImpl::ConvertVirtualKey(WPARAM key, LPARAM flags)
{ {
switch (key) switch (key)
@ -1139,6 +1125,63 @@ NzKeyboard::Key NzWindowImpl::ConvertVirtualKey(WPARAM key, LPARAM flags)
} }
} }
LRESULT CALLBACK NzWindowImpl::MessageHandler(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
NzWindowImpl* me;
if (message == WM_CREATE)
{
me = reinterpret_cast<NzWindowImpl*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);
SetWindowLongPtr(window, GWL_USERDATA, reinterpret_cast<LONG_PTR>(me));
}
else
me = reinterpret_cast<NzWindowImpl*>(GetWindowLongPtr(window, GWL_USERDATA));
if (me)
{
if (me->HandleMessage(window, message, wParam, lParam))
return 0;
else if (me->m_callback)
return CallWindowProcW(reinterpret_cast<WNDPROC>(me->m_callback), window, message, wParam, lParam);
}
return DefWindowProcW(window, message, wParam, lParam);
}
nzUInt32 NzWindowImpl::RetrieveStyle(HWND handle)
{
nzUInt32 style = 0;
LONG_PTR winStyle = GetWindowLongPtr(handle, GWL_STYLE);
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx
if (winStyle & WS_CAPTION)
{
style |= nzWindowStyle_Titlebar;
if (winStyle & WS_SYSMENU)
style |= nzWindowStyle_Closable;
if (winStyle & WS_MAXIMIZEBOX)
style |= nzWindowStyle_Resizable;
}
if (winStyle & WS_SIZEBOX)
style |= nzWindowStyle_Resizable;
// Pour déterminer si la fenêtre est en plein écran, il suffit de vérifier si elle recouvre l'écran
DEVMODE mode;
mode.dmSize = sizeof(DEVMODE);
EnumDisplaySettings(nullptr, ENUM_CURRENT_SETTINGS, &mode);
RECT rect;
if (GetWindowRect(handle, &rect))
{
if (static_cast<DWORD>(rect.right-rect.left) == mode.dmPelsWidth && static_cast<DWORD>(rect.bottom-rect.top) == mode.dmPelsHeight)
style |= nzWindowStyle_Fullscreen;
}
return style;
}
#if NAZARA_UTILITY_THREADED_WINDOW #if NAZARA_UTILITY_THREADED_WINDOW
void NzWindowImpl::WindowThread(HWND* handle, DWORD styleEx, const wchar_t* title, DWORD style, unsigned int x, unsigned int y, unsigned int width, unsigned int height, NzWindowImpl* window, NzMutex* mutex, NzConditionVariable* condition) void NzWindowImpl::WindowThread(HWND* handle, DWORD styleEx, const wchar_t* title, DWORD style, unsigned int x, unsigned int y, unsigned int width, unsigned int height, NzWindowImpl* window, NzMutex* mutex, NzConditionVariable* condition)
{ {

View File

@ -46,6 +46,7 @@ class NzWindowImpl : NzNonCopyable
unsigned int GetHeight() const; unsigned int GetHeight() const;
NzVector2i GetPosition() const; NzVector2i GetPosition() const;
NzVector2ui GetSize() const; NzVector2ui GetSize() const;
nzUInt32 GetStyle() const;
NzString GetTitle() const; NzString GetTitle() const;
unsigned int GetWidth() const; unsigned int GetWidth() const;
@ -77,8 +78,9 @@ class NzWindowImpl : NzNonCopyable
private: private:
bool HandleMessage(HWND window, UINT message, WPARAM wParam, LPARAM lParam); bool HandleMessage(HWND window, UINT message, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK MessageHandler(HWND window, UINT message, WPARAM wParam, LPARAM lParam);
static NzKeyboard::Key ConvertVirtualKey(WPARAM key, LPARAM flags); static NzKeyboard::Key ConvertVirtualKey(WPARAM key, LPARAM flags);
static LRESULT CALLBACK MessageHandler(HWND window, UINT message, WPARAM wParam, LPARAM lParam);
static nzUInt32 RetrieveStyle(HWND window);
#if NAZARA_UTILITY_THREADED_WINDOW #if NAZARA_UTILITY_THREADED_WINDOW
static void WindowThread(HWND* handle, DWORD styleEx, const wchar_t* title, DWORD style, unsigned int x, unsigned int y, unsigned int width, unsigned int height, NzWindowImpl* window, NzMutex* mutex, NzConditionVariable* condition); static void WindowThread(HWND* handle, DWORD styleEx, const wchar_t* title, DWORD style, unsigned int x, unsigned int y, unsigned int width, unsigned int height, NzWindowImpl* window, NzMutex* mutex, NzConditionVariable* condition);
#endif #endif
@ -86,6 +88,7 @@ class NzWindowImpl : NzNonCopyable
HCURSOR m_cursor; HCURSOR m_cursor;
HWND m_handle; HWND m_handle;
LONG_PTR m_callback; LONG_PTR m_callback;
nzUInt32 m_style;
NzVector2i m_maxSize; NzVector2i m_maxSize;
NzVector2i m_minSize; NzVector2i m_minSize;
NzVector2i m_mousePos; NzVector2i m_mousePos;

View File

@ -276,6 +276,19 @@ NzVector2ui NzWindow::GetSize() const
return m_impl->GetSize(); return m_impl->GetSize();
} }
nzUInt32 NzWindow::GetStyle() const
{
#if NAZARA_UTILITY_SAFE
if (!m_impl)
{
NazaraError("Window not created");
return 0;
}
#endif
return m_impl->GetStyle();
}
NzString NzWindow::GetTitle() const NzString NzWindow::GetTitle() const
{ {
#if NAZARA_UTILITY_SAFE #if NAZARA_UTILITY_SAFE