single-window

This commit is contained in:
Aaron Robinson 2004-03-08 06:01:07 +00:00
parent 18c5d2924b
commit 8e85a0bae0
15 changed files with 175 additions and 48 deletions

View File

@ -83,7 +83,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
# ADD LINK32 libjpeg.lib d3d8.lib dinput8.lib dxguid.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /map /debug /machine:I386 /pdbtype:sept /libpath:"Lib"
# ADD LINK32 libjpeg.lib d3d8.lib dinput8.lib dxguid.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /map /debug /machine:I386 /nodefaultlib:"libc" /pdbtype:sept /libpath:"Lib"
# SUBTRACT LINK32 /pdb:none
!ENDIF

BIN
Cxbx.opt

Binary file not shown.

View File

@ -2,6 +2,8 @@ Cxbx Todo (* denotes high priority, + denotes medium priority)
HLE :
* NSIS installer. Option to clear UDATA/TDATA/CxbxCache
* Modularize inline vertex buffers (Begin()/End())
* Direct3D_SetPushBufferSize for Antz Extreme Racing (4361). Do this

View File

@ -35,6 +35,7 @@
#define EMUEXE_H
#include "Exe.h"
#include <windows.h>
// ******************************************************************
// * class : EmuExe
@ -45,7 +46,7 @@ class EmuExe : public Exe
// ******************************************************************
// * Construct via Xbe file object
// ******************************************************************
EmuExe(class Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename);
EmuExe(class Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename, HWND hwndParent = NULL);
};
#endif

View File

@ -93,13 +93,14 @@
#define ID_SETTINGS_GENXP 40078
#define ID_SETTINGS_GENWT 40079
#define ID_SETTINGS_GENMA 40080
#define ID_EMULATION_STOP 40082
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 119
#define _APS_NEXT_COMMAND_VALUE 40082
#define _APS_NEXT_COMMAND_VALUE 40083
#define _APS_NEXT_CONTROL_VALUE 1050
#define _APS_NEXT_SYMED_VALUE 104
#endif

View File

@ -80,12 +80,17 @@ class WndMain : public Wnd
// * Exe operations
// ******************************************************************
void ImportExe(const char *x_filename);
bool ConvertToExe(const char *x_filename, bool x_bVerifyIfExists);
bool ConvertToExe(const char *x_filename, bool x_bVerifyIfExists, HWND hwndParent);
// ******************************************************************
// * start emulation (converting to .exe if not done already)
// ******************************************************************
void StartEmulation(EnumAutoConvert x_bAutoConvert);
void StartEmulation(EnumAutoConvert x_bAutoConvert, HWND hwndParent);
// ******************************************************************
// * stop emulation (close existing child window)
// ******************************************************************
void StopEmulation();
// ******************************************************************
// * accessor
@ -144,6 +149,7 @@ class WndMain : public Wnd
// ******************************************************************
bool m_bXbeChanged;
bool m_bExeChanged;
bool m_bCanStart;
// ******************************************************************
// * cached filenames
@ -151,6 +157,11 @@ class WndMain : public Wnd
char *m_XbeFilename;
char *m_ExeFilename;
// ******************************************************************
// * cached child window handle
// ******************************************************************
HWND m_hwndChild;
// ******************************************************************
// * should emulation always auto-create the .exe?
// ******************************************************************

View File

@ -50,7 +50,7 @@ extern "C" CXBXKRNL_API bool NTAPI EmuVerifyVersion(const char *szVersion);
extern "C" CXBXKRNL_API void NTAPI EmuCleanThread();
// initialize emulation
extern "C" CXBXKRNL_API void NTAPI EmuInit(void *pTLSData, Xbe::TLS *pTLS, Xbe::LibraryVersion *LibraryVersion, DebugMode DbgMode, char *szDebugFilename, Xbe::Header *XbeHeader, uint32 XbeHeaderSize, void (*Entry)());
extern "C" CXBXKRNL_API void NTAPI EmuInit(HWND hwndParent, void *pTLSData, Xbe::TLS *pTLS, Xbe::LibraryVersion *LibraryVersion, DebugMode DbgMode, char *szDebugFilename, Xbe::Header *XbeHeader, uint32 XbeHeaderSize, void (*Entry)());
// print out a warning message to the kernel debug log file
#ifdef _DEBUG_WARNINGS

View File

