/////////////////////////////////////////////////// // call this function to remove a page wnd from // container. CWnd *CBSWndContainer::DelPage(CWnd *pWnd) { // check list POSITION pos=m_PageList.Find(pWnd); if(pos==NULL) { TRACE("This Window is not a member of container, the operation will terminate.\n"); return NULL; } if(pWnd==m_pActivePage) if(m_pActivePage==GetPrevPage(pWnd))//m_PageList.IsEmpty()?NULL:m_PageList.GetHead(); m_pActivePage=NULL; else m_pActivePage=GetPrevPage(pWnd); m_PageList.RemoveAt(pos); if (pWnd) { pWnd->ShowWindow(SW_HIDE); } // Invalidate(); return pWnd; }
CWnd* CMonitorWnd::DelPage(CWnd *pWnd) { POSITION pos = m_PageList.Find(pWnd); if(pos == NULL) { TRACE("This Window is not a member of container, the operation will terminate.\n"); return NULL; } if(pWnd == m_pActivePage) { if(m_pActivePage == GetPrevPage(pWnd)) { m_pActivePage = NULL; } else { m_pActivePage = GetPrevPage(pWnd); } } m_PageList.RemoveAt(pos); if (pWnd) { pWnd->ShowWindow(SW_HIDE); } return pWnd; }
XWndPageForSlide* XWndPageSlideWithXML::GetLeftPage( int idx ) { if( idx == m_pCurr->GetidxPage() ) return m_pLeft; int PervIdx = GetPrevPage(idx); for( int i = 0; i < m_listLeft.size(); i++ ) { if( PervIdx == m_listLeft.GetFromIndex(i)->GetidxPage() ) return m_listLeft.GetFromIndex(i); } return NULL; }
int XWndPageSlideWithXML::Process( float dt ) { if( m_AutoScrollDir == XE::xDIR_RIGHT ) { // ------->>>> // 오른쪽 화면이 나타나고 현재화면이 왼쪽으로 사라진다. float lerp = m_itpScroll.GetInterpolationValueWithSet( xSEC_SLIDE ); XE::VEC2 vPos = m_pCurr->GetPosLocal(); float wScreen = XE::GetGameWidth(); vPos.x = m_vStartScroll.x + ( (-wScreen) - m_vStartScroll.x ) * lerp; m_pCurr->SetPosLocal( vPos ); if( m_pRight ) { XE::VEC2 vPosRight = m_pRight->GetPosLocal(); vPosRight.x = vPos.x + wScreen; m_pRight->SetPosLocal( vPosRight ); } if( m_itpScroll.IsFinish() ) { m_itpScroll.Off(); m_AutoScrollDir = XE::xDIR_NONE; // 현재 화면이 왼쪽으로 완전히 사라졌다. if( m_pLeft ) { m_listLeft.push_back( m_pLeft ); //XWnd::DestroyWnd( m_pLeft ); // 원래있던 왼쪽페이지를 삭제 } m_pLeft = m_pCurr; m_pCurr = m_pRight; m_pRight = NULL; // 오른쪽 페이지 생성 int idxRightPage = GetNextPage( m_pCurr->GetidxPage() ); if( m_numPages > idxRightPage && idxRightPage >= 0 ) { if( m_listRight.size() > 0 ) { m_pRight = m_listRight.GetFirst(); m_listRight.pop_front(); } //m_pRight = CreatePage( idxRightPage ); //if( m_pRight && !Find( m_pRight ) ) // Add( m_pRight ); XE::VEC2 v = m_pCurr->GetPosLocal(); v.x += wScreen; m_pRight->SetPosLocal( v ); // 화면 오른쪽에 놓는다. } CallEventHandler( XWM_FINISH_SLIDE, m_pCurr->GetidxPage() ); } } else if( m_AutoScrollDir == XE::xDIR_LEFT ) { // <<<<----- // 왼쪽 화면이 나타나고 현재화면이 오른쪽으로 사라진다. float lerp = m_itpScroll.GetInterpolationValueWithSet( xSEC_SLIDE ); XE::VEC2 vPos = m_pCurr->GetPosLocal(); float wScreen = XE::GetGameWidth(); vPos.x = m_vStartScroll.x + ( wScreen - m_vStartScroll.x ) * lerp; m_pCurr->SetPosLocal( vPos ); if( m_pLeft ) { XE::VEC2 vPosLeft = m_pLeft->GetPosLocal(); vPosLeft.x = vPos.x - wScreen; m_pLeft->SetPosLocal( vPosLeft ); } if( m_itpScroll.IsFinish() ) { m_itpScroll.Off(); m_AutoScrollDir = XE::xDIR_NONE; // 현재 화면이 오른쪽으로 완전히 사라졌다. if( m_pRight ) { m_listRight.push_front( m_pRight ); //XWnd::DestroyWnd( m_pRight ); // 원래있던 오른쪽페이지를 삭제 } m_pRight = m_pCurr; m_pCurr = m_pLeft; m_pLeft = NULL; // 왼쪽 페이지 생성 int idxLeftPage = GetPrevPage( m_pCurr->GetidxPage() ); if( m_numPages > idxLeftPage && idxLeftPage >= 0 ) { if( m_listLeft.size() > 0 ) { m_pLeft = m_listLeft.GetLast(); m_listLeft.pop_back(); } //m_pLeft = CreatePage( idxLeftPage ); //if( m_pLeft && !Find( m_pLeft ) ) // Add( m_pLeft ); XE::VEC2 v = m_pCurr->GetPosLocal(); v.x -= wScreen; m_pLeft->SetPosLocal( v ); // 화면 왼쪽에 놓는다. } CallEventHandler( XWM_FINISH_SLIDE, m_pCurr->GetidxPage() ); } } else if( m_AutoScrollDir == XE::xDIR_CENTER ) { // 제자리로 돌아가기 float lerp = m_itpScroll.GetInterpolationValueWithSet( xSEC_SLIDE ); float wScreen = XE::GetGameWidth(); XE::VEC2 vPos = m_pCurr->GetPosLocal(); vPos.x = m_vStartScroll.x + ( 0 - m_vStartScroll.x ) * lerp; m_pCurr->SetPosLocal( vPos ); if( m_pRight ) { XE::VEC2 vPosRight = m_pRight->GetPosLocal(); vPosRight.x = vPos.x + wScreen; m_pRight->SetPosLocal( vPosRight ); } if( m_pLeft ) { XE::VEC2 vPosLeft = m_pLeft->GetPosLocal(); vPosLeft.x = vPos.x - wScreen; m_pLeft->SetPosLocal( vPosLeft ); } if( m_itpScroll.IsFinish() ) { m_itpScroll.Off(); m_AutoScrollDir = XE::xDIR_NONE; } } // else return XWnd::Process( dt ); // return 1; }
// 현재 페이지를 지정한다. void XWndPageSlideWithXML::SetCurrPage( int idxPage ) { /* if( m_listPageKey.size() > 0 ) { _SetCurrPageForXML( idxPage ); return; } */ XBREAK( idxPage < 0 || idxPage >= m_numPages ); if( m_pCurr ) { if( m_pCurr->GetidxPage() == idxPage ) // 이미 같은페이지면 다시 만들필요 없다. return; XWnd::DestroyWnd( m_pCurr ); } // 현재 페이지 생성 m_pCurr = CreatePage( idxPage ); Add(m_pCurr); // 왼쪽페이지 생성 if( m_pLeft ) XWnd::DestroyWnd( m_pLeft ); int idxPrevPage = GetPrevPage( idxPage ); if( idxPrevPage >= 0 ) { m_pLeft = CreatePage( idxPrevPage ); XE::VEC2 vPos( -XE::GetGameWidth(), 0 ); m_pLeft->SetPosLocal( vPos ); Add(m_pLeft); } // 오른족 페이지생성 if( m_pRight ) XWnd::DestroyWnd( m_pRight ); int idxNextPage = GetNextPage( idxPage ); if( idxNextPage >= 0 ) { m_pRight = CreatePage( idxNextPage ); XE::VEC2 vPos( XE::GetGameWidth(), 0 ); m_pRight->SetPosLocal( vPos ); Add(m_pRight); } //그리지 않는 페이지 생성 m_listLeft.Destroy(); m_listRight.Destroy(); for( int i = idxPage+2; i < m_numPages; i++ ) { XWndPageForSlide *pRight = CreatePage( i ); if( m_pRight ) { XE::VEC2 vPosRight = m_pRight->GetPosLocal(); pRight->SetPosLocal(vPosRight); } m_listRight.push_back( pRight ); Add(pRight); } for( int i = idxPage-2; i >= 0; i-- ) { XWndPageForSlide *pLeft = CreatePage( i ); if( m_pLeft ) { XE::VEC2 vPosLeft = m_pLeft->GetPosLocal(); pLeft->SetPosLocal(vPosLeft); } m_listLeft.push_back( pLeft ); Add(pLeft); } }