Optimized WindowImpl::Get[Height|Position|Size|Width]

Former-commit-id: e482fc04a632e5338601627f7dd7c6f0fe18d135
This commit is contained in:
Lynix 2013-08-21 18:46:29 +02:00
parent b9b572c60c
commit 1e6fe40707
2 changed files with 43 additions and 24 deletions

View File

@ -137,6 +137,9 @@ bool NzWindowImpl::Create(NzVideoMode mode, const NzString& title, nzUInt32 styl
m_handle = CreateWindowExW(win32StyleEx, className, wtitle.get(), win32Style, x, y, width, height, nullptr, nullptr, GetModuleHandle(nullptr), this);
#endif
if (!m_handle)
return false;
if (fullscreen)
{
SetForegroundWindow(m_handle);
@ -150,7 +153,15 @@ bool NzWindowImpl::Create(NzVideoMode mode, const NzString& title, nzUInt32 styl
#endif
m_style = style;
return m_handle != nullptr;
// Récupération de la position/taille de la fenêtre (Après sa création)
RECT clientRect, windowRect;
GetClientRect(m_handle, &clientRect);
GetWindowRect(m_handle, &windowRect);
m_position.Set(windowRect.left, windowRect.top);
m_size.Set(clientRect.right-clientRect.left, clientRect.bottom-clientRect.top);
return true;
}
bool NzWindowImpl::Create(NzWindowHandle handle)
@ -170,6 +181,13 @@ bool NzWindowImpl::Create(NzWindowHandle handle)
#endif
m_style = RetrieveStyle(m_handle);
RECT clientRect, windowRect;
GetClientRect(m_handle, &clientRect);
GetWindowRect(m_handle, &windowRect);
m_position.Set(windowRect.left, windowRect.top);
m_size.Set(clientRect.right-clientRect.left, clientRect.bottom-clientRect.top);
return true;
}
@ -212,23 +230,17 @@ NzWindowHandle NzWindowImpl::GetHandle() const
unsigned int NzWindowImpl::GetHeight() const
{
RECT rect;
GetClientRect(m_handle, &rect);
return rect.bottom-rect.top;
return m_size.y;
}
NzVector2i NzWindowImpl::GetPosition() const
{
RECT rect;
GetWindowRect(m_handle, &rect);
return NzVector2i(rect.left, rect.top);
return m_position;
}
NzVector2ui NzWindowImpl::GetSize() const
{
RECT rect;
GetClientRect(m_handle, &rect);
return NzVector2ui(rect.right-rect.left, rect.bottom-rect.top);
return m_size;
}
nzUInt32 NzWindowImpl::GetStyle() const
@ -252,9 +264,7 @@ NzString NzWindowImpl::GetTitle() const
unsigned int NzWindowImpl::GetWidth() const
{
RECT rect;
GetClientRect(m_handle, &rect);
return rect.right-rect.left;
return m_size.x;
}
bool NzWindowImpl::HasFocus() const
@ -549,7 +559,11 @@ bool NzWindowImpl::HandleMessage(HWND window, UINT message, WPARAM wParam, LPARA
m_sizemove = false;
// On vérifie ce qui a changé
NzVector2i position = GetPosition();
RECT clientRect, windowRect;
GetClientRect(m_handle, &clientRect);
GetWindowRect(m_handle, &windowRect);
NzVector2i position(windowRect.left, windowRect.top);
if (m_position != position)
{
m_position = position;
@ -561,7 +575,7 @@ bool NzWindowImpl::HandleMessage(HWND window, UINT message, WPARAM wParam, LPARA
m_parent->PushEvent(event);
}
NzVector2ui size = GetSize();
NzVector2ui size(clientRect.right-clientRect.left, clientRect.bottom-clientRect.top);
if (m_size != size)
{
m_size = size;
@ -797,12 +811,13 @@ bool NzWindowImpl::HandleMessage(HWND window, UINT message, WPARAM wParam, LPARA
case WM_MOVE:
{
NzVector2i position = GetPosition();
RECT windowRect;
GetWindowRect(m_handle, &windowRect);
NzEvent event;
event.type = nzEventType_Moved;
event.position.x = position.x;
event.position.y = position.y;
event.position.x = windowRect.left;
event.position.y = windowRect.top;
m_parent->PushEvent(event);
break;
@ -865,13 +880,14 @@ bool NzWindowImpl::HandleMessage(HWND window, UINT message, WPARAM wParam, LPARA
if (!m_sizemove && wParam != SIZE_MINIMIZED)
#endif
{
NzVector2ui size = GetSize(); // On récupère uniquement la taille de la zone client
#if !NAZARA_UTILITY_THREADED_WINDOW
RECT rect;
GetClientRect(m_handle, &rect);
NzVector2ui size(rect.right-rect.left, rect.bottom-rect.top); // On récupère uniquement la taille de la zone client
if (m_size == size)
break;
m_size = size;
#endif
NzEvent event;
event.type = nzEventType_Resized;
@ -1185,12 +1201,16 @@ nzUInt32 NzWindowImpl::RetrieveStyle(HWND handle)
#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)
{
*handle = CreateWindowExW(styleEx, className, title, style, x, y, width, height, nullptr, nullptr, GetModuleHandle(nullptr), window);
HWND& winHandle = *handle;
winHandle = CreateWindowExW(styleEx, className, title, style, x, y, width, height, nullptr, nullptr, GetModuleHandle(nullptr), window);
mutex->Lock();
condition->Signal();
mutex->Unlock(); // mutex et condition sont considérés invalides à partir d'ici
if (!winHandle)
return;
while (window->m_threadActive)
window->ProcessEvents(true);

View File

@ -92,10 +92,9 @@ class NzWindowImpl : NzNonCopyable
NzVector2i m_maxSize;
NzVector2i m_minSize;
NzVector2i m_mousePos;
#if !NAZARA_UTILITY_THREADED_WINDOW
NzVector2i m_position;
NzVector2ui m_size;
#else
#if NAZARA_UTILITY_THREADED_WINDOW
NzThread* m_thread;
#endif
NzWindow* m_parent;