@ -169,6 +169,7 @@ BEGIN
POPUP "E&mulation"
BEGIN
MENUITEM "&Start\tF5", ID_EMULATION_START, GRAYED
MENUITEM "S&top\tF6", ID_EMULATION_STOP, GRAYED
END
POPUP "&Help"
BEGIN
@ -266,10 +267,10 @@ BEGIN
WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_VC_VIDEO_RESOLUTION,76,49,173,100,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
CONTROL "Start in Fullscreen",IDC_CV_FULLSCREEN,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,76,71,73,10
CONTROL "Use Hardware Video Mode",IDC_CV_FULLSCREEN,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,76,71,98,10
CONTROL "Force VSync",IDC_CV_VSYNC,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,154,71,65,10
WS_TABSTOP,182,71,65,10
PUSHBUTTON "Cancel",IDC_VC_CANCEL,146,92,50,14,BS_FLAT
PUSHBUTTON "Accept",IDC_VC_ACCEPT,203,92,50,14,BS_FLAT
GROUPBOX "Direct3D Configuration",IDC_STATIC,4,1,250,87,BS_CENTER

View File

@ -40,7 +40,7 @@
// ******************************************************************
// * constructor
// ******************************************************************
EmuExe::EmuExe(Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename) : Exe()
EmuExe::EmuExe(Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename, HWND hwndParent) : Exe()
{
ConstructorInit();
@ -578,6 +578,9 @@ EmuExe::EmuExe(Xbe *x_Xbe, DebugMode x_debug_mode, char *x_debug_filename) : Exe
*(uint32 *)((uint32)m_bzSection[i] + 41) = 0;
}
// Param 0 : hwndParent
*(uint32 *)((uint32)m_bzSection[i] + 46) = (uint32)hwndParent;
printf("OK\n");
}
}

View File

@ -63,6 +63,7 @@ __declspec(allocate(".cxbxplg")) uint08 Prolog[] =
0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3
0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3
0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3
0x68, 0xC3, 0xC3, 0xC3, 0xC3, // push 0xC3C3C3C3
0xFF, 0xD6, // call esi
0xC3 // ret
};

View File

@ -58,7 +58,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
{
MainWindow->OpenXbe(__argv[1]);
MainWindow->StartEmulation(AUTO_CONVERT_WINDOWS_TEMP);
MainWindow->StartEmulation(AUTO_CONVERT_WINDOWS_TEMP, MainWindow->GetHwnd());
}
while(MainWindow->GetError() == 0 && MainWindow->ProcessMessages())

View File

@ -47,7 +47,7 @@ Wnd::Wnd(HINSTANCE x_hInstance) : m_hInstance(x_hInstance)
m_h = 240;
m_parent = NULL;
m_clsstyle = CS_HREDRAW | CS_VREDRAW;
m_wndstyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE;
m_wndstyle = WS_CLIPCHILDREN | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE;
m_background = (HBRUSH)GetStockObject(BLACK_BRUSH);
m_initialized = false;

View File

@ -42,7 +42,7 @@
#include <io.h>
WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_Xbe(0), m_Exe(0), m_bExeChanged(false), m_bXbeChanged(false), m_AutoConvertToExe(AUTO_CONVERT_WINDOWS_TEMP), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE), m_dwRecentXbe(0), m_dwRecentExe(0)
WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_Xbe(0), m_Exe(0), m_bExeChanged(false), m_bXbeChanged(false), m_bCanStart(true), m_hwndChild(NULL), m_AutoConvertToExe(AUTO_CONVERT_WINDOWS_TEMP), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE), m_dwRecentXbe(0), m_dwRecentExe(0)
{
// initialize members
{
@ -297,6 +297,42 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
}
break;
case WM_PARENTNOTIFY:
{
switch(LOWORD(wParam))
{
case WM_CREATE:
{
m_hwndChild = GetWindow(hwnd, GW_CHILD);
char AsciiTitle[255];
sprintf(AsciiTitle, "Cxbx : Emulating %s...", m_Xbe->m_szAsciiTitle);
SetWindowText(m_hwnd, AsciiTitle);
RefreshMenus();
}
break;
case WM_DESTROY:
{
m_hwndChild = NULL;
SetWindowText(m_hwnd, "Cxbx " _CXBX_VERSION);
RefreshMenus();
}
break;
}
};
case WM_SYSKEYDOWN:
{
if(m_hwndChild != 0)
{
SendMessage(m_hwndChild, uMsg, wParam, lParam);
}
};
case WM_PAINT:
{
static bool s_bInitMenu = true;
@ -366,10 +402,30 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
{
case VK_F5:
{
if(m_Xbe != 0)
StartEmulation(m_AutoConvertToExe);
if(m_Xbe != 0 && (m_hwndChild == NULL) && m_bCanStart)
{
m_bCanStart = false;
StartEmulation(m_AutoConvertToExe, hwnd);
}
}
break;
case VK_F6:
{
if(m_hwndChild != NULL && !m_bCanStart)
{
StopEmulation();
}
}
break;
default:
{
if(m_hwndChild != 0)
{
SendMessage(m_hwndChild, uMsg, wParam, lParam);
}
}
}
}
break;
@ -458,7 +514,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
break;
case ID_FILE_EXPORTTOEXE:
ConvertToExe(NULL, true);
ConvertToExe(NULL, true, hwnd);
break;
case ID_FILE_RXBE_0:
@ -1004,7 +1060,11 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
break;
case ID_EMULATION_START:
StartEmulation(m_AutoConvertToExe);
StartEmulation(m_AutoConvertToExe, hwnd);
break;
case ID_EMULATION_STOP:
StopEmulation();
break;
case ID_SETTINGS_GENWT:
@ -1320,7 +1380,10 @@ void WndMain::RefreshMenus()
HMENU emul_menu = GetSubMenu(menu, 4);
// enable emulation start
EnableMenuItem(emul_menu, ID_EMULATION_START, MF_BYCOMMAND | (m_Xbe == 0) ? MF_GRAYED : MF_ENABLED);
EnableMenuItem(emul_menu, ID_EMULATION_START, MF_BYCOMMAND | (m_Xbe == 0 || (m_hwndChild != NULL)) ? MF_GRAYED : MF_ENABLED);
// enable emulation stop
EnableMenuItem(emul_menu, ID_EMULATION_STOP, MF_BYCOMMAND | (m_hwndChild == NULL) ? MF_GRAYED : MF_ENABLED);
}
}
}
@ -1513,6 +1576,8 @@ void WndMain::OpenXbe(const char *x_filename)
// close xbe file
void WndMain::CloseXbe()
{
StopEmulation();
if(m_bXbeChanged)
{
int ret = MessageBox(m_hwnd, "Changes have been made, do you wish to save?", "Cxbx", MB_ICONQUESTION | MB_YESNOCANCEL);
@ -1689,7 +1754,7 @@ void WndMain::ImportExe(const char *x_filename)
}
// convert to exe file
bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists)
bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists, HWND hwndParent)
{
char filename[260] = "default.exe";
@ -1733,7 +1798,7 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists)
// convert file
{
EmuExe i_EmuExe(m_Xbe, m_KrnlDebug, m_KrnlDebugFilename);
EmuExe i_EmuExe(m_Xbe, m_KrnlDebug, m_KrnlDebugFilename, hwndParent);
i_EmuExe.Export(filename);
@ -1756,7 +1821,7 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists)
}
// start emulation
void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert)
void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert, HWND hwndParent)
{
char szBuffer[260];
@ -1782,19 +1847,19 @@ void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert)
strcat(szTempPath, &szBuffer[c]);
if(!ConvertToExe(szTempPath, false))
if(!ConvertToExe(szTempPath, false, hwndParent))
return;
}
else if(x_AutoConvert == AUTO_CONVERT_XBE_PATH)
{
SuggestFilename(m_XbeFilename, szBuffer, ".exe");
if(!ConvertToExe(szBuffer, false))
if(!ConvertToExe(szBuffer, false, hwndParent))
return;
}
else
{
if(!ConvertToExe(NULL, true))
if(!ConvertToExe(NULL, true, hwndParent))
return;
}
}
@ -1820,6 +1885,7 @@ void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert)
if((int)ShellExecute(NULL, "open", m_ExeFilename, NULL, szBuffer, SW_SHOWDEFAULT) <= 32)
{
m_bCanStart = true;
MessageBox(m_hwnd, "Emulation failed.\n\nTry converting again. If this message repeats, the Xbe is not supported.", "Cxbx", MB_ICONSTOP | MB_OK);
printf("WndMain: %s shell failed.\n", m_Xbe->m_szAsciiTitle);
@ -1830,3 +1896,10 @@ void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert)
}
}
}
// stop emulation
void WndMain::StopEmulation()
{
SendMessage(m_hwndChild, WM_CLOSE, 0, 0);
m_bCanStart = true;
}

View File

