Example #1
0
/// Window message procedure callback.
///
/// @param[in] hWnd    Window handle.
/// @param[in] msg     Message ID.
/// @param[in] wParam  Additional message information (dependent on the message sent).
/// @param[in] lParam  Additional message information (dependent on the message sent).
///
/// @return  Result of the message processing (dependent on the message sent).
LRESULT CALLBACK WindowManager::WindowProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	HELIUM_ASSERT( hWnd );

	switch( msg )
	{
	case WM_CREATE:
		{
			// Window pointer is passed in the lpCreateParams member of the CREATESTRUCT structure provided in
			// lParam, so set it as the user data pointer in the window itself so we can easily retrieve it from any
			// future messages.
			CREATESTRUCT* pCreateStruct = reinterpret_cast< CREATESTRUCT* >( lParam );
			HELIUM_ASSERT( pCreateStruct );

			Window* pWindow = static_cast< Window* >( pCreateStruct->lpCreateParams );
			HELIUM_ASSERT( pWindow );

			SetWindowLongPtr( hWnd, GWLP_USERDATA, reinterpret_cast< LONG_PTR >( pWindow ) );

			return 0;
		}

	case WM_CLOSE:
		{
			Window* pWindow = reinterpret_cast< Window* >( GetWindowLongPtr( hWnd, GWLP_USERDATA ) );
			HELIUM_ASSERT( pWindow );

			pWindow->Destroy();

			return 0;
		}

	case WM_DESTROY:
		{
			// Window is being destroyed, so clear reference to Window object and destroy it.
			Window* pWindow = reinterpret_cast< Window* >( GetWindowLongPtr( hWnd, GWLP_USERDATA ) );
			HELIUM_ASSERT( pWindow );
			SetWindowLongPtr( hWnd, GWLP_USERDATA, 0 );

			const Delegate<Window*>& rOnDestroyed = pWindow->GetOnDestroyed();
			if( rOnDestroyed.Valid() )
			{
				rOnDestroyed.Invoke( pWindow );
			}

			delete pWindow;

			return 0;
		}
	}

	return DefWindowProc( hWnd, msg, wParam, lParam );
}