DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT& ptCur, const POINT& ptOld) { m_dwMouseFlagsCur = UI_MOUSEPROC_NONE; if (!m_bVisible || !m_bEnableOperation) return m_dwMouseFlagsCur; if (s_pTooltipCtrl) s_pTooltipCtrl->MouseProc(dwFlags, ptCur, ptOld); // 툴팁에게 마우스 메세지 전달. // child에게 메세지 전달 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ) { CN3UIBase* pChild = (*itor); // 상거래 중이면 아이콘 매니저 윈도우만 작동.. if ( CGameProcedure::s_pProcMain && CGameProcedure::s_pProcMain->m_pUITransactionDlg && (CGameProcedure::s_pProcMain->m_pUITransactionDlg->IsVisible()))// && (pChild->UIType() != UI_TYPE_ICON_MANAGER) ) { if ( CN3UIWndBase::m_pCountableItemEdit->IsLocked() ) { if ( pChild->m_szID.compare("base_tradeedit") != 0 ) { ++itor; continue; } } } // 보관함에 보관중이면 아이콘 매니저 윈도우만 작동.. if ( CGameProcedure::s_pProcMain && CGameProcedure::s_pProcMain->m_pUIWareHouseDlg && (CGameProcedure::s_pProcMain->m_pUIWareHouseDlg->IsVisible()))// && (pChild->UIType() != UI_TYPE_ICON_MANAGER) ) { if ( CN3UIWndBase::m_pCountableItemEdit->IsLocked() ) { if ( pChild->m_szID.compare("base_tradeedit") != 0 ) { ++itor; continue; } } } // 개인간 거래중이면 아이콘 매니저 윈도우만 작동.. 돈 액수나 화살 갯수등을 입력하는 중이면.. 입력 윈도우만 작동.. if ( CGameProcedure::s_pProcMain && CGameProcedure::s_pProcMain->m_pSubProcPerTrade && (CGameProcedure::s_pProcMain->m_pSubProcPerTrade->m_ePerTradeState != PER_TRADE_STATE_NONE) ) { if (CGameProcedure::s_pProcMain->m_pSubProcPerTrade->m_ePerTradeState == PER_TRARE_STATE_EDITTING) { if ( pChild->m_szID.compare("base_tradeedit") != 0 ) { ++itor; continue; } } if ( CN3UIWndBase::m_pCountableItemEdit->IsLocked() ) { if ( pChild->m_szID.compare("base_tradeedit") != 0 ) { ++itor; continue; } } } if(pChild->m_pChildUI && pChild->m_pChildUI->IsVisible()) { DWORD dwRet = pChild->m_pChildUI->MouseProc(dwFlags, ptCur, ptOld); if (UI_MOUSEPROC_DONESOMETHING & dwRet) { // 이경우에는 먼가 포커스를 받은 경우이다. pChild->MouseProc(0, ptCur, ptOld); m_dwMouseFlagsCur |= (UI_MOUSEPROC_DONESOMETHING|UI_MOUSEPROC_CHILDDONESOMETHING); SetFocusedUI(pChild);//this_ui return m_dwMouseFlagsCur; } else if ( ( UI_MOUSE_LBCLICK & dwFlags) && (UI_MOUSEPROC_INREGION & dwRet) ) { // 영역 안을 클릭 했을때 먼가 일을 했다고 하고 리턴해버린다. pChild->MouseProc(0, ptCur, ptOld); m_dwMouseFlagsCur |= (UI_MOUSEPROC_DIALOGFOCUS); SetFocusedUI(pChild);//this_ui return m_dwMouseFlagsCur; } } DWORD dwChildRet = pChild->MouseProc(dwFlags, ptCur, ptOld); if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. m_dwMouseFlagsCur |= (UI_MOUSEPROC_DONESOMETHING|UI_MOUSEPROC_CHILDDONESOMETHING); SetFocusedUI(pChild);//this_ui return m_dwMouseFlagsCur; } else if ( ( UI_MOUSE_LBCLICK & dwFlags) && (UI_MOUSEPROC_INREGION & dwChildRet) ) { // 영역 안을 클릭 했을때 먼가 일을 했다고 하고 리턴해버린다. m_dwMouseFlagsCur |= (UI_MOUSEPROC_DIALOGFOCUS); SetFocusedUI(pChild);//this_ui return m_dwMouseFlagsCur; } else ++itor; //else if (UI_MOUSE_LBCLICKED|UI_MOUSE_MBCLICK|UI_MOUSE_MBCLICKED|UI_MOUSE_RBCLICK|UI_MOUSE_RBCLICKED) m_dwMouseFlagsCur |= dwChildRet; } // if(UI_MOUSE_LBCLICK & dwFlags) m_pUIFocused = NULL; // 포커스 받은 UI 기록.. 아무것도 안하면.. 널이다.. return m_dwMouseFlagsCur; }
DWORD CN3UIBase::MouseProc(DWORD dwFlags, const POINT& ptCur, const POINT& ptOld ) { DWORD dwRet = UI_MOUSEPROC_NONE; if (!m_bVisible) return dwRet; // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE == m_eState) { if (dwFlags&UI_MOUSE_LBCLICKED) { SetState(UI_STATE_COMMON_NONE); } else { MoveOffset(ptCur.x - ptOld.x, ptCur.y - ptOld.y); } dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } if(false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { if(false == IsIn(ptOld.x, ptOld.y)) { return dwRet;// 이전 좌표도 영역 밖이면 } dwRet |= UI_MOUSEPROC_PREVINREGION; // 이전 좌표는 영역 안이었다. } else { // tool tip 관련 if (s_pTooltipCtrl) s_pTooltipCtrl->SetText(m_szToolTip); } dwRet |= UI_MOUSEPROC_INREGION; // 이번 좌표는 영역 안이다. //this_ui if(m_pChildUI && m_pChildUI->IsVisible()) return dwRet; // child에게 메세지 전달 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); DWORD dwChildRet = pChild->MouseProc(dwFlags, ptCur, ptOld); if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. // (아래 코드는 dialog를 관리하는 곳에서 해야 한다. 따라서 막아놓음) // m_Children.erase(itor); // 우선 리스트에서 지우고 // m_Children.push_front(pChild); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하려고 dwRet |= (UI_MOUSEPROC_CHILDDONESOMETHING|UI_MOUSEPROC_DONESOMETHING); return dwRet; } } // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE != m_eState && PtInRect(&m_rcMovable, ptCur) && (dwFlags&UI_MOUSE_LBCLICK) ) { SetState(UI_STATE_COMMON_MOVE); dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } return dwRet; }