/// 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 ); }