From 7bf1364fb5b4bb1607b1f96ab5d671a17333feae Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 11 Feb 2006 06:53:21 +0000 Subject: [PATCH] Add a couple small helpers for two types of Windows windows. (I tried merging these, but it's not worth it; they're too simple and a little too different for it to be worth it.) (How does one unambiguously refer to a Windows window without sounding silly?) --- .../src/archutils/Win32/MessageWindow.cpp | 85 +++++++++++++++++++ stepmania/src/archutils/Win32/MessageWindow.h | 52 ++++++++++++ .../src/archutils/Win32/WindowsDialogBox.cpp | 56 ++++++++++++ .../src/archutils/Win32/WindowsDialogBox.h | 50 +++++++++++ 4 files changed, 243 insertions(+) create mode 100644 stepmania/src/archutils/Win32/MessageWindow.cpp create mode 100644 stepmania/src/archutils/Win32/MessageWindow.h create mode 100644 stepmania/src/archutils/Win32/WindowsDialogBox.cpp create mode 100644 stepmania/src/archutils/Win32/WindowsDialogBox.h diff --git a/stepmania/src/archutils/Win32/MessageWindow.cpp b/stepmania/src/archutils/Win32/MessageWindow.cpp new file mode 100644 index 0000000000..054e57a5ed --- /dev/null +++ b/stepmania/src/archutils/Win32/MessageWindow.cpp @@ -0,0 +1,85 @@ +#include "global.h" +#include "MessageWindow.h" +#include "RageUtil.h" +#include "AppInstance.h" + +MessageWindow::MessageWindow( const RString &sClassName ) +{ + AppInstance inst; + WNDCLASS WindowClass = + { + CS_OWNDC | CS_BYTEALIGNCLIENT, + WndProc, + 0, /* cbClsExtra */ + 0, /* cbWndExtra */ + inst, /* hInstance */ + NULL, /* set icon later */ + LoadCursor( NULL, IDC_ARROW ), /* default cursor */ + NULL, /* hbrBackground */ + NULL, /* lpszMenuName */ + sClassName /* lpszClassName */ + }; + + if( !RegisterClassA(&WindowClass) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS ) + RageException::Throw( "%s", werr_ssprintf( GetLastError(), "RegisterClass" ).c_str() ); + + // XXX: on 2k/XP, use HWND_MESSAGE as parent + m_hWnd = CreateWindow( sClassName, sClassName, WS_DISABLED, 0, 0, 0, 0, NULL, NULL, inst, NULL ); + ASSERT( m_hWnd != NULL ); + + SetProp( m_hWnd, "MessageWindow", this ); +} + +MessageWindow::~MessageWindow() +{ + RemoveProp( m_hWnd, "MessageWindow" ); + DestroyWindow( m_hWnd ); +} + +void MessageWindow::Run() +{ + /* Process messages until we get WM_QUIT. */ + while( 1 ) + { + MSG msg; + int iRet = GetMessage( &msg, m_hWnd, 0, 0 ); + ASSERT( iRet != -1 ); + if( iRet == 0 ) + break; + DispatchMessage( &msg ); + } +} + +LRESULT CALLBACK MessageWindow::WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + MessageWindow *pThis = (MessageWindow *) GetProp( hWnd, "MessageWindow" ); + if( pThis != NULL && pThis->HandleMessage(msg, wParam, lParam) ) + return 0; + + return DefWindowProc( hWnd, msg, wParam, lParam ); +} + +/* + * (c) 2006 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/archutils/Win32/MessageWindow.h b/stepmania/src/archutils/Win32/MessageWindow.h new file mode 100644 index 0000000000..f2c79f8627 --- /dev/null +++ b/stepmania/src/archutils/Win32/MessageWindow.h @@ -0,0 +1,52 @@ +/* MessageWindow - simplifies creation of windows that exist only to receive messages. */ + +#ifndef MESSAGE_WINDOW_H +#define MESSAGE_WINDOW_H + +#include + +class MessageWindow +{ +public: + MessageWindow( const RString &sClassName ); + ~MessageWindow(); + + /* Run the message loop until WM_QUIT is received. */ + void Run(); + + HWND GetHwnd() { return m_hWnd; } + +protected: + virtual bool HandleMessage( UINT msg, WPARAM wParam, LPARAM lParam ) { return false; } + +private: + static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); + HWND m_hWnd; +}; + +#endif + +/* + * (c) 2006 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/archutils/Win32/WindowsDialogBox.cpp b/stepmania/src/archutils/Win32/WindowsDialogBox.cpp new file mode 100644 index 0000000000..547a851b02 --- /dev/null +++ b/stepmania/src/archutils/Win32/WindowsDialogBox.cpp @@ -0,0 +1,56 @@ +#include "global.h" +#include "WindowsDialogBox.h" + +WindowsDialogBox::WindowsDialogBox() +{ + m_hWnd = NULL; +} + +void WindowsDialogBox::Run( int iDialog ) +{ + char szFullAppPath[MAX_PATH]; + GetModuleFileName( NULL, szFullAppPath, MAX_PATH ); + HINSTANCE hHandle = LoadLibrary( szFullAppPath ); + + DialogBoxParam( hHandle, MAKEINTRESOURCE(iDialog), NULL, DlgProc, (LPARAM) this ); +} + +BOOL APIENTRY WindowsDialogBox::DlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + if( msg == WM_INITDIALOG ) + SetProp( hDlg, "WindowsDialogBox", (HANDLE) lParam ); + + WindowsDialogBox *pThis = (WindowsDialogBox *) GetProp( hDlg, "WindowsDialogBox" ); + if( pThis == NULL ) + return FALSE; + + if( pThis->m_hWnd == NULL ) + pThis->m_hWnd = hDlg; + + return pThis->HandleMessage( msg, wParam, lParam ); +} + +/* + * (c) 2006 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/archutils/Win32/WindowsDialogBox.h b/stepmania/src/archutils/Win32/WindowsDialogBox.h new file mode 100644 index 0000000000..17d251a607 --- /dev/null +++ b/stepmania/src/archutils/Win32/WindowsDialogBox.h @@ -0,0 +1,50 @@ +/* WindowsDialogBox - Simplifies the creation of modal Windows dialog boxes. */ + +#ifndef WINDOWS_DIALOG_BOX_H +#define WINDOWS_DIALOG_BOX_H + +#include + +class WindowsDialogBox +{ +public: + WindowsDialogBox(); + virtual ~WindowsDialogBox() { } + void Run( int iDialog ); + + HWND GetHwnd() { return m_hWnd; } + +protected: + virtual bool HandleMessage( UINT msg, WPARAM wParam, LPARAM lParam ) { return false; } + +private: + static BOOL APIENTRY DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); + HWND m_hWnd; +}; + +#endif + +/* + * (c) 2006 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */