// offset만큼 이동해준다.(children도 이동) BOOL CN3UIBase::MoveOffset(int iOffsetX, int iOffsetY) { if (0 == iOffsetX && 0 == iOffsetY) return FALSE; // ui 영역 m_rcRegion.left += iOffsetX; m_rcRegion.top += iOffsetY; m_rcRegion.right += iOffsetX; m_rcRegion.bottom += iOffsetY; // movable 영역 if( m_rcMovable.right - m_rcMovable.left != 0 && m_rcMovable.bottom - m_rcMovable.top != 0 ) { m_rcMovable.left += iOffsetX; m_rcMovable.top += iOffsetY; m_rcMovable.right += iOffsetX; m_rcMovable.bottom += iOffsetY; } // children 좌표 갱신 CN3UIBase* pCUI = NULL; // Child UI... for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { pCUI = (*itor); __ASSERT(pCUI, "child UI pointer is NULL!"); pCUI->MoveOffset(iOffsetX, iOffsetY); } return TRUE; }
BOOL CUIChat::MoveOffset(int iOffsetX, int iOffsetY) { if (0 == iOffsetX && 0 == iOffsetY) return FALSE; // ui 영역 m_rcRegion.left += iOffsetX; m_rcRegion.top += iOffsetY; m_rcRegion.right += iOffsetX; m_rcRegion.bottom += iOffsetY; // movable 영역 m_rcMovable.left += iOffsetX; m_rcMovable.top += iOffsetY; m_rcMovable.right += iOffsetX; m_rcMovable.bottom += iOffsetY; // children 좌표 갱신 CN3UIBase* pCUI = NULL; // Child UI... for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { pCUI = (*itor); __ASSERT(pCUI, "child UI pointer is NULL!"); pCUI->MoveOffset(iOffsetX, iOffsetY); } if(CGameProcedure::s_pProcMain->m_pUIMsgDlg) { POINT pt = CGameProcedure::s_pProcMain->m_pUIMsgDlg->GetPos(); RECT rt = this->GetRegion(); if( (rt.right != pt.x) || (rt.top != pt.y) ) { CGameProcedure::s_pProcMain->m_pUIMsgDlg->SetPos(rt.right, rt.top); } } return TRUE; }
bool CN3UIStatic::Load(HANDLE hFile) { if (false == CN3UIBase::Load(hFile)) return false; // m_pImageBkGnd, m_pBuffOutRef 설정하기 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); if (UI_TYPE_IMAGE == pChild->UIType()) { m_pImageBkGnd = (CN3UIImage*)pChild; } else if (UI_TYPE_STRING == pChild->UIType()) { m_pBuffOutRef = (CN3UIString*)pChild; } } // 이전 uif파일을 컨버팅 하려면 사운드 로드 하는 부분 막기 int iSndFNLen = 0; DWORD dwNum; ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen>0) { std::vector<char> buffer(iSndFNLen+1, NULL); ReadFile(hFile, &buffer[0], iSndFNLen, &dwNum, NULL); __ASSERT(NULL == m_pSnd_Click, "memory leak"); m_pSnd_Click = s_SndMgr.CreateObj(&buffer[0], SNDTYPE_2D); } return true; }
bool CUILogIn::ReceiveMessage(CN3UIBase* pSender, DWORD dwMsg) { if(NULL == pSender) return false; //s_CameraData.vp; //불러 오는 과정을 살펴본다 //DWORD mm = s_CameraData.vp.Height; //DWORD ss = s_CameraData.vp.Width; if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender == m_pBtn_LogIn && m_pEdit_id && m_pEdit_pw) { CGameProcedure::s_pProcLogIn->MsgSend_AccountLogIn(LIC_KNIGHTONLINE); } else if(pSender == m_pBtn_Connect) { CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // 고른 게임 서버에 접속 } else if (pSender == m_pBtn_Cancel) { //PostQuitMessage(0); // 종료... CGameBase::s_bRunning = false; } else if(pSender == m_pBtn_Option) // 옵션.. { std::string szMsg; szMsg = "Would you like to open the options?";//::_LoadStringFromResource(IDS_CONFIRM_EXECUTE_OPTION, szMsg); CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_EXECUTE_OPTION); } } else if(UIMSG_LIST_DBLCLK == dwMsg) { CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // 고른 게임 서버에 접속 } else if (dwMsg == UIMSG_EDIT_RETURN) { // TEMP(srmeier): there is a weird issue where the key inputs aren't going // through CGameProcedure::ProcessUIKeyInput() so CUILogIn::OnKeyPress() isn't // being called... if(!m_bLogIn && m_pEdit_id && m_pEdit_pw) { CN3UIBase* pMsgBox = CGameProcedure::s_pMsgBoxMgr->GetFocusMsgBox(); if( !(pMsgBox && pMsgBox->IsVisible()) ) CGameProcedure::s_pProcLogIn->MsgSend_AccountLogIn(LIC_KNIGHTONLINE); } else { ReceiveMessage(m_pBtn_Connect, UIMSG_BUTTON_CLICK); } } else if (dwMsg == UIMSG_EDIT_TAB) { // TEMP(srmeier): there is a weird issue where the key inputs aren't going // through CGameProcedure::ProcessUIKeyInput() so CUILogIn::OnKeyPress() isn't // being called... FocusCircular(); } return true; }
void CN3UIBase::Tick() { for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); pChild->Tick(); } }
void CN3UIBase::ChangeImagePath(const std::string& szPathOld, const std::string& szPathNew) { // child 정보 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); pChild->ChangeImagePath(szPathOld, szPathNew); } }
void CN3UIBase::ChangeFont(const std::string& szFont) { // child 정보 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); pChild->ChangeFont(szFont); } }
void CN3UIBase::GatherImageFileName(std::set<std::string>& setImgFile) { // child 정보 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); pChild->GatherImageFileName(setImgFile); } }
bool CUIChat::OnKeyPress(int iKey) { switch(iKey) { case DIK_ESCAPE: { //hotkey가 포커스 잡혀있을때는 다른 ui를 닫을수 없으므로 DIK_ESCAPE가 들어오면 포커스를 다시잡고 //열려있는 다른 유아이를 닫아준다. CGameProcedure::s_pUIMgr->ReFocusUI();//this_ui CN3UIBase* pFocus = CGameProcedure::s_pUIMgr->GetFocusedUI(); if(pFocus && pFocus != this) pFocus->OnKeyPress(iKey); } return true; } return CN3UIBase::OnKeyPress(iKey); }
bool CUIManager::BroadcastIconDropMsg(__IconItemSkill* spItem) { bool bFound = false; POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); // 윈도우들을 돌아 다니면서 검사.. for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { if ( bFound ) break; CN3UIBase* pChild = (*itor); if ( pChild->UIType() == UI_TYPE_ICON_MANAGER ) { // 해당 윈도우가 보이고(활성화 되어 있고), 그 윈도우 영역 안에 있으면.. if ( ((CN3UIWndBase* )pChild)->IsVisible() && ((CN3UIWndBase* )pChild)->IsIn(ptCur.x, ptCur.y) ) // 해당 윈도우에 아이콘 드롭 메시지 함수를 호출.. if ( ((CN3UIWndBase* )pChild)->ReceiveIconDrop(spItem, ptCur) ) return true; else bFound = true; } } // 어느 누구의 영역에도 속하지 않으면.. 해당 아이콘을 가진 윈도우에게 Cancel 메시지를 날려 준다.. if ( !bFound ) { switch ( CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd ) { case UIWND_INVENTORY: CGameProcedure::s_pProcMain->m_pUIInventory->CancelIconDrop(spItem); break; case UIWND_TRANSACTION: CGameProcedure::s_pProcMain->m_pUITransactionDlg->CancelIconDrop(spItem); break; case UIWND_WARE_HOUSE: CGameProcedure::s_pProcMain->m_pUIWareHouseDlg->CancelIconDrop(spItem); break; case UIWND_EXCHANGE_REPAIR: CGameProcedure::s_pProcMain->m_pUIItemREDlg->CancelIconDrop(spItem); break; } } return false; }
CN3UIBase* CUIManager::GetTopUI(bool bVisible) { if(!bVisible) { if(m_Children.empty()) return NULL; else return *(m_Children.begin()); } UIListItor it = m_Children.begin(), itEnd = m_Children.end(); for(; it != itEnd; it++) { CN3UIBase* pUI = *(it); if(pUI->IsVisible()) return pUI; } return NULL; }
bool CUILogIn::ReceiveMessage(CN3UIBase* pSender, DWORD dwMsg) { if(NULL == pSender) return false; //s_CameraData.vp; //불러 오는 과정을 살펴본다 //DWORD mm = s_CameraData.vp.Height; //DWORD ss = s_CameraData.vp.Width; if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender == m_pBtn_LogIn && m_pEdit_id && m_pEdit_pw) { CGameProcedure::s_pProcLogIn->MsgSend_AccountLogIn(LIC_KNIGHTONLINE); } else if(pSender == m_pBtn_Connect) { CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // 고른 게임 서버에 접속 } else if (pSender == m_pBtn_Cancel) { PostQuitMessage(0); // 종료... } else if(pSender == m_pBtn_Option) // 옵션.. { std::string szMsg; ::_LoadStringFromResource(IDS_CONFIRM_EXECUTE_OPTION, szMsg); CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_EXECUTE_OPTION); } } else if(UIMSG_LIST_DBLCLK == dwMsg) { CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // 고른 게임 서버에 접속 } else if (dwMsg == UIMSG_EDIT_RETURN) { if(!m_bLogIn && m_pEdit_id && m_pEdit_pw) { CN3UIBase* pMsgBox = CGameProcedure::s_pMsgBoxMgr->GetFocusMsgBox(); if( !(pMsgBox && pMsgBox->IsVisible()) ) CGameProcedure::s_pProcLogIn->MsgSend_AccountLogIn(LIC_KNIGHTONLINE); } } return true; }
bool CN3UIBase::Save(HANDLE hFile) { CN3BaseFileAccess::Save(hFile); DWORD dwRWC = NULL; // child 정보 int iCC = m_Children.size(); WriteFile(hFile, &iCC, sizeof(iCC), &dwRWC, NULL); // Child 갯수 ㅆ고..고.. for(UIListReverseItor itor = m_Children.rbegin(); m_Children.rend() != itor; ++itor) // childadd할때 push_front이므로 저장할 때 거꾸로 저장해야 한다. { CN3UIBase* pChild = (*itor); eUI_TYPE eUIType = pChild->UIType(); WriteFile(hFile, &eUIType, sizeof(eUIType), &dwRWC, NULL); // UI Type 쓰고.. pChild->Save(hFile); } // base 정보 int iIDLen = 0; iIDLen = m_szID.size(); WriteFile(hFile, &iIDLen, sizeof(iIDLen), &dwRWC, NULL); // id length if (iIDLen>0) WriteFile(hFile, m_szID.c_str(), iIDLen, &dwRWC, NULL); // ui id WriteFile(hFile, &m_rcRegion, sizeof(m_rcRegion), &dwRWC, NULL); // m_rcRegion WriteFile(hFile, &m_rcMovable, sizeof(m_rcMovable), &dwRWC, NULL); // m_rcMovable WriteFile(hFile, &m_dwStyle, sizeof(m_dwStyle), &dwRWC, NULL); // style WriteFile(hFile, &m_dwReserved, sizeof(m_dwReserved), &dwRWC, NULL); // m_dwReserved int iTooltipLen = m_szToolTip.size(); WriteFile(hFile, &iTooltipLen, sizeof(iTooltipLen), &dwRWC, NULL); // tooltip문자열 길이 if (iTooltipLen>0) WriteFile(hFile, m_szToolTip.c_str(), iTooltipLen, &dwRWC, NULL); int iSndFNLen = 0; if (m_pSnd_OpenUI) iSndFNLen = m_pSnd_OpenUI->m_szFileName.size(); WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen>0) WriteFile(hFile, m_pSnd_OpenUI->m_szFileName.c_str(), iSndFNLen, &dwRWC, NULL); iSndFNLen = 0; if (m_pSnd_CloseUI) iSndFNLen = m_pSnd_CloseUI->m_szFileName.size(); WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen>0) WriteFile(hFile, m_pSnd_CloseUI->m_szFileName.c_str(), iSndFNLen, &dwRWC, NULL); return true; }
void CUIManager::UserMoveHideUIs() { bool bHide = false; UIListItor it = m_Children.begin(), itEnd = m_Children.end(); for(; it != itEnd; it++) { CN3UIBase* pUI = *(it); if(pUI == NULL) continue; if(pUI->IsVisible() && (pUI->GetStyle() & UISTYLE_USER_MOVE_HIDE)) { bHide = true; pUI->SetVisibleWithNoSound(false, true); } } if(bHide) ReFocusUI(); }
bool CN3UIButton::Load(HANDLE hFile) { if (false == CN3UIBase::Load(hFile)) return false; DWORD dwNum; ReadFile(hFile, &m_rcClick, sizeof(m_rcClick), &dwNum, NULL); // click 영역 // m_ImageRef 설정하기 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) continue; // image만 골라내기 int iBtnState = (int)(pChild->GetReserved()); if (iBtnState<NUM_BTN_STATE) { m_ImageRef[iBtnState] = (CN3UIImage*)pChild; } } // 이전 uif파일을 컨버팅 하려면 사운드 로드 하는 부분 막기 int iSndFNLen = 0; ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen>0) { std::vector<char> buffer(iSndFNLen+1, NULL); ReadFile(hFile, &buffer[0], iSndFNLen, &dwNum, NULL); __ASSERT(NULL == m_pSnd_On, "memory leak"); m_pSnd_On = s_SndMgr.CreateObj(&buffer[0], SNDTYPE_2D); } ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen>0) { std::vector<char> buffer(iSndFNLen+1, NULL); ReadFile(hFile, &buffer[0], iSndFNLen, &dwNum, NULL); __ASSERT(NULL == m_pSnd_Click, "memory leak"); m_pSnd_Click = s_SndMgr.CreateObj(&buffer[0], SNDTYPE_2D); } return true; }
void CN3UIBase::Render() { if (!m_bVisible) return; // 보이지 않으면 자식들을 render하지 않는다. for(UIListReverseItor itor = m_Children.rbegin(); m_Children.rend() != itor; ++itor) { CN3UIBase* pChild = (*itor); pChild->Render(); //this_ui CN3UIBase* pCUI = NULL; pCUI = pChild->m_pChildUI; while(pCUI) { pCUI->Render(); pCUI = pCUI->m_pChildUI; } } }
bool CN3UIList::Load(HANDLE hFile) { bool bSuccess = CN3UIBase::Load(hFile); // font 정보 DWORD dwNum; int iStrLen = 0; ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font 이름 길이 __ASSERT(iStrLen>0, "No font name"); if (iStrLen>0) { m_szFontName.assign(iStrLen, ' '); ReadFile(hFile, &(m_szFontName[0]), iStrLen, &dwNum, NULL); // string ReadFile(hFile, &m_dwFontHeight, 4, &dwNum, NULL); // font height ReadFile(hFile, &m_crFont, 4, &dwNum, NULL); // font color ReadFile(hFile, &m_bFontBold, 4, &dwNum, NULL); // font flag (bold, italic) ReadFile(hFile, &m_bFontItalic, 4, &dwNum, NULL); // font flag (bold, italic) } // Child 중에 Scroll Bar 가 있는지 찾아본다. for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pUI = *itor; if(pUI->UIType() == UI_TYPE_SCROLLBAR) { m_pScrollBarRef = (CN3UIScrollBar*)pUI; } // else if(pUI->Type() == UI_TYPE_STRING) // { // CN3UIString* pString = *itor; // if( pString->GetFontName != m_szFontName || // pString->GetFontHeight() != m_dwFontHeight || // m_bFontBold != (pString->GetFontFlags() & D3DFONT_BOLD) || // m_bFontItalic != (pString->GetFontFlags() & D3DFONT_ITALIC) ) // 폰트가 다르면.. 적용 // { // pString->SetFont(m_szFontName, m_dwFontHeight, m_bFontBold, m_bFontItalic); // } // } } return bSuccess; }
void CN3UIStatic::operator = (const CN3UIStatic& other) { CN3UIBase::operator = (other); SetSndClick(other.GetSndFName_Click()); // m_pImageBkGnd, m_pBuffOutRef 설정하기 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); if (UI_TYPE_IMAGE == pChild->UIType()) { m_pImageBkGnd = (CN3UIImage*)pChild; } else if (UI_TYPE_STRING == pChild->UIType()) { m_pBuffOutRef = (CN3UIString*)pChild; } } }
CN3UIBase* CUIManager::GetEnableFocusTopUI(bool bVisible) { if(!bVisible) { if(m_Children.empty()) return NULL; else return *(m_Children.begin()); } UIListItor it = m_Children.begin(), itEnd = m_Children.end(); for(; it != itEnd; it++) { CN3UIBase* pUI = *(it); if(pUI && pUI->IsVisible() && //보이고 !(pUI->GetStyle() & UISTYLE_FOCUS_UNABLE) && //포커스가 가능하고 !(pUI->GetStyle() & UISTYLE_HIDE_UNABLE)) //닫힐수 있는 return pUI; } return NULL; }
void CN3UIButton::operator = (const CN3UIButton& other) { CN3UIBase::operator = (other); m_rcClick = other.m_rcClick; // 클릭 영역 SetSndOn(other.GetSndFName_On()); // 사운드 SetSndClick(other.GetSndFName_Click()); // 사운드 // m_ImageRef 설정하기 for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) continue; // image만 골라내기 int iBtnState = (int)(pChild->GetReserved()); if (iBtnState<NUM_BTN_STATE) { m_ImageRef[iBtnState] = (CN3UIImage*)pChild; } } }
void CN3UIButton::Render() { if(!m_bVisible) return; switch(m_eState) { case UI_STATE_BUTTON_NORMAL: { if (m_ImageRef[BS_NORMAL]) m_ImageRef[BS_NORMAL]->Render(); } break; case UI_STATE_BUTTON_DOWN: case UI_STATE_BUTTON_DOWN_2CHECKDOWN: case UI_STATE_BUTTON_DOWN_2CHECKUP: { if (m_ImageRef[BS_DOWN]) m_ImageRef[BS_DOWN]->Render(); } break; case UI_STATE_BUTTON_ON: { if (m_ImageRef[BS_ON]) m_ImageRef[BS_ON]->Render(); } break; case UI_STATE_BUTTON_DISABLE: { if (m_ImageRef[BS_DISABLE]) m_ImageRef[BS_DISABLE]->Render(); } } int i = 0; for(UIListReverseItor itor = m_Children.rbegin(); m_Children.rend() != itor; ++itor) { CN3UIBase* pChild = (*itor); for(i = 0; i < NUM_BTN_STATE; i++) // 버튼의 구성 요소가 아닌지 보고.. if(pChild == m_ImageRef[i]) break; if(i >= NUM_BTN_STATE) pChild->Render(); // 버튼 차일드가 아니면 렌더링.. } }
void CUIItemExchange::Render() { if (!m_bVisible) return; // 보이지 않으면 자식들을 render하지 않는다. POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); m_pUITooltipDlg->DisplayTooltipsDisable(); bool bTooltipRender = false; __IconItemSkill* spItem; for(UIListReverseItor itor = m_Children.rbegin(); m_Children.rend() != itor; ++itor) { CN3UIBase* pChild = (*itor); pChild->Render(); if ( (pChild->UIType() == UI_TYPE_ICON) && (pChild->GetStyle() & UISTYLE_ICON_HIGHLIGHT) ) { bTooltipRender = true; spItem = GetHighlightIconItem( (CN3UIIcon* )pChild ); } } if ( bTooltipRender ) m_pUITooltipDlg->DisplayTooltipsEnable(ptCur.x, ptCur.y, spItem ); }
void CN3UIBase::ArrangeZOrder() { // 보통 image가 배경그림이 되므로 child list에서 맨 뒤로 보낸다. // 왜냐하면 맨 뒤에 있는것이 맨 먼저 그려지므로 UIList tempList; for(UIListItor itor = m_Children.begin(); m_Children.end() != itor;) { CN3UIBase* pChild = (*itor); if(UI_TYPE_IMAGE == pChild->UIType()) { itor = m_Children.erase(itor); // 현재 위치에서 지우고 tempList.push_back(pChild); // 임시 버퍼에 저장 } else ++itor; } for(itor = tempList.begin(); tempList.end() != itor; ++itor) { CN3UIBase* pChild = (*itor); m_Children.push_back(pChild); // child list맨 뒤에 넣기 } tempList.clear(); }
void CN3UIBase::ResizeAutomaticalyByChild() { if(m_Children.empty()) return; RECT rcMax = { 100000000, 100000000, -100000000, -100000000 }; int iIndex = 0; for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; itor++, iIndex++) { CN3UIBase* pChild = (*itor); RECT rcTmp = pChild->GetRegion(); if(rcTmp.left < rcMax.left) rcMax.left = rcTmp.left; if(rcTmp.top < rcMax.top) rcMax.top = rcTmp.top; if(rcTmp.right > rcMax.right) rcMax.right = rcTmp.right; if(rcTmp.bottom > rcMax.bottom) rcMax.bottom = rcTmp.bottom; } RECT rcCur = this->GetRegion(); if(rcCur.left > rcMax.left) rcCur.left = rcMax.left; if(rcCur.top > rcMax.top) rcCur.top = rcMax.top; if(rcCur.right < rcMax.right) rcCur.right = rcMax.right; if(rcCur.bottom < rcMax.bottom) rcCur.bottom = rcMax.bottom; // this->SetRegion(rcCur); m_rcRegion = rcCur; // SetRegion을 해버리면 child의 영역을 바꿔버리는 경우가 있으므로 내 영역만 바꾸기위해 직접 넣는다. }
void CUIManager::ReorderChildList() // 다이알로그 순서 재배치 { int iChildCount = m_Children.size(); if (iChildCount<=0) return; CN3UIBase** ppBuffer = new CN3UIBase*[iChildCount]; int iAlwaysTopChildCount = 0; for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ) { CN3UIBase* pChild = (*itor); if (pChild->GetStyle() & UISTYLE_ALWAYSTOP) { itor = m_Children.erase(itor); // 우선 리스트에서 지우고 ppBuffer[iAlwaysTopChildCount++] = pChild; } else ++itor; } int i; for (i=iAlwaysTopChildCount-1; i>=0; --i) { m_Children.push_front(ppBuffer[i]); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 } delete [] ppBuffer; }
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; }
bool CN3UIBase::Load(HANDLE hFile) { CN3BaseFileAccess::Load(hFile); DWORD dwRWC = NULL; // children 정보 int iCC = 0; if(m_iVersion == N3FORMAT_VER_1298) { //char temp[0xFF]; short sCC, sIdk0; ReadFile(hFile, &sCC, sizeof(short), &dwRWC, NULL); // children count ReadFile(hFile, &sIdk0, sizeof(short), &dwRWC, NULL); iCC = (int) sCC; //sprintf(temp, "sIdk0 = %d\n", sIdk0); //OutputDebugString(temp); } else { ReadFile(hFile, &iCC, sizeof(iCC), &dwRWC, NULL); // children count } eUI_TYPE eChildUIType; for(int i = 0; i < iCC; i++) { CN3UIBase* pChild = NULL; ReadFile(hFile, &eChildUIType, sizeof(eChildUIType), &dwRWC, NULL); // child의 ui type switch(eChildUIType) { case UI_TYPE_BASE: pChild = new CN3UIBase(); break; case UI_TYPE_IMAGE: pChild = new CN3UIImage(); break; case UI_TYPE_STRING: pChild = new CN3UIString(); break; case UI_TYPE_BUTTON: pChild = new CN3UIButton(); break; case UI_TYPE_STATIC: pChild = new CN3UIStatic(); break; case UI_TYPE_PROGRESS: pChild = new CN3UIProgress(); break; case UI_TYPE_SCROLLBAR: pChild = new CN3UIScrollBar(); break; case UI_TYPE_TRACKBAR: pChild = new CN3UITrackBar(); break; case UI_TYPE_EDIT: pChild = new CN3UIEdit(); break; case UI_TYPE_AREA: pChild = new CN3UIArea(); break; #ifdef _REPENT case UI_TYPE_ICONSLOT: pChild = new CN3UIIconSlot(); break; #endif case UI_TYPE_LIST: pChild = new CN3UIList(); break; } __ASSERT(pChild, "Unknown type UserInterface!!!"); pChild->Init(this); pChild->Load(hFile); } // base 정보 int iIDLen = 0; ReadFile(hFile, &iIDLen, sizeof(iIDLen), &dwRWC, NULL); // ui id length if (iIDLen>0) { std::vector<char> buffer(iIDLen+1, NULL); ReadFile(hFile, &buffer[0], iIDLen, &dwRWC, NULL); // ui id m_szID = &buffer[0]; } else { m_szID = ""; } ReadFile(hFile, &m_rcRegion, sizeof(m_rcRegion), &dwRWC, NULL); // m_rcRegion ReadFile(hFile, &m_rcMovable, sizeof(m_rcMovable), &dwRWC, NULL); // m_rcMovable ReadFile(hFile, &m_dwStyle, sizeof(m_dwStyle), &dwRWC, NULL); // style ReadFile(hFile, &m_dwReserved, sizeof(m_dwReserved), &dwRWC, NULL); // m_dwReserved int iTooltipLen; ReadFile(hFile, &iTooltipLen, sizeof(iTooltipLen), &dwRWC, NULL); // tooltip문자열 길이 if (iTooltipLen>0) { std::vector<char> buffer(iTooltipLen+1, NULL); ReadFile(hFile, &buffer[0], iTooltipLen, &dwRWC, NULL); m_szToolTip = &buffer[0]; } // 이전 uif파일을 컨버팅 하려면 사운드 로드 하는 부분 막기 int iSndFNLen = 0; ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen>0) { std::vector<char> buffer(iSndFNLen+1, NULL); ReadFile(hFile, &buffer[0], iSndFNLen, &dwRWC, NULL); __ASSERT(NULL == m_pSnd_OpenUI, "memory leak"); m_pSnd_OpenUI = s_SndMgr.CreateObj(&buffer[0], SNDTYPE_2D); } ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen>0) { std::vector<char> buffer(iSndFNLen+1, NULL); ReadFile(hFile, &buffer[0], iSndFNLen, &dwRWC, NULL); __ASSERT(NULL == m_pSnd_CloseUI, "memory leak"); m_pSnd_CloseUI = s_SndMgr.CreateObj(&buffer[0], SNDTYPE_2D); } return true; }
void CUIManager::SetVisibleFocusedUI(CN3UIBase *pUI) { if(NULL == pUI) { m_pUIFocused = NULL; return; } if(!pUI->IsVisible()) return; UIListItor it = m_Children.begin(), itEnd = m_Children.end(); DWORD dwUIStyle, dwUIHideStyle; CN3UIBase* pUIHide = NULL; dwUIStyle = pUI->GetStyle(); if(dwUIStyle & UISTYLE_SHOW_ME_ALONE) { for(; it != itEnd;) { pUIHide = *it; if(pUIHide == NULL) { it = m_Children.erase(it); continue; } dwUIHideStyle = pUIHide->GetStyle(); if(pUIHide->IsVisible() && pUI != pUIHide && !(dwUIHideStyle & UISTYLE_HIDE_UNABLE)) pUIHide->SetVisibleWithNoSound(false, true); it++; }// } else if(!(dwUIStyle & UISTYLE_HIDE_UNABLE)) { for(; it != itEnd;) { pUIHide = *it; if(pUIHide == NULL) { it = m_Children.erase(it); continue; } dwUIHideStyle = pUIHide->GetStyle(); if(pUIHide->IsVisible() && pUI != pUIHide && (dwUIHideStyle & UISTYLE_SHOW_ME_ALONE)) pUIHide->SetVisibleWithNoSound(false, true); /* if(pUIHide->IsVisible() && pUI != pUIHide) { if(dwUIHideStyle & UISTYLE_SHOW_ME_ALONE) pUIHide->SetVisibleWithNoSound(false, true); else if( (dwUIStyle & UISTYLE_POS_LEFT) && (dwUIHideStyle & UISTYLE_POS_LEFT) ) pUIHide->SetVisibleWithNoSound(false, true); else if( (dwUIStyle & UISTYLE_POS_RIGHT) && (dwUIHideStyle & UISTYLE_POS_RIGHT) ) pUIHide->SetVisibleWithNoSound(false, true); } */ it++; } } it = m_Children.begin(); itEnd = m_Children.end(); for(; it != itEnd; it++) { if(pUI == *it) break; } if(it == itEnd) return; if(!(dwUIStyle & UISTYLE_FOCUS_UNABLE)) { it = m_Children.erase(it); // 우선 리스트에서 지우고 m_Children.push_front(pUI); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) } m_pUIFocused = this->GetEnableFocusTopUI(true); }
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; }
void CN3UIBase::operator = (const CN3UIBase& other) { Init(NULL); // 일단 부모는 없게 초기화 UIListItorConst it = other.m_Children.begin(); UIListItorConst itEnd = other.m_Children.end(); CN3UIBase* pOtherChild = NULL; CN3UIBase* pChild = NULL; for(; it != itEnd; it++) { pOtherChild = *it; if(NULL == pOtherChild) continue; pChild = NULL; switch(pOtherChild->UIType()) { case UI_TYPE_BASE: { pChild = new CN3UIBase(); *pChild = *pOtherChild; } break; case UI_TYPE_BUTTON: { CN3UIButton *pUINew = new CN3UIButton(); *pUINew = *((CN3UIButton*)pOtherChild); pChild = pUINew; } break; // button case UI_TYPE_STATIC: { CN3UIStatic* pUINew = new CN3UIStatic(); *pUINew = *((CN3UIStatic*)pOtherChild); pChild = pUINew; } break; // static (배경그림과 글자가 나오는 클래스) case UI_TYPE_PROGRESS: { CN3UIProgress* pUINew = new CN3UIProgress(); *pUINew = *((CN3UIProgress*)pOtherChild); pChild = pUINew; } break; // progress case UI_TYPE_IMAGE: { CN3UIImage* pUINew = new CN3UIImage(); *pUINew = *((CN3UIImage*)pOtherChild); pChild = pUINew; } break; // image case UI_TYPE_SCROLLBAR: { CN3UIScrollBar* pUINew = new CN3UIScrollBar(); *pUINew = *((CN3UIScrollBar*)pOtherChild); pChild = pUINew; } break; // scroll bar case UI_TYPE_STRING: { CN3UIString* pUINew = new CN3UIString(); *pUINew = *((CN3UIString*)pOtherChild); pChild = pUINew; } break; // string case UI_TYPE_TRACKBAR: { CN3UITrackBar* pUINew = new CN3UITrackBar(); *pUINew = *((CN3UITrackBar*)pOtherChild); pChild = pUINew; } break; // track bar case UI_TYPE_EDIT: { CN3UIEdit* pUINew = new CN3UIEdit(); *pUINew = *((CN3UIEdit*)pOtherChild); pChild = pUINew; } break; // edit case UI_TYPE_AREA: { CN3UIArea* pUINew = new CN3UIArea(); *pUINew = *((CN3UIArea*)pOtherChild); pChild = pUINew; } break; // area case UI_TYPE_TOOLTIP: { CN3UITooltip* pUINew = new CN3UITooltip(); *pUINew = *((CN3UITooltip*)pOtherChild); pChild = pUINew; } break; // tooltip case UI_TYPE_LIST: { CN3UIList* pUINew = new CN3UIList(); *pUINew = *((CN3UIList*)pOtherChild); pChild = pUINew; } break; // tooltip // case UI_TYPE_ICON: pUIDest = new CN3UIIcon(); *pUIDest = *((CN3UIBase*)pUISrc); break; // icon // case UI_TYPE_ICON_MANAGER: pUIDest = new CN3UIIconManager(); *pUIDest = *((CN3UIBase*)pUISrc); break; // icon manager.. #ifdef _REPENT case UI_TYPE_ICONSLOT: { CN3UIIconSlot* pUINew = new CN3UIIconSlot(); *pUINew = *((CN3UIIconSlot*)pOtherChild); pChild = pUINew; } break; // icon slot #endif } if(pChild) pChild->SetParent(this); // 부모 지정 } m_bVisible = other.m_bVisible; m_dwReserved = other.m_dwReserved; m_dwStyle = other.m_dwStyle; m_eState = other.m_eState; m_eType = other.m_eType; SetSndOpen(other.GetSndFName_OpenUI()); SetSndClose(other.GetSndFName_CloseUI()); m_rcMovable = other.m_rcMovable; m_rcRegion = other.m_rcRegion; m_szID = other.m_szID; m_szToolTip = other.m_szToolTip; }