/* *============================================================================= * * Filename: AnimView.cpp * Version: 1.0 * Date: 11/03/97 * Author: Vincent Lhullier * * Description: view box to display list of animations * and control to display animation * functions for saving animation in binary format *=========================================================================== */ //#undef DEBUG #include "stdafx.h" //#define DEBUG #include #include "ACP_Base.h" #include "ITF.h" #include "DPT.h" #define D_State_Define #define D_ObjsTbls_Define #define D_ZdxStuff_StructureDefine //#include "DNM.h" #include "incGAM.h" #undef D_ZdxStuff_StructureDefine #undef D_ObjsTbls_Define #undef D_State_Define #include "TFA.h" #include "TAN.h" #include "animview.h" //#include "animview.hh" #include "T3D_res.h" #include "X:\Cpa\Main\inc\_EditID.h" #include "T3DWorld.hpp" /*-----------------------------------------------------------------------------*/ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /*-----------------------------------------------------------------------------*/ /* *============================================================================= * saving animation in binary file *============================================================================= */ #define M_RedrawAll() (m_p_oT3DInterf -> GetInterface() -> fn_vUpdateAll(E_mc_JustDraw) ) #define M_GetClientRect( pWnd, poRect ) (pWnd) -> GetWindowRect( poRect );ScreenToClient( poRect ) #define M_GetClientRectId( Id, poRect ) M_GetClientRect( GetDlgItem( Id ), poRect ) #define M_SetClientRect( pWnd, poRect ) (pWnd) -> MoveWindow( poRect ) #define M_SetClientRectId( Id, poRect ) M_SetClientRect( GetDlgItem( Id ), poRect ) /* *============================================================================= * class AnimView *============================================================================= */ IMPLEMENT_DYNCREATE(CAnimationView, CFormView) /* *----------------------------------------------------------------------------- * Constructor *----------------------------------------------------------------------------- */ CAnimationView::CAnimationView(): CFormView(CAnimationView::IDD) { //{{AFX_DATA_INIT(CAnimationView) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT bInitialUpdate = TRUE; m_p_oFamily = NULL; m_p_oT3DInterf = NULL; m_p_oTool3DWorld = NULL; m_p_oCurrentAnim = NULL; m_p_oCurrentAction = NULL; //Mircea Dunka 8.10.1998 } /* *----------------------------------------------------------------------------- * Destructor *----------------------------------------------------------------------------- */ CAnimationView::~CAnimationView() { m_oBitmapPlay.DeleteObject(); m_oBitmapStop.DeleteObject(); m_oBitmapReverse.DeleteObject(); m_oBitmapForward.DeleteObject(); m_oBitmapRewind.DeleteObject(); } /* *----------------------------------------------------------------------------- * Data exchange *----------------------------------------------------------------------------- */ void CAnimationView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAnimationView) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } /* *----------------------------------------------------------------------------- * Message map *----------------------------------------------------------------------------- */ BEGIN_MESSAGE_MAP(CAnimationView, CFormView) //{{AFX_MSG_MAP(CAnimationView) ON_WM_SHOWWINDOW() ON_WM_SIZE() ON_LBN_SELCHANGE(IDC_LIST_ANIMS, OnSelchangeListAnims) ON_LBN_SELCHANGE(IDC_LIST_ACTIONS, OnSelchangeListActions)//Mircea Dunka 6.10.98 ON_BN_CLICKED(IDC_BUTTON_LOAD, OnButtonLoad) ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlay) ON_BN_CLICKED(IDC_BT_REINIT, OnButtonReinit) ON_WM_TIMER() ON_WM_HSCROLL() ON_BN_CLICKED(IDC_BT_ANIM, OnButtonAnim) ON_BN_CLICKED(IDC_BT_ACTION, OnButtonAction) ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop) ON_BN_CLICKED(IDC_BUTTON_FORWARD, OnButtonForward) ON_BN_CLICKED(IDC_BUTTON_REVERSE, OnButtonReverse) ON_BN_CLICKED(IDC_BUTTON_REWIND, OnButtonRewind) ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp) ON_LBN_DBLCLK(IDC_LIST_ANIMS, OnDblclkListAnims) ON_WM_MEASUREITEM() ON_WM_DRAWITEM() ON_WM_HELPINFO() //}}AFX_MSG_MAP END_MESSAGE_MAP() /* *============================================================================= * CAnimationView specific functions *============================================================================= */ void CAnimationView::mfn_vInitDialog( CPA_Family *_p_oCurrentFamily, CPA_Animation *p_oAnimation /*=NULL*/, unsigned short _uwFrame /*=0*/) { CListBox *pLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS ); // unsigned char ucFrameRate; m_p_oFamily = _p_oCurrentFamily; fn_vFillAnimList(); //28.09.98 Mircea Dunka mfn_vFillActionList(); //aded action list m_p_oCurrentAnim = p_oAnimation; //Stefan Dumitrean 28-05-98 if( !m_p_oCurrentAnim ) { POSITION pos = m_p_oFamily->m_oListOfAnimations.GetHeadPosition(); while( pos ) { p_oAnimation = m_p_oFamily->m_oListOfAnimations.GetNext(pos); if( p_oAnimation && p_oAnimation->fn_bIsAvailable() ) { if( ! m_p_oCurrentAnim ) m_p_oCurrentAnim = p_oAnimation; else if( p_oAnimation->GetName() < m_p_oCurrentAnim->GetName() ) m_p_oCurrentAnim = p_oAnimation; } } } //End Stefan Dumitrean 28-05-98 //end Mircea Dunka - optimization if( m_p_oCurrentAnim ) { int iIndex = pLB -> FindStringExact( -1, m_p_oCurrentAnim -> GetName() ); if( iIndex != LB_ERR ) pLB -> SetCurSel( iIndex ); //pLB -> SetTopIndex( iIndex ); Mircea Dunka - SetCurSel already did this else pLB -> SetCurSel( -1 ); //Stefan Dumitrean 2-06-98 // ucFrameRate = ((struct tdstAnim3d_*)_p_oAnimation -> GetData() ) -> ucFrameRate; // m_uiElapseTime = ucFrameRate ? 1000 / ucFrameRate : 1; //End Stefan Dumitrean 2-06-98 } OnSelchangeListAnims(); } /*----------------------------------------------------------------------------- * Description : *---------------------------------------------------------------------------*/ void CAnimationView::fn_vBeginAnim( unsigned short _uwFrame) { ASSERT( m_p_oCurrentAnim -> GetData() ); // begin a new anim // so we have to change the frame element3d array //----------------------- //29.09.98 Mircea Dunka - sometimes it hangs here so I make a little test if(m_p_oTool3DWorld -> m_p_oRootFromAnim) fn_v3dDataSetFlagModifState(M_GetMSHandle( m_p_oTool3DWorld -> m_p_oRootFromAnim -> GetStruct(), 3dData), TRUE); else return; //end Mircea Dunka // p_st3dData = M_GetMSHandle( m_p_oTool3DWorld -> m_p_oRootFromAnim -> GetStruct(), 3dData); PLA_fn_bDoFirstInitOfAnimPlayerForCharacter(m_p_oTool3DWorld->m_p_oRootFromAnim->GetStruct(), (struct tdstAnim3d_*) m_p_oCurrentAnim -> GetData()); CScrollBar *pSC = (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ); _uwFrame %= ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> uwNumberOfFrames; m_p_oTool3DWorld -> mfn_vUpdateHierarchyFromAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame ); M_RedrawAll(); pSC->EnableWindow(TRUE); GetDlgItem( IDC_STATIC_CURRENTFRAME )->EnableWindow( TRUE ); //Mircea Dunka 20.10.98 GetDlgItem( IDC_STATIC_CURRENTANIMATION )->EnableWindow( TRUE ); GetDlgItem( IDC_STATIC_CURRENTANIMATION )->SetWindowText( "1" ); // m_uiTotalNumberOfFrames = m_uiTotalNumberOfFrames ? 1 : m_uiTotalNumberOfFrames; pSC->SetScrollRange( 0, m_uiTotalNumberOfFrames - 1); //end Mircea Dunka GetDlgItem( IDC_BUTTON_PLAY )->EnableWindow( TRUE ); pSC->SetScrollPos( _uwFrame ); pSC->Invalidate(); GetDlgItem( IDC_STATIC_CURRENTFRAME )->SetWindowText( "1" ); m_bPlay = FALSE; } /*----------------------------------------------------------------------------- * Description : *---------------------------------------------------------------------------*/ void CAnimationView::fn_vShowFrame(unsigned short _uwFrame) { CPA_Animation* p_oAnimation; int uwNumberOfPrevFrames = 0; int iCurrentAnimation = 0; char szValue[10]; if(m_bActionPlay) { POSITION pos = m_p_oCurrentAction->m_oListOfStates.GetHeadPosition(); while( pos ) { iCurrentAnimation++; p_oAnimation = ((CPA_State*)(m_p_oCurrentAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation(); //count the nb. of frames tdstAnim3d_* p_stAnim3d = (struct tdstAnim3d_*)p_oAnimation -> GetData(); //uwNumberOfFrames += ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> uwNumberOfFrames; if(p_stAnim3d->uwNumberOfFrames + uwNumberOfPrevFrames > _uwFrame) break; else uwNumberOfPrevFrames += p_stAnim3d->uwNumberOfFrames; } // if(uwNumberOfFrames < _uwFrame) // { //the current animation was found _uwFrame -= uwNumberOfPrevFrames; if(m_p_oCurrentAnim != p_oAnimation) { //next (prev) animation m_p_oCurrentAnim = p_oAnimation; // begin a new anim // so we have to change the frame element3d array //----------------------- //29.09.98 Mircea Dunka - sometimes it hangs here so I make a little test if(m_p_oTool3DWorld -> m_p_oRootFromAnim) fn_v3dDataSetFlagModifState(M_GetMSHandle( m_p_oTool3DWorld -> m_p_oRootFromAnim -> GetStruct(), 3dData), TRUE); else return; //end Mircea Dunka PLA_fn_bDoFirstInitOfAnimPlayerForCharacter(m_p_oTool3DWorld->m_p_oRootFromAnim->GetStruct(), (struct tdstAnim3d_*) m_p_oCurrentAnim -> GetData()); m_p_oTool3DWorld -> mfn_vUpdateHierarchyFromAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame ); M_RedrawAll(); itoa( iCurrentAnimation, szValue, 10); GetDlgItem( IDC_STATIC_CURRENTANIMATION )->SetWindowText( szValue ); return; } } itoa( iCurrentAnimation, szValue, 10); GetDlgItem( IDC_STATIC_CURRENTANIMATION )->SetWindowText( szValue ); if( m_bPlay ) m_p_oTool3DWorld -> mfn_vPlayAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame ); else m_p_oTool3DWorld -> mfn_vUpdateHierarchyFromAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame ); M_RedrawAll(); } /* *----------------------------------------------------------------------------- * first initialisation *----------------------------------------------------------------------------- */ void CAnimationView::m_fn_vEnableControl( BOOL _bEnable ) { GetDlgItem( IDC_BT_REINIT )->EnableWindow( _bEnable ); GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( _bEnable ); GetDlgItem( IDC_BT_ACTION )->EnableWindow( _bEnable ); GetDlgItem( IDC_BT_ANIM )->EnableWindow( _bEnable ); GetDlgItem( IDC_LIST_ACTIONS )->EnableWindow( _bEnable ); GetDlgItem( IDC_LIST_ANIMS )->EnableWindow( _bEnable ); GetDlgItem( IDC_SCROLLBAR_FRAME )->EnableWindow( _bEnable ); GetDlgItem( IDC_SLIDER )->EnableWindow( _bEnable ); //Stefan Dumitrean 28-05-98 m_p_oFamilySelDialog->EnableWindow( _bEnable ); //End Stefan Dumitrean 28-05-98 } /* *----------------------------------------------------------------------------- * stop playing animation *----------------------------------------------------------------------------- */ void CAnimationView::m_fn_vStopAnim( void ) { if (m_bPlay) { CScrollBar *pSC = (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ); KillTimer( m_uiPlayTimer ); m_bPlay = FALSE; m_fn_vEnableControl( TRUE ); fn_vShowFrame( pSC->GetScrollPos() ); } } /* *============================================================================= * CAnimationView diagnostics *============================================================================= */ #ifdef _DEBUG void CAnimationView::AssertValid() const { CFormView::AssertValid(); } void CAnimationView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif //_DEBUG /* *============================================================================= * CAnimationView messages handlers *============================================================================= */ /* *----------------------------------------------------------------------------- * first initialisation *----------------------------------------------------------------------------- */ void CAnimationView::OnInitialUpdate() { CFormView::OnInitialUpdate(); if (!bInitialUpdate) return; bInitialUpdate = FALSE; /* * load bitmap and set bitmap in play button */ m_oBitmapRewind.LoadBitmap( IDB_BITMAP_REWIND ); m_oBitmapReverse.LoadBitmap( IDB_BITMAP_REVERSE ); m_oBitmapStop.LoadBitmap( IDB_BITMAP_STOP ); m_oBitmapPlay.LoadBitmap( IDB_BITMAP_PLAY ); m_oBitmapForward.LoadBitmap( IDB_BITMAP_FORWARD ); ((CButton *) GetDlgItem( IDC_BUTTON_REWIND ))->SetBitmap( HBITMAP(m_oBitmapRewind) ); ((CButton *) GetDlgItem( IDC_BUTTON_REVERSE ))->SetBitmap( HBITMAP(m_oBitmapReverse) ); ((CButton *) GetDlgItem( IDC_BUTTON_STOP ))->SetBitmap( HBITMAP(m_oBitmapStop) ); ((CButton *) GetDlgItem( IDC_BUTTON_PLAY ))->SetBitmap( HBITMAP(m_oBitmapPlay) ); ((CButton *) GetDlgItem( IDC_BUTTON_FORWARD ))->SetBitmap( HBITMAP(m_oBitmapForward) ); m_bAllAnims = TRUE; m_bAllActions = TRUE; //Mircea Dunka 15.10.1998 m_bActionPlay = FALSE; //Mircea Dunka 12.10.1998 //Mircea Dunka if(m_bActionPlay) GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions"); else GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllAnims ? "Show Loaded Animations" : "Show All Animations"); GetDlgItem( IDC_BT_ACTION )->SetWindowText( m_bActionPlay ? "Show Family Animation" : "Show Action Animation"); //end Mircea Dunka /* * Init data for animation play */ m_uiElapseTime = 1; m_bPlay = FALSE; } /* *----------------------------------------------------------------------------- * WM_SHOWWINDOW *----------------------------------------------------------------------------- */ void CAnimationView::OnShowWindow(BOOL bShow, UINT nStatus) { CFormView::OnShowWindow(bShow, nStatus); OnInitialUpdate(); } /* *----------------------------------------------------------------------------- * WM_SIZE *----------------------------------------------------------------------------- */ void CAnimationView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); /* if (!bInitialUpdate) { GetDlgItem( IDC_BT_ANIM )->MoveWindow( 5, 5, 150, 15 ); GetDlgItem( IDC_LIST_ANIMS )->MoveWindow( 5, 23, 150, cy - 26 ); } */ if( GetDlgItem( IDC_LIST_ANIMS ) ) { CRect oRectDlg, oRectList; M_GetClientRect( this, &oRectDlg ); M_GetClientRectId( IDC_LIST_ANIMS, &oRectList ); oRectList . bottom = oRectDlg . bottom - 5; M_SetClientRectId( IDC_LIST_ANIMS, &oRectList ); } //Mircea Dunka 5.10.1998 if( GetDlgItem( IDC_LIST_ACTIONS ) ) { CRect oRectDlg, oRectList; M_GetClientRect( this, &oRectDlg ); M_GetClientRectId( IDC_LIST_ACTIONS, &oRectList ); oRectList . bottom = oRectDlg . bottom - 5; M_SetClientRectId( IDC_LIST_ACTIONS, &oRectList ); } //end Mircea Dunka } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BT_ANIM * change Animations List content *----------------------------------------------------------------------------- */ //Mircea Dunka 16.10.1998 void CAnimationView::OnButtonAnim() { if(m_bActionPlay) { m_bAllActions = !m_bAllActions; GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions"); GetDlgItem( IDC_LIST_ACTIONS ) -> SetFocus(); mfn_vFillActionList(); } else { m_bAllAnims = !m_bAllAnims; GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllAnims ? "Show Loaded Animations" : "Show All Animations"); GetDlgItem( IDC_LIST_ANIMS ) -> SetFocus(); fn_vFillAnimList(); } } //end Mircea Dunka /* *----------------------------------------------------------------------------- * LBN_SELCHANGE on IDC_LIST_FAMILIES * display in list of animation list of family animations *----------------------------------------------------------------------------- */ void CAnimationView::fn_vFillAnimList() { CListBox *p_oAnimLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS ); POSITION xPos; CPA_Animation *p_oAnim; /* * empty the animation list box */ p_oAnimLB -> ResetContent(); xPos = m_p_oFamily->m_oListOfAnimations.GetHeadPosition(); while( xPos ) { p_oAnim = m_p_oFamily->m_oListOfAnimations.GetNext( xPos ); if( m_bAllAnims || p_oAnim -> fn_bIsAvailable() ) { int iIndex = p_oAnimLB->AddString( p_oAnim->GetName() ); if ( iIndex != LB_ERR ) { p_oAnimLB->SetItemData( iIndex, (long) p_oAnim ); } } } } //Mircea Dunka 27.09.98 - actions BOOL fn_bIsActionAvailable(CPA_Action* p_oAction) { CPA_Animation* p_oAnimation; if( !p_oAction ) return FALSE; POSITION pos = p_oAction->m_oListOfStates.GetHeadPosition(); if(!pos) return FALSE; while(pos) { p_oAnimation = ((CPA_State*)(p_oAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation(); if(!p_oAnimation || !p_oAnimation->fn_bIsAvailable() ) return FALSE; } return TRUE; } /* *----------------------------------------------------------------------------- * LBN_SELCHANGE on IDC_LIST_FAMILIES * display in list of action list of family animations *----------------------------------------------------------------------------- */ void CAnimationView::mfn_vFillActionList() { CListBox *p_oActionLB = (CListBox *) GetDlgItem( IDC_LIST_ACTIONS ); POSITION xPos; CPA_Action *p_oAction; /* * empty action list box */ p_oActionLB -> ResetContent(); xPos = m_p_oFamily->m_oListOfActions.GetHeadPosition(); while( xPos ) { p_oAction = m_p_oFamily->m_oListOfActions.GetNext( xPos ); if( m_bAllActions || fn_bIsActionAvailable(p_oAction)) { int iIndex = p_oActionLB->AddString( p_oAction->GetName() ); if ( iIndex != LB_ERR ) { p_oActionLB->SetItemData( iIndex, (long) p_oAction ); } } } } //end Mircea Dunka /* *----------------------------------------------------------------------------- * LBN_SELCHANGE on IDC_LIST_FAMILIES * display in list of animation list of family animations *----------------------------------------------------------------------------- */ void CAnimationView::OnSelchangeListAnims() { CListBox *p_oLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS ); int iIndex = p_oLB->GetCurSel(); BOOL bLoad = FALSE; m_p_oCurrentAnim = NULL; if (iIndex != LB_ERR) { m_bActionPlay = FALSE; m_p_oCurrentAnim = (CPA_Animation *) p_oLB->GetItemData( iIndex ); if( m_p_oCurrentAnim -> fn_bIsAvailable() ) { bLoad = TRUE; } } if ( bLoad ) { char szValue[10]; unsigned char ucFrameRate; CSliderCtrl *pSlider = (CSliderCtrl*)GetDlgItem( IDC_SLIDER ); //ANNECY CT 20/02/98{ //GetDlgItem( IDC_BUTTON_LOAD )->ShowWindow( FALSE ); GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("ReLoad"); //ENDANNECY CT} itoa( ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> uwNumberOfFrames, szValue, 10); GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( szValue ); itoa( ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> ucMaxNumberOfElements, szValue, 10); GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( szValue ); //Mircea Dunka itoa(1, szValue, 10); GetDlgItem( IDC_EDIT_ANIMATIONS )->SetWindowText( szValue ); GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The animation is O.K."); m_uiTotalNumberOfFrames = ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> uwNumberOfFrames; //end Mircea Dunka m_uwInitFrame = 0; fn_vBeginAnim( m_uwInitFrame ); ucFrameRate = ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData() ) -> ucFrameRate; m_uiElapseTime = ucFrameRate ? 1000 / ucFrameRate : 1; itoa( ucFrameRate, szValue, 10 ); GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( szValue ); GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue ); pSlider -> SetRange( 1, 255 ); pSlider -> SetPos( ucFrameRate ); } else { //ANNECY CT 20/02/98{ GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("Load"); //GetDlgItem( IDC_BUTTON_LOAD )->ShowWindow( TRUE ); //ENDANNECY CT} GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( "" ); //Mircea Dunka GetDlgItem( IDC_EDIT_ANIMATIONS )->SetWindowText( "" ); GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The animation isn't loaded"); //end Mircea Dunka GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( "" ); GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( "" ); GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( "" ); } GetDlgItem( IDC_BUTTON_REWIND )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_REVERSE )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_STOP )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_PLAY )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_FORWARD )->EnableWindow( bLoad ); GetDlgItem( IDC_STATIC_CURRENTFRAME )->EnableWindow( bLoad ); GetDlgItem( IDC_STATIC_CURRENTANIMATION )->EnableWindow( bLoad ); GetDlgItem( IDC_BT_REINIT )->EnableWindow( bLoad ); GetDlgItem( IDC_SLIDER )->EnableWindow( bLoad ); } //Mircea Dunka /* *----------------------------------------------------------------------------- * LBN_SELCHANGE on IDC_LIST_ACTIONS * display in list of animation list of family animations *----------------------------------------------------------------------------- */ void CAnimationView::OnSelchangeListActions() { BOOL bLoad = TRUE; BOOL bFirstAnimation = TRUE; WORD uwNumberOfAvailableAnimations = 0; WORD uwMaxNumberOfElements = 0; WORD uwFrameRate = 0; char szValue[10]; m_p_oCurrentAction = NULL; m_p_oCurrentAnim = NULL; m_uiTotalNumberOfFrames = 0; m_uiNumberOfAnimations = 0; CListBox *p_oAnimLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS ); CListBox *p_oActionLB = (CListBox *) GetDlgItem( IDC_LIST_ACTIONS ); int iIndex = p_oActionLB->GetCurSel(); if (iIndex != LB_ERR) { m_bActionPlay = TRUE; //Mircea Dunka 12.10.1998 GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions"); GetDlgItem( IDC_BT_ACTION )->SetWindowText("Show Family Animation"); //get the current action (the selected one) m_p_oCurrentAction = (CPA_Action *) p_oActionLB->GetItemData( iIndex ); //empty the animation list. p_oAnimLB -> ResetContent(); //and refill it with the current action's animations CPA_Animation *p_oAnimation; POSITION pos = m_p_oCurrentAction->m_oListOfStates.GetHeadPosition(); if(!pos) bLoad = FALSE; while( pos ) { p_oAnimation = ((CPA_State*)(m_p_oCurrentAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation(); m_uiNumberOfAnimations += 1; if( p_oAnimation && p_oAnimation->fn_bIsAvailable() ) { //get the current animation if(bFirstAnimation) { m_p_oCurrentAnim = p_oAnimation; bFirstAnimation = FALSE; //see the "mfn_p_oGetDefaultState" member from CPA_Action } //refill the animation list. iIndex = p_oAnimLB->AddString( p_oAnimation->GetName() ); if ( iIndex != LB_ERR ) { p_oAnimLB->SetItemData( iIndex, (long)p_oAnimation ); } uwNumberOfAvailableAnimations += 1; //count the total nb. of frames m_uiTotalNumberOfFrames += ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> uwNumberOfFrames; //count the max nb. of channels (elements) if( uwMaxNumberOfElements < ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> ucMaxNumberOfElements) uwMaxNumberOfElements = ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> ucMaxNumberOfElements; //count the medium frame rate uwFrameRate += ((struct tdstAnim3d_*)p_oAnimation -> GetData() ) -> ucFrameRate; } else bLoad = FALSE; //the current animation isn't loaded => the action isn't loaded } } else bLoad = FALSE; //no valid (complete) action (or no selection) in the list box //display the total nb. of animations itoa(m_uiNumberOfAnimations, szValue, 10); GetDlgItem( IDC_EDIT_ANIMATIONS )->SetWindowText( szValue ); if(bLoad) //if the selected action is OK, { //display the total nb. of frames itoa(m_uiTotalNumberOfFrames, szValue, 10); GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( szValue ); //display the max nb. of channels (elements) itoa(uwMaxNumberOfElements, szValue, 10); GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( szValue ); //display the medium frame rate if(m_uiNumberOfAnimations) uwFrameRate = uwFrameRate/uwNumberOfAvailableAnimations; m_uiElapseTime = uwFrameRate ? 1000 / uwFrameRate : 1; itoa( uwFrameRate, szValue, 10 ); GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( szValue ); GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue ); CSliderCtrl *pSlider = (CSliderCtrl*)GetDlgItem( IDC_SLIDER ); pSlider -> SetRange( 1, 255 ); pSlider -> SetPos( uwFrameRate ); m_uwInitFrame = 0; if( !m_p_oCurrentAnim ) return; fn_vBeginAnim( m_uwInitFrame ); GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The action is O.K."); } else { char szBuffer[255]; WORD uwMissingAnims = m_uiNumberOfAnimations - uwNumberOfAvailableAnimations; switch(uwMissingAnims) { case 0: wsprintf(szBuffer, "Bad action. No anims!!!");break; case 1: wsprintf(szBuffer, "Bad action. %d missing anim", uwMissingAnims);break; default:wsprintf(szBuffer, "Bad action. %d missing anims", uwMissingAnims); } GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText(szBuffer); GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( "" ); GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( "" ); GetDlgItem( IDC_EDIT_SPEED )-> SetWindowText( "" ); GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( "" ); } p_oAnimLB->SetCurSel(-1); GetDlgItem( IDC_BUTTON_REWIND )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_REVERSE )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_STOP )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_PLAY )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_FORWARD )->EnableWindow( bLoad ); GetDlgItem( IDC_STATIC_CURRENTFRAME )->EnableWindow( bLoad ); GetDlgItem( IDC_STATIC_CURRENTANIMATION )->EnableWindow( bLoad ); GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( bLoad ); GetDlgItem( IDC_BT_REINIT )->EnableWindow( bLoad ); GetDlgItem( IDC_SLIDER )->EnableWindow( bLoad ); } //end Mircea Dunka /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BUTTON_LOAD *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonLoad() { if(!m_p_oCurrentAnim) return; HCURSOR hWaitCursor; HCURSOR hOldCursor; hWaitCursor = AfxGetApp()->LoadStandardCursor( IDC_WAIT ); hOldCursor = SetCursor( hWaitCursor ); //Mircea Dunka 11.10.98 GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("Loading ..."); //GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("Loading ..."); GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( FALSE ); m_p_oCurrentAnim -> GetEditor() -> fn_bLoadBaseObject( m_p_oCurrentAnim ); //ANNECY CT 20/02/98{ GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("ReLoad"); //ENDANNECY CT} GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( TRUE ); GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("Animation loaded"); //end Mircea Dunka 11.10.98 SetCursor( hOldCursor ); GetDlgItem( IDC_LIST_ANIMS )->Invalidate(); OnSelchangeListAnims(); } //Mircea Dunka /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BT_ACTION //Mircea Dunka 8.10.1998 *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonAction() { CString szListingType; GetDlgItem( IDC_BT_ACTION )->GetWindowText(szListingType); if(szListingType.CompareNoCase("show family animation") == 0) { //fill the animation list with all the animations fn_vFillAnimList(); m_bActionPlay = FALSE; //Mircea Dunka 12.10.1998 GetDlgItem( IDC_BT_ACTION )->SetWindowText("Show Action Animation"); GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllAnims ? "Show Loaded Animations" : "Show All Animations"); ((CListBox*)GetDlgItem( IDC_LIST_ACTIONS )) -> SetCurSel(-1); ((CListBox*)GetDlgItem( IDC_LIST_ANIMS )) -> SetCurSel(0); GetDlgItem( IDC_LIST_ANIMS ) -> SetFocus(); } else { //fill the animation list with the animations of the current action //if no action is selected, a message box will appear CListBox *p_oActionLB = (CListBox *) GetDlgItem( IDC_LIST_ACTIONS ); int iIndex = p_oActionLB->GetCurSel(); if (iIndex == LB_ERR) if( (iIndex = p_oActionLB -> SetCurSel(0)) == LB_ERR) //check again, to see if there are any actions { GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The family doesn't contain any action"); return; } m_p_oCurrentAction = (CPA_Action *) p_oActionLB->GetItemData( iIndex ); //!!! //empty the animation list. //!!! CListBox *p_oAnimLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS ); p_oAnimLB -> ResetContent(); CPA_Animation *p_oAnimation; POSITION pos = m_p_oCurrentAction->m_oListOfStates.GetHeadPosition(); while( pos ) { p_oAnimation = ((CPA_State*)(m_p_oCurrentAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation(); if( p_oAnimation && p_oAnimation->fn_bIsAvailable() ) { iIndex = p_oAnimLB->AddString( p_oAnimation->GetName() ); if ( iIndex != LB_ERR ) p_oAnimLB->SetItemData( iIndex, (long)p_oAnimation ); } } m_bActionPlay = TRUE; //Mircea Dunka 12.10.1998 p_oAnimLB -> SetCurSel(0); GetDlgItem( IDC_BT_ACTION )->SetWindowText("Show Family Animation"); GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions"); GetDlgItem( IDC_LIST_ANIMS ) -> SetFocus(); } } //end Mircea Dunka /* *----------------------------------------------------------------------------- * LBN_DBLCLK on IDC_LIST_ANIMS *----------------------------------------------------------------------------- */ void CAnimationView::OnDblclkListAnims() { OnButtonLoad(); } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BUTTON_REWIND *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonRewind() { OnHScroll( SB_LEFT, 0, (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ) ); } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BUTTON_REVERSE *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonReverse() { m_bReverse = TRUE; //Mircea Dunka 19.10.98 if (!m_bPlay && (m_uiTotalNumberOfFrames > 1)) //end Mircea Dunka { m_bPlay = TRUE; m_fn_vEnableControl( FALSE ); m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL ); } } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BUTTON_STOP *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonStop() { m_fn_vStopAnim(); } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BUTTON_PLAY *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonPlay() { m_bReverse = FALSE; //Mircea Dunka 19.10.98 if (!m_bPlay && (m_uiTotalNumberOfFrames > 1)) //end Mircea Dunka { m_bPlay = TRUE; m_fn_vEnableControl( FALSE ); m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL ); } } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BUTTON_FORWARD *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonForward() { OnHScroll( SB_RIGHT, 0, (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ) ); } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BT_REINIT *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonReinit() { char szValue[10]; unsigned char ucFrameRate; CSliderCtrl *pSlider = (CSliderCtrl*)GetDlgItem( IDC_SLIDER ); if( m_p_oCurrentAnim && m_p_oCurrentAnim -> GetData() ) { ucFrameRate = ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData() ) -> ucFrameRate; m_uiElapseTime = ucFrameRate ? 1000 / ucFrameRate : 1; itoa( ucFrameRate, szValue, 10 ); GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( szValue ); GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue ); pSlider -> SetRange( 1, 255 ); pSlider -> SetPos( ucFrameRate ); if( m_bPlay ) { KillTimer( m_uiPlayTimer ); m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL ); } } } /* *----------------------------------------------------------------------------- * WM_TIMER *----------------------------------------------------------------------------- */ void CAnimationView::OnTimer(UINT nIDEvent) { OnHScroll( m_bReverse?SB_LINELEFT:SB_LINERIGHT, 0, (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ) ); CFormView::OnTimer(nIDEvent); } /* *----------------------------------------------------------------------------- * WM_HSCROLL *----------------------------------------------------------------------------- */ void CAnimationView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { int iCurValue; int iNewValue; int iMax, iMin; char szValue[10]; if( GetDlgItem( IDC_SLIDER ) == (CWnd*)pScrollBar ) { iNewValue = ((CSliderCtrl*)GetDlgItem( IDC_SLIDER )) -> GetPos(); itoa( iNewValue, szValue, 10); GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue ); m_uiElapseTime = iNewValue ? 1000 / iNewValue : 1; if( m_bPlay ) { KillTimer( m_uiPlayTimer ); m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL ); } } else { //IDC_SCROLLBARFRAME iCurValue = pScrollBar->GetScrollPos(); iNewValue = iCurValue; pScrollBar->GetScrollRange( &iMin, &iMax); switch ( nSBCode ) { case SB_LEFT: iNewValue = iMin; break; case SB_RIGHT: iNewValue = iMax; break; case SB_PAGELEFT : iNewValue -= 4; case SB_LINELEFT : iNewValue --; if (iNewValue < iMin) iNewValue = iMax; break; case SB_PAGERIGHT : iNewValue += 4; case SB_LINERIGHT: iNewValue ++; if (iNewValue > iMax) iNewValue = iMin; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: iNewValue = nPos; break; case SB_ENDSCROLL: return; } if (iNewValue != iCurValue) { pScrollBar->SetScrollPos( iNewValue ); iNewValue = pScrollBar->GetScrollPos(); if (iNewValue != iCurValue) { itoa( iNewValue + 1, szValue, 10); GetDlgItem( IDC_STATIC_CURRENTFRAME )->SetWindowText( szValue ); fn_vShowFrame( iNewValue ); } } } } /* *----------------------------------------------------------------------------- * WM_MEASUREITEM *----------------------------------------------------------------------------- */ void CAnimationView::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { //Mircea Dunka 5.10.98 IDC_LIST_ACTIONS added if ( (nIDCtl == IDC_LIST_ANIMS) || (nIDCtl == IDC_LIST_FAMILIES) || (nIDCtl == IDC_LIST_ACTIONS) ) lpMeasureItemStruct->itemHeight = 14; CFormView::OnMeasureItem(nIDCtl, lpMeasureItemStruct); } //Mircea Dunka - Code optimization + action list drawing /* *----------------------------------------------------------------------------- * WM_DRAWITEM *----------------------------------------------------------------------------- */ void CAnimationView::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) { //Mircea Dunka 5.10.98 IDC_LIST_ACTIONS added so if was changed to switch CDC *pDC = CDC::FromHandle( lpDIS->hDC ); CListBox *pLB = (CListBox *) GetDlgItem( nIDCtl ); BOOL bSelected = (lpDIS->itemState & ODS_SELECTED ); BOOL bLoad = TRUE; CFont oBoldFont; CFont *p_oOldFont = NULL; CPA_Animation *p_oAnim = NULL; CPA_Action *p_oAction = NULL; CPA_Family *p_oFamily = NULL; PLOGFONT plf = NULL; switch (nIDCtl) { case IDC_LIST_ANIMS: if (lpDIS->itemID == -1) return; p_oAnim = (CPA_Animation *) pLB->GetItemData( lpDIS->itemID ); pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW )); if (p_oAnim->fn_bIsAvailable()) { plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT)); lstrcpy(plf->lfFaceName, "MS Sans Serif"); plf->lfWeight = FW_BOLD ; plf->lfHeight = 8; plf->lfEscapement = 0; oBoldFont.CreateFontIndirect(plf); p_oOldFont = pDC->SelectObject( &oBoldFont ); } pDC->SetBkMode( TRANSPARENT); pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) ); pDC->DrawText( p_oAnim->GetName(), strlen(p_oAnim->GetName()), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER ); if (bSelected) pDC->InvertRect( &lpDIS->rcItem ); if (p_oOldFont) { pDC->SelectObject( p_oOldFont ); oBoldFont.DeleteObject(); } break; case IDC_LIST_ACTIONS: if (lpDIS->itemID == -1) return; p_oAction = (CPA_Action *) pLB->GetItemData( lpDIS->itemID ); bLoad = fn_bIsActionAvailable(p_oAction); pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW )); if(bLoad) { plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT)); lstrcpy(plf->lfFaceName, "MS Sans Serif"); plf->lfWeight = FW_BOLD ; plf->lfHeight = 8; plf->lfEscapement = 0; oBoldFont.CreateFontIndirect(plf); p_oOldFont = pDC->SelectObject( &oBoldFont ); } pDC->SetBkMode( TRANSPARENT); pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) ); pDC->DrawText( p_oAction->GetName(), strlen(p_oAction->GetName()), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER ); if (bSelected) pDC->InvertRect( &lpDIS->rcItem ); if (p_oOldFont) { pDC->SelectObject( p_oOldFont ); oBoldFont.DeleteObject(); } break; case IDC_LIST_FAMILIES: if (lpDIS->itemID == -1) return; p_oFamily = (CPA_Family *) pLB->GetItemData( lpDIS->itemID ); pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW )); if (p_oFamily->fn_bIsAvailable()) { plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT)); lstrcpy(plf->lfFaceName, "MS Sans Serif"); plf->lfWeight = FW_BOLD ; plf->lfHeight = 8; plf->lfEscapement = 0; oBoldFont.CreateFontIndirect(plf); p_oOldFont = pDC->SelectObject( &oBoldFont ); } pDC->SetBkMode( TRANSPARENT); pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) ); pDC->DrawText( p_oFamily->GetName(), strlen(p_oFamily->GetName()), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER ); if (bSelected) pDC->InvertRect( &lpDIS->rcItem ); if (p_oOldFont) { pDC->SelectObject( p_oOldFont ); oBoldFont.DeleteObject(); } break; default: CFormView::OnDrawItem(nIDCtl, lpDIS); } } //end Mircea Dunka /* *----------------------------------------------------------------------------- * PreTranslate message *----------------------------------------------------------------------------- */ BOOL CAnimationView::PreTranslateMessage(MSG* pMsg) { if( m_bPlay ) { if (pMsg->message == WM_KEYDOWN) { switch( (int) pMsg->wParam ) { case VK_HOME: OnButtonRewind(); return 1; case VK_LEFT: OnButtonReverse(); return 1; case VK_DOWN: case VK_ESCAPE: OnButtonStop(); return 1; case VK_RIGHT: OnButtonPlay(); return 1; case VK_END: OnButtonForward(); return 1; } } } return CFormView::PreTranslateMessage(pMsg); } /* *----------------------------------------------------------------------------- * WM_HELPINFO *----------------------------------------------------------------------------- */ BOOL CAnimationView::OnHelpInfo(HELPINFO* pHelpInfo) { /* UINT uiCommand = HELP_CONTEXT; DWORD dwContext = IDJ_ANIMVIEWER; POINT stMousePos; CWnd *p_oWnd; GetCursorPos( &stMousePos ); ScreenToClient( &stMousePos ); p_oWnd = ChildWindowFromPoint( stMousePos, CWP_SKIPINVISIBLE ); if ( p_oWnd == GetDlgItem( IDC_LIST_ANIMS ) ) { uiCommand = HELP_CONTEXTPOPUP; dwContext = IDP_ANIMATIONLISTBOX; } else if ( (p_oWnd == GetDlgItem(IDC_EDIT_CHANNEL )) || (p_oWnd == GetDlgItem(IDC_EDIT_FRAME)) ) { uiCommand = HELP_CONTEXTPOPUP; dwContext = IDP_ANIMINFO; } else if ( p_oWnd == GetDlgItem( IDC_BUTTON_LOAD ) ) { uiCommand = HELP_CONTEXT; dwContext = IDJ_LOADINGANIMATION; } else if ( (p_oWnd == GetDlgItem(IDC_SCROLLBAR_FRAME)) || (p_oWnd == GetDlgItem(IDC_BUTTON_REWIND)) || (p_oWnd == GetDlgItem(IDC_BUTTON_REVERSE)) || (p_oWnd == GetDlgItem(IDC_BUTTON_STOP)) || (p_oWnd == GetDlgItem(IDC_BUTTON_PLAY)) || (p_oWnd == GetDlgItem(IDC_BUTTON_FORWARD)) ) { uiCommand = HELP_CONTEXT; dwContext = IDJ_PLAYINGANIMATION; } if (_access( "Edt_data\\tools\\TAN\\animview.hlp", 0) != 0) { MessageBox("Help File : Edt_data\\tools\\TAN\\animview.hlp not found" ); return TRUE; } ::WinHelp( m_hWnd, "Edt_Data\\tools\\TAN\\animview.hlp", uiCommand, dwContext ); */ return CFormView::OnHelpInfo(pHelpInfo); } /* *----------------------------------------------------------------------------- * BN_CLICKED on IDC_BUTTON_HELP *----------------------------------------------------------------------------- */ void CAnimationView::OnButtonHelp() { OnHelpInfo(NULL); }