@ -63,6 +63,7 @@ namespace XTL
// Ugly Global Pull-In
extern HWND g_hEmuWindow; // rendering window
extern HWND g_hEmuParent; // rendering window parent
// Global Variable(s)
extern Xbe::TLS *g_pTLS = NULL;
@ -140,6 +141,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuCleanThread()
// initialize emulation
extern "C" CXBXKRNL_API void NTAPI EmuInit
(
HWND hwndParent,
void *pTLSData,
Xbe::TLS *pTLS,
Xbe::LibraryVersion *pLibraryVersion,
@ -153,6 +155,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit
g_pTLS = pTLS;
g_pTLSData = pTLSData;
g_pXbeHeader = pXbeHeader;
g_hEmuParent = hwndParent;
// For Unicode Conversions
setlocale(LC_ALL, "English");
@ -198,6 +201,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit
printf("EmuMain (0x%X): EmuInit\n"
"(\n"
" hwndParent : 0x%.08X\n"
" pTLSData : 0x%.08X\n"
" pTLS : 0x%.08X\n"
" pLibraryVersion : 0x%.08X\n"
@ -207,7 +211,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit
" pXBEHeaderSize : 0x%.08X\n"
" Entry : 0x%.08X\n"
");\n",
GetCurrentThreadId(), pTLSData, pTLS, pLibraryVersion, DbgMode, szDebugFilename, pXbeHeader, dwXbeHeaderSize, Entry);
GetCurrentThreadId(), hwndParent, pTLSData, pTLS, pLibraryVersion, DbgMode, szDebugFilename, pXbeHeader, dwXbeHeaderSize, Entry);
#else
printf("EmuMain (0x%X): Debug Trace Disabled.\n", GetCurrentThreadId());
@ -559,7 +563,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit
// _USE_XGMATH Disabled in mesh :[
// halo : dword_0_2E2D18
// halo : 1744F0 (bink)
_asm int 3
//_asm int 3
Entry();
@ -653,6 +657,8 @@ extern "C" CXBXKRNL_API void NTAPI EmuCleanup(const char *szErrorMessage, ...)
freopen("nul", "w", stdout);
}
SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0);
TerminateProcess(GetCurrentProcess(), 0);
return;
@ -717,10 +723,10 @@ extern "C" CXBXKRNL_API void NTAPI EmuSuspend()
{
char szBuffer[256];
GetWindowText(g_hEmuWindow, szBuffer, 255 - 10);
GetWindowText(g_hEmuParent, szBuffer, 255 - 10);
strcat(szBuffer, " (paused)");
SetWindowText(g_hEmuWindow, szBuffer);
SetWindowText(g_hEmuParent, szBuffer);
}
g_bEmuSuspended = TRUE;
@ -736,11 +742,11 @@ extern "C" CXBXKRNL_API void NTAPI EmuResume()
{
char szBuffer[256];
GetWindowText(g_hEmuWindow, szBuffer, 255);
GetWindowText(g_hEmuParent, szBuffer, 255);
szBuffer[strlen(szBuffer)-9] = '\0';
SetWindowText(g_hEmuWindow, szBuffer);
SetWindowText(g_hEmuParent, szBuffer);
}
for(int v=0;v<MAXIMUM_XBOX_THREADS;v++)
@ -898,6 +904,9 @@ extern int EmuException(LPEXCEPTION_POINTERS e)
{
printf("EmuMain (0x%X): Aborting Emulation\n", GetCurrentThreadId());
fflush(stdout);
SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0);
ExitProcess(1);
}
else if(ret == IDIGNORE)
@ -922,6 +931,9 @@ extern int EmuException(LPEXCEPTION_POINTERS e)
{
printf("EmuMain (0x%X): Aborting Emulation\n", GetCurrentThreadId());
fflush(stdout);
SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0);
ExitProcess(1);
}
}
@ -1164,6 +1176,8 @@ int ExitException(LPEXCEPTION_POINTERS e)
return EXCEPTION_CONTINUE_SEARCH;
}
SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0);
ExitProcess(1);
return EXCEPTION_CONTINUE_SEARCH;

View File

