1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

resize window on bnet

This commit is contained in:
FunkyFr3sh 2019-08-14 17:53:36 +02:00
parent 43224a0f65
commit 8f28bfad9c
3 changed files with 68 additions and 2 deletions

View File

@ -41,6 +41,7 @@ extern BOOL ChildWindowExists;
BOOL detect_cutscene();
void LimitGameTicks();
void ToggleFullscreen();
void SetWindowRect(int x, int y, int width, int height, UINT flags);
DWORD WINAPI render_main(void);
DWORD WINAPI render_soft_main(void);
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
@ -131,6 +132,8 @@ typedef struct IDirectDrawImpl
BOOL resizable;
BOOL bnetActive;
BOOL bnetWasFullscreen;
RECT bnetWinRect;
POINT bnetPos;
SpeedLimiter ticksLimiter;
SpeedLimiter flipLimiter;
SpeedLimiter fpsLimiter;

View File

@ -1002,6 +1002,37 @@ BOOL UnadjustWindowRectEx(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwExStyle
return fRc;
}
void SetWindowRect(int x, int y, int width, int height, UINT flags)
{
if (ddraw->windowed)
{
if (ddraw->render.thread)
{
EnterCriticalSection(&ddraw->cs);
ddraw->render.run = FALSE;
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
LeaveCriticalSection(&ddraw->cs);
WaitForSingleObject(ddraw->render.thread, INFINITE);
ddraw->render.thread = NULL;
}
if ((flags & SWP_NOMOVE) == 0)
{
WindowRect.left = x;
WindowRect.top = y;
}
if ((flags & SWP_NOSIZE) == 0)
{
WindowRect.bottom = height;
WindowRect.right = width;
}
ddraw_SetDisplayMode(ddraw, ddraw->width, ddraw->height, ddraw->bpp);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT rc = { 0, 0, ddraw->render.width, ddraw->render.height };

View File

@ -435,9 +435,26 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
ddraw->bnetActive = FALSE;
mouse_lock();
if (ddraw->windowed && ddraw->bnetWasFullscreen)
if (ddraw->windowed)
{
SetTimer(ddraw->hWnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
if (!ddraw->fullscreen)
{
ddraw->bnetPos.x = ddraw->bnetPos.y = 0;
ClientToScreen(ddraw->hWnd, &ddraw->bnetPos);
int width = ddraw->bnetWinRect.right - ddraw->bnetWinRect.left;
int height = ddraw->bnetWinRect.bottom - ddraw->bnetWinRect.top;
UINT flags = width != ddraw->width || height != ddraw->height ? 0 : SWP_NOMOVE;
SetWindowRect(ddraw->bnetWinRect.left, ddraw->bnetWinRect.top, width, height, flags);
}
if (ddraw->bnetWasFullscreen)
{
SetTimer(ddraw->hWnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
}
ddraw->resizable = TRUE;
}
}
}
@ -461,6 +478,21 @@ HWND WINAPI fake_CreateWindowExA(
ddraw->bnetWasFullscreen = TRUE;
}
if (!ddraw->fullscreen)
{
GetClientRect(ddraw->hWnd, &ddraw->bnetWinRect);
MapWindowPoints(ddraw->hWnd, HWND_DESKTOP, (LPPOINT)&ddraw->bnetWinRect, 2);
int width = ddraw->bnetWinRect.right - ddraw->bnetWinRect.left;
int height = ddraw->bnetWinRect.bottom - ddraw->bnetWinRect.top;
int x = ddraw->bnetPos.x || ddraw->bnetPos.y ? ddraw->bnetPos.x : -32000;
int y = ddraw->bnetPos.x || ddraw->bnetPos.y ? ddraw->bnetPos.y : -32000;
UINT flags = width != ddraw->width || height != ddraw->height ? 0 : SWP_NOMOVE;
SetWindowRect(x, y, ddraw->width, ddraw->height, flags);
ddraw->resizable = FALSE;
}
ddraw->bnetActive = TRUE;
mouse_unlock();
}