@ -57,6 +57,7 @@ namespace XTL
// Global(s)
extern HWND g_hEmuWindow = NULL; // rendering window
extern HWND g_hEmuParent = NULL; // rendering window parent
extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8 = NULL; // Direct3D8 Device
extern XTL::LPDIRECTDRAWSURFACE7 g_pDDSPrimary = NULL; // DirectDraw7 Primary Surface
extern XTL::LPDIRECTDRAWSURFACE7 g_pDDSOverlay7 = NULL; // DirectDraw7 Overlay Surface
@ -156,6 +157,9 @@ VOID XTL::EmuD3DInit(Xbe::Header *XbeHeader, uint32 XbeHeaderSize)
{
g_EmuShared->GetXBVideo(&g_XBVideo);
if(g_XBVideo.GetFullscreen())
g_hEmuParent = NULL;
// cache XbeHeader and size of XbeHeader
g_XbeHeader = XbeHeader;
g_XbeHeaderSize = XbeHeaderSize;
@ -265,7 +269,7 @@ static BOOL WINAPI EmuEnumDisplayDevices(GUID FAR *lpGUID, LPSTR lpDriverDescrip
}
// window message processing thread
static DWORD WINAPI EmuRenderWindow(LPVOID)
static DWORD WINAPI EmuRenderWindow(LPVOID lpVoid)
{
char AsciiTitle[50];
@ -317,7 +321,7 @@ static DWORD WINAPI EmuRenderWindow(LPVOID)
// create the window
{
DWORD dwStyle = WS_OVERLAPPEDWINDOW;
DWORD dwStyle = g_XBVideo.GetFullscreen() ? WS_OVERLAPPEDWINDOW : WS_CHILD;
int nTitleHeight = GetSystemMetrics(SM_CYCAPTION);
int nBorderWidth = GetSystemMetrics(SM_CXSIZEFRAME);
@ -336,17 +340,29 @@ static DWORD WINAPI EmuRenderWindow(LPVOID)
dwStyle = WS_POPUP;
}
HWND hwndParent = GetDesktopWindow();
if(!g_XBVideo.GetFullscreen())
{
hwndParent = g_hEmuParent;
}
g_hEmuWindow = CreateWindow
(
"CxbxRender", AsciiTitle,
dwStyle, x, y, nWidth, nHeight,
GetDesktopWindow(), NULL, GetModuleHandle(NULL), NULL
hwndParent, NULL, GetModuleHandle(NULL), NULL
);
}
ShowWindow(g_hEmuWindow, SW_SHOWDEFAULT);
ShowWindow(g_hEmuWindow, g_XBVideo.GetFullscreen() ? SW_SHOWDEFAULT : SW_SHOWMAXIMIZED);
UpdateWindow(g_hEmuWindow);
if(!g_XBVideo.GetFullscreen())
{
SetFocus(g_hEmuParent);
}
// initialize direct input
if(!XTL::EmuDInputInit())
EmuCleanup("Could not initialize DirectInput!");
@ -387,25 +403,20 @@ void ToggleFauxFullscreen(HWND hWnd)
return;
static bool bIsNormal = true;
static LONG lRestore = 0, lRestoreEx = 0;
static RECT Rect;
if(bIsNormal)
{
lRestore = GetWindowLong(hWnd, GWL_STYLE);
lRestoreEx = GetWindowLong(hWnd, GWL_EXSTYLE);
SetParent(hWnd, NULL);
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
GetWindowRect(hWnd, &Rect);
ShowWindow(hWnd, SW_MAXIMIZE);
}
else
{
SetWindowLong(hWnd, GWL_STYLE, lRestore);
SetWindowLong(hWnd, GWL_EXSTYLE, lRestoreEx);
ShowWindow(hWnd, SW_RESTORE);
SetWindowPos(hWnd, HWND_NOTOPMOST, Rect.left, Rect.top, Rect.right - Rect.left, Rect.bottom - Rect.top, 0);
SetParent(hWnd, g_hEmuParent);
SetWindowLong(hWnd, GWL_STYLE, WS_CHILD);
ShowWindow(hWnd, SW_MAXIMIZE);
SetFocus(g_hEmuParent);
}
bIsNormal = !bIsNormal;
@ -498,6 +509,15 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar
DestroyWindow(hWnd);
break;
case WM_SETFOCUS:
{
if(g_hEmuParent != NULL)
{
SetFocus(g_hEmuParent);
}
}
break;
case WM_SETCURSOR:
{
if(g_XBVideo.GetFullscreen())
@ -4928,9 +4948,9 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_UpdateOverlay
RECT SourRect = {0, 0, g_dwOverlayW, g_dwOverlayH}, DestRect;
MONITORINFO MonitorInfo = {0};
int nTitleHeight = GetSystemMetrics(SM_CYCAPTION);
int nBorderWidth = GetSystemMetrics(SM_CXSIZEFRAME);
int nBorderHeight = GetSystemMetrics(SM_CYSIZEFRAME);
int nTitleHeight = 0;//GetSystemMetrics(SM_CYCAPTION);
int nBorderWidth = 0;//GetSystemMetrics(SM_CXSIZEFRAME);
int nBorderHeight = 0;//GetSystemMetrics(SM_CYSIZEFRAME);
MonitorInfo.cbSize = sizeof(MONITORINFO);
GetMonitorInfo(g_hMonitor, &MonitorInfo);