From bc5361a42e489eeeb69a6d46a7c892c234a7965a Mon Sep 17 00:00:00 2001 From: Cussrro Date: Fri, 20 Dec 2024 15:10:08 +0800 Subject: [PATCH] 1 --- Client/DragonNest/DnQuestSummaryInfoDlg.cpp | 38 +-- Client/DragonNest/DnQuestTask.h | 4 +- Common/EtInterface/EtUIControlProperty.cpp | 9 +- Common/EtInterface/EtUIDialog.cpp | 262 ++++++++++---------- Common/EtInterface/EtUIDialog.h | 90 +++---- GameCommon/DNNotifierCommon.h | 14 +- 6 files changed, 205 insertions(+), 212 deletions(-) diff --git a/Client/DragonNest/DnQuestSummaryInfoDlg.cpp b/Client/DragonNest/DnQuestSummaryInfoDlg.cpp index 496839a2..ea17d6e0 100644 --- a/Client/DragonNest/DnQuestSummaryInfoDlg.cpp +++ b/Client/DragonNest/DnQuestSummaryInfoDlg.cpp @@ -204,7 +204,7 @@ EtVector2 CDnNotifierControls::CalcArrowDestination(int nQuestIndex , int nJurna } } - // ġ ٸ + // 泅犁 困摹客 格利瘤啊 促福搁 if ( CGlobalInfo::GetInstance().m_nCurrentMapIndex != pJournalPage->nDestnationMapIndex ) { PathResult pathResult; @@ -212,14 +212,14 @@ EtVector2 CDnNotifierControls::CalcArrowDestination(int nQuestIndex , int nJurna if ( pathResult.size() > 0 ) { - // Ʈ Ǵ ˾Ƴ + // 绢蠢 霸捞飘肺 唱啊具 登绰瘤 舅酒辰促澜俊 int nGateIndex = pathResult[ 0 ].nGateIndex; DWORD dwCount = CDnWorld::GetInstance().GetGateCount(); CDnWorld::GateStruct *pGateStruct( NULL ); SOBB *pOBB( NULL ); - // ũ Ǿ Ʈ Ǿ - // ϴ Ÿ ġ ̻ ־´. + // 甘 傅农 沥焊绰 力措肺 登绢乐瘤父 霸捞飘 沥焊绰 力措肺 登绢乐瘤 臼阑锭 + // 老窜 鸥百 困摹绰 捞惑茄 蔼阑 持绢初绰促. PosVector.x = PosVector.y = fDummyPos; if( nGateIndex == -1 ) { return EtVector2(0,0); @@ -440,7 +440,7 @@ void CDnNotifierControls::Refresh( const wchar_t *szTitle, const wchar_t *szDest int nSize = m_pTextBox->GetLineSize(); #if !defined(_US) - if(nSize > 1) // ̸̻ ٸ ".." ߰ + if(nSize > 1) // 茄临捞惑捞搁 茄临父 巢扁绊 ".." 眠啊 m_pTextBox->ResizeLineTextWithSymbol(1,L".."); #endif @@ -500,7 +500,7 @@ void CDnNotifierControls::Refresh( const wchar_t *szTitle, const wchar_t *szDest for( int i = 0; i < 5*nMaxLen/2; i++) szGetString += L" "; szGetString += L"\n"; - if( nItemTotalCnt != 0 && nItemCnt <= nItemTotalCnt) { // #22983 īƮ ƽġ ʰϴ . + if( nItemTotalCnt != 0 && nItemCnt <= nItemTotalCnt) { // #22983 包访 酒捞袍 墨款飘 钙胶摹 檬苞窍绰 版快 绝澜. m_pTextBox->AddText( FormatW( GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 422 ), 100 * nItemCnt / nItemTotalCnt ).c_str(), textcolor::YELLOW ); m_pTextBox->SetTooltipText( szGetString.c_str() ); } @@ -561,7 +561,7 @@ void CDnNotifierControls::Refresh( const wchar_t *szTitle, const wchar_t *szDest for( int i = 0; i < 5*nMaxLen/2; i++) szGetString += L" "; szGetString += L"\n"; - if( nItemTotalCnt != 0 && nItemCnt <= nItemTotalCnt) { // #22983 īƮ ƽġ ʰϴ . + if( nItemTotalCnt != 0 && nItemCnt <= nItemTotalCnt) { // #22983 包访 酒捞袍 墨款飘 钙胶摹 檬苞窍绰 版快 绝澜. m_pTextBox->AddText( FormatW( GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 422 ), 100 * nItemCnt / nItemTotalCnt ).c_str(), textcolor::YELLOW ); m_pTextBox->SetTooltipText( szGetString.c_str() ); } @@ -912,7 +912,7 @@ bool CDnQuestSummaryInfoDlg::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARA int nOverIndex = -1; for( int i = 0; i < DNNotifier::RegisterCount::Total; i++) { - m_NotifierControls[ i ].MsgProc( hWnd, uMsg, wParam, lParam ); // MouseOver ó + m_NotifierControls[ i ].MsgProc( hWnd, uMsg, wParam, lParam ); // MouseOver 贸府 if( m_NotifierControls[ i ].IsMouseOver() ) { nOverIndex = i; } @@ -1105,7 +1105,7 @@ bool CDnQuestSummaryInfoDlg::IsCanProgressQuest(int nQuestIndex) TQuest *QuestInfo = NULL; std::vector vecProgSubQuest; - GetQuestTask().GetPlaySubQuest( vecProgSubQuest ); // Ʈ Ʈ. + GetQuestTask().GetPlaySubQuest( vecProgSubQuest ); // 泅犁 柳青吝牢 涅胶飘 府胶飘. bool bExistQuest = false; for(DWORD i=0;i > vecGetList; std::wstring szProgress; - std::vector vec_PriorityQuestList; // ߿ 켱 ° + std::vector vec_PriorityQuestList; // 弊吝俊 粱歹 快急鉴困甫 啊瘤绰巴 vec_PriorityQuestList.clear(); std::vector vec_AddedQuestList; @@ -1159,7 +1159,7 @@ void CDnQuestSummaryInfoDlg::RefreshPriortyNotifier() std::vector vecProgSubQuest; - GetQuestTask().GetPlaySubQuest( vecProgSubQuest ); // Ʈ Ʈ. + GetQuestTask().GetPlaySubQuest( vecProgSubQuest ); // 泅犁 柳青吝牢 涅胶飘 府胶飘. for( int i = DNNotifier::RegisterCount::MainQuest; i < DNNotifier::RegisterCount::TotalQuest; i++ ) { @@ -1182,11 +1182,11 @@ void CDnQuestSummaryInfoDlg::RefreshPriortyNotifier() Journal* pJournal = NULL; JournalPage* pJournalPage = NULL; - for(DWORD j=0;jnQuestID == vec_PriorityQuestList[k]) @@ -1222,23 +1222,23 @@ void CDnQuestSummaryInfoDlg::RefreshPriortyNotifier() } } - // ֿ켱 Ʈ ۼѵ װ ش. + // 弥快急 府胶飘甫 累己茄第 弊巴阑 饭骇喊肺 家泼秦霖促. if( vec_PriorityQuestList.size() > 1) std::sort( vec_PriorityQuestList.begin() , vec_PriorityQuestList.end() , CompareQuestLevel ); - // ֿ켱 Ʈ ߰ Ʈ ۼ ְ // ֿ켱 Ʈ Ǫش. + // 弥快急 府胶飘甫 力寇茄 眠啊利牢 府胶飘甫 累己茄饶 家泼秦林绊 // 弥快急 府胶飘狼 付瘤阜俊 仟浆秦霖促. if(!vec_AddedQuestList.empty()) { if( vec_AddedQuestList.size() > 1 ) std::sort( vec_AddedQuestList.begin() , vec_AddedQuestList.end() , CompareQuestLevel ); for(DWORD i=0; i= DNNotifier::RegisterCount::SubQuest) break; } } - for( DWORD i = DNNotifier::RegisterCount::MainQuest; i < DNNotifier::RegisterCount::TotalQuest ; i++ ) // ĵ Ʈ ѷ. + for( DWORD i = DNNotifier::RegisterCount::MainQuest; i < DNNotifier::RegisterCount::TotalQuest ; i++ ) // 付瘤阜栏肺 沥纺等 府胶飘甫 谎妨淋. { TQuest *QuestInfo = NULL; Journal* pJournal = NULL; @@ -1501,7 +1501,7 @@ void CDnQuestSummaryInfoDlg::RefreshNotifier() bool CDnQuestSummaryInfoDlg::FindControl( std::vector< CEtUIControl* > &vecControl, int nTypeCount, UI_CONTROL_TYPE *pType, bool bCheckCoveredControl, std::vector &vecDlgCoord ) { - // Ʈ ˸ ư ̷ ʱ⶧, ߰ؾѴ. + // 涅胶飘 舅覆捞狼 版快 滚瓢栏肺 捞凤廉乐瘤 臼扁锭巩俊, 流立 眠啊秦具茄促. CEtUIControl *pControl(NULL); for( int i = 0; i < DNNotifier::RegisterCount::Total; i++) { if( m_NotifierControls[ i ].IsShow() ) { @@ -1509,7 +1509,7 @@ bool CDnQuestSummaryInfoDlg::FindControl( std::vector< CEtUIControl* > &vecContr bool bPushControl = true; if( bCheckCoveredControl ) { - // Ϲ Ʈѷ  ٸ â ִ ȮѴ. + // 老馆利牢 牧飘费肺 积阿秦 啊款单 瘤痢捞 促弗 芒俊 啊妨廉乐绰瘤 犬牢茄促. SUICoord ControlCoord; pControl->GetUICoord( ControlCoord ); ControlCoord.fX = ControlCoord.fX + ControlCoord.fWidth/2.0f; diff --git a/Client/DragonNest/DnQuestTask.h b/Client/DragonNest/DnQuestTask.h index 774f2cd2..180e37a7 100644 --- a/Client/DragonNest/DnQuestTask.h +++ b/Client/DragonNest/DnQuestTask.h @@ -47,10 +47,10 @@ public: void OnRecvScorePeriodQuest(SCScorePeriodQuest *pPacket); #ifdef PRE_ADD_NPC_REPUTATION_SYSTEM - CReputationSystemRepository* GetReputationRepository( void ) { return m_pReputationRepos; }; // ϴ questtask ؼ task ٶ.. + CReputationSystemRepository* GetReputationRepository( void ) { return m_pReputationRepos; }; // 老窜 questtask 俊 滴瘤父 乞魄 包访秦辑 剧捞 腹酒瘤搁 蝶肺 task 肺 哗绰 巴捞 官恩流.. void ClearNpcReaction( void ) { m_NpcReaction.Clear(); }; - bool CheckAndCalcStoreBenefit( int iType, /*IN OUT*/ int& iNeedCoin ); // ó. óȴٸ true Ѵ. + bool CheckAndCalcStoreBenefit( int iType, /*IN OUT*/ int& iNeedCoin ); // 惑痢 驱琶 贸府. 焊惑 贸府等促搁 true 甫 府畔茄促. int GetStoreBenefitValue( int iType ); virtual void OnRecvReputationList( SCReputationList* pPacket ); diff --git a/Common/EtInterface/EtUIControlProperty.cpp b/Common/EtInterface/EtUIControlProperty.cpp index 70c917fe..8e3c0376 100644 --- a/Common/EtInterface/EtUIControlProperty.cpp +++ b/Common/EtInterface/EtUIControlProperty.cpp @@ -520,13 +520,6 @@ bool SUIControlProperty::Load_12( CStream &stream ) bool SUIControlProperty::Load( CStream &stream ) { - auto n = stream.GetName(); - if (!strcmp(n, "d:\\projects\\cpp\\dragonnest\\build\\client\\resource\\ui\\charcreate\\charselectdlg.ui")) - { - //__debugbreak(); - } - - DWORD dwVersion; stream >> dwVersion; @@ -703,7 +696,7 @@ void SUIControlProperty::Assign( SUIControlProperty *pProperty ) break; case UI_CONTROL_HTMLTEXTBOX: { - // Note : Ŭ TextBox Ӽ ־ Ѵ. + // Note : 惑困 努贰胶牢 TextBox俊 加己阑 持绢拎具 茄促. // TextBoxProperty.bVerticalScrollBar = pProperty->HtmlTextBoxProperty.bVerticalScrollBar; TextBoxProperty.nScrollBarTemplate = pProperty->HtmlTextBoxProperty.nScrollBarTemplate; diff --git a/Common/EtInterface/EtUIDialog.cpp b/Common/EtInterface/EtUIDialog.cpp index 1dca0b1f..142bc2eb 100644 --- a/Common/EtInterface/EtUIDialog.cpp +++ b/Common/EtInterface/EtUIDialog.cpp @@ -46,7 +46,7 @@ void (_stdcall *CEtUIDialog::s_pAutoCursorPtr)( bool bShow ) = NULL; int CEtUIDialog::s_nDialogTextureSize = 0; -// 0.5f ʹ Ŀ , ޴ ĺ̰ ȴ.(#15687 ̽ 0.18 մϴ.) +// 0.5f 로 설정할 경우 오프셋이 너무 커서 좌측,우측 메뉴가 겹쳐보이게 된다.(#15687 이슈때문에 0.18로 수정합니다.) #define UI_DIALOG_SCALE_VALUE 0.18f //#if defined(_DEBUG) || defined(_RDEBUG) @@ -100,7 +100,7 @@ CEtUIDialog::CEtUIDialog( UI_DIALOG_TYPE dialogType, CEtUIDialog *pParentDialog, m_pParentDialog = pParentDialog; if( m_pParentDialog ) { - // Note : θ ڽ Ѵ. + // Note : 부모가 있으면 자식 윈도우로 등록한다. // m_pParentDialog->AddChildDialog( this ); @@ -109,9 +109,9 @@ CEtUIDialog::CEtUIDialog( UI_DIALOG_TYPE dialogType, CEtUIDialog *pParentDialog, m_pParentDialog->AddChildModalDialog( this ); } - // 翬 ̰ ´ ˰ ƴ ϵ ȶ. - // ãƺ, ϵ帮Ʈ ϰ, ϵ MsgProc ó ϰ ̻ Ⱦ . - // ̷ .. + // 당연히 이게 맞는 줄 알고 고쳤더니 차일드들이 안뜬다. + // 찾아보니, 차일드리스트만 렌더링하고, 차일드모달은 MsgProc에서 모달처리만 하고 더이상 안쓰는 것. + // 왜 이렇게 했을까.. //if( dialogType == UI_TYPE_CHILD ) //{ // m_pParentDialog->AddChildDialog( this ); @@ -144,11 +144,11 @@ CEtUIDialog::~CEtUIDialog(void) SAFE_DELETE_PVEC( m_TempControlList ); - // ڿ ϱ淡, Ҹڿ Ϸ ߴ, static ̾α׶ . - // Ҹ ָ Ǵ, ϴ ڽĺ ʴ ϸ ȴ. + // 생성자에서 등록하길래, 소멸자에서 삭제하려고 했더니, 툴팁의 static 다이얼로그때문에 뻑났었다. + // 소멸순서만 잘 맞춰주면 되니, 제일 하단 자식부터 차례대로 삭제하면 된다. if( m_pParentDialog ) { - // θ ڽ 츮Ʈ . + // 부모가 있으면 자식 윈도우리스트에서 제거. m_pParentDialog->DelChildDialog( this ); if( m_emDialogType == UI_TYPE_CHILD_MODAL ) @@ -165,7 +165,7 @@ void CEtUIDialog::OnEndInitialize() void CEtUIDialog::Initialize( bool bShow ) { - // Note : Ʒ Լ ȣǴ ߿ϴ. + // Note : 아래 함수들은 호출되는 순서가 중요하다. // UpdateScreen(); @@ -186,7 +186,7 @@ void CEtUIDialog::Initialize( bool bShow ) void CEtUIDialog::Initialize( const char *pFileName, bool bShow ) { - // Note : Ʒ Լ ȣǴ ߿ϴ. + // Note : 아래 함수들은 호출되는 순서가 중요하다. // UpdateScreen(); @@ -268,7 +268,7 @@ bool CEtUIDialog::Load( CStream &Stream ) break; } - // UI ؽĴ ũ⿡ ΰϰ ؼ 2 ¼ ʴ ī Ȱ ؼ ̷ Ѵ. + // UI쪽 텍스쳐는 크기에 따라 민감하게 반응해서 2의 승수 지원하지 않는 카드랑 똑같이 보여야 해서 이렇게 한다. //CEtTexture::SetPow2( true ); /* if( m_hTexture && m_hTexture->GetRefCount() == 1 ) @@ -383,13 +383,13 @@ void CEtUIDialog::Show( bool bShow ) SetFadeOut(); PopFocusControl(); - // â Ȳ Ʈ ä ִٸ,(ȭ, ۿûâ ҹư) - // SetCapture ReleaseCapture ȣ ʰų, m_bPressed true · ȴٰųؼ - // 콺 ̷ ʰԵȴ. - // ׷ Ʈѵ Ʈѵ ´. + // 창이 닫히는 상황에서 컨트롤을 누른채 있다면,(강화, 제작요청창의 취소버튼) + // SetCapture 후 ReleaseCapture가 호출되지 않거나, m_bPressed가 true인 상태로 유지된다거나해서 + // 툴팁 및 마우스오버 렌더링이 제대로 이뤄지지 않게된다. + // 그래서 컨트롤들을 뒤져서 눌러진 컨트롤들은 원래대로 돌려놓는다. // - // Ȯ Ʈڽ  Ʈ ̾α״ SetPressed Ű ʾҾ. - // ׷, SELFŸ 鼭 ó ʾƵ ȴ. + // 확장형 리스트박스의 아이템으로 들어가는 엘리먼트 다이얼로그는 SetPressed를 적용시키지 않았었다. + // 그러나, SELF타입으로 빠지면서 별도처리를 하지 않아도 된다. if( !IsElementDialog() ) { bool bTooltipControl = false; @@ -403,21 +403,21 @@ void CEtUIDialog::Show( bool bShow ) ReleaseCapture(); } - // m_bPressed Ӹ ƴ϶ m_bMouseEnter ʿϰ Ǿ. - // CEtUIDialog MsgProc WM_MOUSEMOVE ö CEtUIDialog::OnMouseMoveԼ ȣǴµ, - // Լ ڽ ̾α ȿ 콺 Ͱ ReleaseMouseEnterControlԼ ȣѴ. - // Լȣ κ Ȳ ش Ʈ m_bMouseEnter Ǯ ε, - // Ѱ 찡 . - // ٷ, Ʃ丮 ÷Ͻðڽϱ. ޼ڽµ, - // (̰ ϰ ٸ â HideŲ ¿ ޼ڽ.) - // ޼ڽ ƴϿ ̵ ƿ Ǹ鼭 Եȴ. - // ̶ ƹ͵ ̾αװ MsgProc ƿ ȣ ʰԵǰ - // ReleaseMouseEnterControlԼ ѹ ȣ ʾ ƴϿư MouseEnter ƹ ʴ´. - // ׸ CEtUIDialog::s_pMouseEnterControl NULL ϴ DnInterface::FinalizeԼ ȣǸ鼭, - // ƴϿ ư m_bMouseEnter 콺 ƴϿưȿ Դ ʴ ̻ ʰԵȴ. + // m_bPressed 뿐만 아니라 m_bMouseEnter도 필요하게 되었다. + // CEtUIDialog의 MsgProc에서 WM_MOUSEMOVE가 들어올때 CEtUIDialog::OnMouseMove함수가 호출되는데, + // 이 함수를 보면 자신의 다이얼로그 영역안에 마우스 포인터가 없을때 ReleaseMouseEnterControl함수를 호출한다. + // 이 함수호출을 통해 보통 대부분의 상황에서 해당 컨트롤의 m_bMouseEnter가 풀리게 마련인데, + // 딱 한가지 경우가 문제였다. + // 바로, 튜토리얼을 플레이하시겠습니까.라는 메세지박스였는데, + // (이건 유일하게 다른 모든 창을 다 Hide시킨 상태에서 나오는 메세지박스다.) + // 이 메세지박스에서 아니오를 누르면 페이드 아웃이 되면서 마을로 가게된다. + // 이때 아무것도 보여지는 다이얼로그가 없으니 MsgProc가 아예 호출되지 않게되고 이 결과 + // ReleaseMouseEnterControl함수가 한번도 호출되지 않아 아니오버튼의 MouseEnter값을 아무도 변경하지 않는다. + // 그리고나서 CEtUIDialog::s_pMouseEnterControl에 강제로 NULL을 대입하는 DnInterface::Finalize함수 등이 호출되면서, + // 아니오 버튼의 m_bMouseEnter는 직접 마우스가 아니오버튼안에 들어왔다 나가지 않는 이상 변하지 않게된다. // - // غ Show(false)Ǵ ̾α Ʈ MouseEnter trueΰ ü ̻Ѱ Ƽ, - // ⼭ ϱ ϰڴ. + // 생각해보니 Show(false)되는 다이얼로그의 컨트롤의 MouseEnter값이 true인거 자체가 이상한거 같아서, + // 여기서 해제하기로 하겠다. if( m_vecControl[ i ]->IsMouseEnter() ) { m_vecControl[ i ]->MouseEnter(false); @@ -483,9 +483,9 @@ CEtUIControl *CEtUIDialog::GetControl( const char *pszControlName ) } CDebugSet::ToLogFile( "CEtUIDialog::GetControl, %s control not found!", pszControlName ); - // Note : UI Ǵ κ̶ ASSERT() ȣ ʰ assert() ȣѴ. + // Note : UI가 생성되는 부분이라 ASSERT()를 호출하지 않고 assert()를 호출한다. // - //assert(0&&"CEtUIDialog::GetControl, 븦 ҷּ!"); + //assert(0&&"CEtUIDialog::GetControl, 경대를 불러주세요!"); return NULL; } @@ -536,10 +536,10 @@ void CEtUIDialog::DeleteAllControl() focus::ReleaseControl(); } - // ڵ. - // Ȯ Ʈڽ Show( false ) Ǵ ÿ ̾α ڽ Ʈѵ µ, - // ̶ 콺 ־ٸ, Ʒ ƽ ͺ delete Ʈ ǹ. - // ׷ ﶧ Ȯ 쵵 ϰڴ. + // 안정성 코드. + // 확장형 리스트박스의 경우 Show( false )가 되는 동시에 다이얼로그 및 자식 컨트롤들을 지우는데, + // 이때 마우스를 대고 있었다면, 아래 스태틱 포인터변수의 값이 delete된 컨트롤이 되버린다. + // 그래서 지울때 확인 후 지우도록 하겠다. for( int i = 0; i < ( int )m_vecControl.size(); i++ ) { if( s_pMouseEnterControl == m_vecControl[ i ] ) @@ -574,7 +574,7 @@ bool CEtUIDialog::FindControl( std::vector< CEtUIControl* > &vecControl, int nTy iter = m_listChildDialog.rbegin(); for( ; iter != m_listChildDialog.rend(); ++iter ) { - // LastRender˻ 켱 . + // LastRender검사는 우선 생략. pDialog = (*iter); if( !pDialog ) continue; if( (pDialog->GetDialogType() != UI_TYPE_SELF && pDialog->IsElementDialog() == false && pDialog->IsShow()) || @@ -614,8 +614,8 @@ bool CEtUIDialog::FindControl( std::vector< CEtUIControl* > &vecControl, int nTy bool bPushControl = true; if( bCheckCoveredControl ) { - // Ϲ Ʈѷ  ٸ â ִ ȮѴ. - // Ʈڽ Ʈ Ʈ۵鸶 üũϱ⿣ ʹ ˻Ұ ϰ üũ ϴ ̴. + // 일반적인 컨트롤로 생각해 가운데 지점이 다른 창에 가려져있는지 확인한다. + // 리스트박스같은 컨트롤의 경우 리스트아이템들마다 일일이 체크하기엔 너무 검사할게 많아져서 간단하게 체크만 하는 것이다. SUICoord ControlCoord; pControl->GetUICoord( ControlCoord ); ControlCoord.fX = ControlCoord.fX + ControlCoord.fWidth/2.0f; @@ -820,10 +820,10 @@ void CEtUIDialog::PushFocusControl() { focus::PushControl(this); - // ü ̰ ȣߴ... - // ̰Ͷ Ʈ show(true)ɶ Ŀ Ʈڽ ζ ߴµ, - // ϳ dzʼ ӹư Ŀ Ǿ.(Ʈڽ 3, ӹư 4̴.) - // 켱 ̰ ȣ ϱ ϴ, ̻ ߰ߵǸ ׶ ã ϰڴ. + // 도대체 이걸 왜 호출했는지... + // 이것때문에 서버리스트 show(true)될때 포커스를 리스트박스에 두라고 했는데도, + // 하나 다음으로 건너서 접속버튼이 포커스를 가지게 되었다.(리스트박스가 3번, 접속버튼이 4번이다.) + // 우선 이거 호출 안하기로 하니, 이상한 점 발견되면 그때 찾도록 하겠다. //OnCycleFocus( true ); } @@ -873,7 +873,7 @@ void CEtUIDialog::ClearRadioButtonGroup( int nButtonGroup ) void CEtUIDialog::ReloadDlgTexture() { - // UI ؽĴ ũ⿡ ΰϰ ؼ 2 ¼ ʴ ī Ȱ ؼ ̷ Ѵ. + // UI쪽 텍스쳐는 크기에 따라 민감하게 반응해서 2의 승수 지원하지 않는 카드랑 똑같이 보여야 해서 이렇게 한다. //CEtTexture::SetPow2( true ); if( m_hDlgTexture ) s_nDialogTextureSize -= m_hDlgTexture->GetFileSize(); @@ -905,8 +905,8 @@ void CEtUIDialog::UpdateRects() void CEtUIDialog::UpdateFrameRectsEx() { - // Note : ̾α״ ũ ʵ ϱ ؽĸ 9κ  Ѵ. - // ¿,Ʒ Ѵ.  κ þ ν ؾѴ. + // Note : 다이얼로그는 크기 변경시 깨지지 않도록 하기 위해 텍스쳐를 9부분으로 나누어서 랜더한다. + // 좌우,위아래 값은 툴에서 셋팅한다. 가운데 부분은 늘어나기 때문에 디자인시 고려해야한다. // float fFrameLeft = m_DlgInfo.nFrameLeft / ( float )m_hDlgTexture->OriginalWidth(); float fFrameTop = m_DlgInfo.nFrameTop / ( float )m_hDlgTexture->OriginalHeight(); @@ -917,7 +917,7 @@ void CEtUIDialog::UpdateFrameRectsEx() if( fModWidth <= 0.0f || fModHeight <= 0.0f ) { - //ASSERT(0&&"Frame Left+Rightջ Ȥ Top+Bottomջ ؽó ũ⸦ Ѿϴ."); + //ASSERT(0&&"Frame Left+Right합산 혹은 Top+Bottom합산이 원본텍스처 크기를 넘었습니다."); } m_vecDlgFrameElement.resize( 9 ); @@ -1095,7 +1095,7 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { m_hWnd = hWnd; - // Note : ̾αװ ʰų ޼ ڽ ʿ䰡 ٸ return + // Note : 다이얼로그가 보이지 않거나 메세지를 자식 윈도우로 보낼 필요가 없다면 return // if( !m_bShow && !m_bPassMessageToChild && !m_bAcceptInputMsgWhenHide ) { @@ -1104,13 +1104,13 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) else { #ifdef CHECK_DIALOG_CRASH - // ̹ ä . + // 이미 깨진채로 들어오려나. strcpy_s( g_szCurMsgProcDialog, 256, m_strDialogFileName.c_str() ); #endif std::list< CEtUIDialog* >::reverse_iterator iter; - // Note : ְ ̴ ¶ óѴ. + // Note : 모달을 가지고 있고 현재 보이는 상태라면 모달을 처리한다. // if( !m_listChildModalDialog.empty() ) { @@ -1123,16 +1123,16 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { (*iter)->MsgProc( hWnd, uMsg, wParam, lParam ); - // Ƽ̸Էâ CHILD_MODALε, - // Էâ ĵƮ ߹ Է¾ȵǴ Ÿ. - // ڵ尡 MsgProcȣ ٷ return trueϴ ڵ忴µ, - // 󿡴 ⼭ GCS_RESULTSTR Msg Ʈν ȵǼ, - // ܺIME ߰, ĵƮ õ ߹ڰ ܺIMEκ ;ϴµ(wm_char޼) - // ̰ ȿͼ ڰ . + // 파티생성이름입력창이 CHILD_MODAL인데, + // 이 입력창에서만 캔디데이트에서 선택한 중문이 입력안되는 현상이 나타났다. + // 원래 코드가 MsgProc호출 후 바로 return true하는 코드였는데, + // 예상에는 여기서 GCS_RESULTSTR를 가진 Msg가 디폴트프로시저로 전달이 안되서, + // 외부IME에게 가지 못했고, 그 결과 캔디데이트에서 선택된 중문글자가 외부IME로부터 와야하는데(wm_char메세지로) + // 이게 안와서 글자가 안찍혔던 것 같다. // - // ׷ Ʒ s_bRESULTSTR_NotSendComp ĵƮ Ȯ - // ٸ, ش ޼ ʰ, ׳ Ʈν ϰڴ. - // _CH EtInterface ̶ Ѵ. + // 그래서 아래 s_bRESULTSTR_NotSendComp를 사용해 캔디데이트가 떴는지를 확인 후 + // 만약 떳다면, 해당 메세지를 리턴하지 않고, 그냥 흘려보내 디폴트프로시저로 가도록 하겠다. + // _CH는 EtInterface 단이라 사용하지 못한다. if( CEtUIIME::s_bRESULTSTR_NotSendComp == false ) return true; else @@ -1145,7 +1145,7 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) } else { - _ASSERT(0&&"CEtUIDialog::MsgProcԼ Modal-iterator ߿ NULL ֽϴ!"); + _ASSERT(0&&"CEtUIDialog::MsgProc함수 안 Modal-iterator 중에 NULL 있습니다!"); } } } @@ -1155,18 +1155,18 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if( *iter == NULL ) { - _ASSERT(0&&"CEtUIDialog::MsgProcԼ iterator ߿ NULL ֽϴ!"); + _ASSERT(0&&"CEtUIDialog::MsgProc함수 안 iterator 중에 NULL 있습니다!"); continue; } - // ڵ ־ִ , - // IME Child̾α׸ Show(true)ϴ Ͱ ÿ IME Focusó , - // m_hWnd NULLä CEtUIIMEEditBox::Focus ȣǰ ȴ. - // ̶ θڵ鰪 NULL̸鼭 IME-Enableϴ ۵ ʰԵǾ, - // â ݰ ٽ IME Focus ༭ Էؾ߸ ߴ. - // ׷ ̷ ڵ ־ֱ Ѵ. + // 핸들을 직접 넣어주는 이유는, + // IME를 가진 Child다이얼로그를 Show(true)하는 것과 동시에 IME에 Focus처리를 할 경우, + // m_hWnd값이 NULL인채로 CEtUIIMEEditBox::Focus가 호출되게 된다. + // 이때 부모핸들값이 NULL이면서 IME-Enable하는 기능이 제대로 작동하지 않게되어, + // 열었던 창을 닫고 다시 열어 IME에 Focus를 줘서 입력해야만 했다. + // 그래서 이렇게 직접 윈도핸들을 넣어주기로 한다. // - // Child_Modal 쿡 ChildƮ Child_Modal ó ʾƵ ȴ. + // Child_Modal일 경우에도 Child리스트엔 들어있으니 Child_Modal에 대해 따로 처리하지 않아도 된다. (*iter)->SetHWnd( hWnd ); if( (*iter)->MsgProc( hWnd, uMsg, wParam, lParam ) ) { @@ -1183,9 +1183,9 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) } } - // Ϲ ư ¿ â ( â ) ش ư Pressed ° ǹ. - // óҸ  켱 ⼭ óϵ Ѵ. - // ReleaseControl ȣϴ ͺ, Pressed Ѵٴ ϴ° OnReleaseControlԼ ȣϱ Ѵ. + // 일반 버튼을 누른 상태에서 모달창이 열리면(드네 헬프창 같은 경우) 해당 버튼의 Pressed 상태가 계속 유지되버린다. + // 딱히 처리할만한 적당한 곳이 없어서 우선 여기서 처리하도록 한다. + // ReleaseControl을 호출하는 것보단, Pressed를 취소한다던지 등의 절차만 하는게 더 나을 거 같아 OnReleaseControl함수를 호출하기로 한다. if( m_emDialogType == UI_TYPE_MODAL && focus::IsEnable() && focus::GetParent() != this && IsChildDialog( focus::GetParent() ) == false ) focus::OnReleaseControl(); @@ -1248,26 +1248,26 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) int nHotKey = m_vecControl[i]->GetHotKey(); SHORT keyState = GetKeyState( nHotKey ); - // Note : Ű üũؼ ó ʵ Ѵ. - // ٸ ΰ Ű üũ ʴ´. ؾ ҵ... + // Note : 키를 연속으로 누르는 것을 체크해서 처리되지 않도록 한다. + // 하지만 다른 두개의 키를 연속으로 누르면 체크되지 않는다. 수정해야 할듯... // if( keyState&0x80 ) { - // װ ϳ ־ , ƹ ãƺ ߸ ãڴ. - // . - // ڽ ִ â ƯŰ ԷѴ.(, Ƽâ Ƽ̸ Է¿ٰ pŰ Է) - // pŰ 2ȸ Esc ݰ ٽ p ijͽâ Ű ۵ϸ鼭 ͽâ . - // ׷ 3ȸ Esc ݰ ٽ p ٷ ȶ߰ ѹ . - // ̻Ѱ ̰ p Ƚ ɶ ư鼭(0,2,4,6.. , 1,3,5 ѹ ) ° ٲٴ°Ŵ. - // ƹ ãƺ Editbox ư鼭 óѰ °ź, - // Ʒ Űó κ GetKeyState ִ óϴ Ʒ ǽ, - // if( (m_nHotKey != nHotKey) || (m_HotKeyState != keyState) ) m_HotKeyState != keyState 񱳹. - // ׷ٰ ݿͼ ٸ ɷ üϱ⵵ ָ Ȳ̴.. + // 고대 버그가 하나 있었던 거 같은데, 아무리 찾아봐도 잘못된 점을 못찾겠다. + // 재현과정은 다음과 같다. + // 에딧박스 가지고 있는 창을 열어 특정키를 입력한다.(예, 파티생성창을 연후 파티이름 입력에다가 p키를 눌러 입력) + // p키를 2회 누른 후 Esc로 닫고 다시 p를 누르면 캐릭스테이터스창 단축키가 작동하면서 스테이터스창이 열린다. + // 그런데 3회 누른 후 Esc로 닫고 다시 p를 누르면 바로 안뜨고 한번 더 눌러야 뜬다. + // 정말 이상한건 이게 p를 누른 횟수가 증가될때마다 번갈아가면서(0,2,4,6..은 정상, 1,3,5는 한번 더 눌러야 열림) 상태가 바뀐다는거다. + // 아무리 찾아봐도 Editbox에 번갈아가면서 뭔가 처리한게 없는거보면, + // 아래 핫키처리 부분 중 GetKeyState로 상태 얻어와 계속 누르고 있는 거 막는 처리하는 아래가 가장 의심적은데, + // if( (m_nHotKey != nHotKey) || (m_HotKeyState != keyState) ) 중 m_HotKeyState != keyState 비교문. + // 그렇다고 지금와서 다른 걸로 교체하기도 애매한 상황이다.. // - // ó Show-Hideɶ m_HotKeyState ʱȭϴ° ⺻ , θ,ڽĵ ãƼ ٰ ʱȭұ ߴµ, - // Ű ƿ ٸ â ־ ʾҴ. - // ׷.. ¥ ʿ ϴ ϱ Ѵ. + // 처음에는 Show-Hide될때 m_HotKeyState를 초기화하는게 기본적으로 있으니, 부모,자식들을 찾아서 다같이 초기화할까 했는데, + // 단축키로 아예 관계없는 다른 창을 열때가 있어서 이 방법은 통하지 않았다. + // 그래서.. 진짜 필요한 곳에서 강제로 해제하는 방법을 사용하기로 한다. if( (m_nHotKey != nHotKey) || (m_HotKeyState != keyState) ) { m_vecControl[i]->OnHotkey(); @@ -1331,7 +1331,7 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) g_pFocusDialog = this; } - if( IsUsableFocusControl() ) // Focus Control GetControlAtPoint 켱Ѵ.... // (Ʈ TreeCtrl üũڽ ø) by realgaia 091215 + if( IsUsableFocusControl() ) // Focus Control 보다 GetControlAtPoint 를 우선시한다.... // (퀘스트 TreeCtrl 에 체크박스를 올리기위함) by realgaia 091215 { if( focus::HandleMouse( uMsg, fMouseX, fMouseY, wParam, lParam ) ) { @@ -1347,7 +1347,7 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) return true; } else { - //if( IsUsableFocusControl() ) // Focus Control GetControlAtPoint óѴ.... by realgaia 091215 + //if( IsUsableFocusControl() ) // Focus Control 을 GetControlAtPoint 다음에 처리한다.... by realgaia 091215 //{ // if( focus::HandleMouse( uMsg, fMouseX, fMouseY, wParam, lParam ) ) // { @@ -1369,8 +1369,8 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) if( IsMouseInDlg() && !GetCapture() ) { - // Note : â ̺Ʈ ߻ â ޼ - // ʴ´. â ߿ϴ. + // Note : 앞쪽 창에 이벤트 발생시 뒤쪽창으로 메세지 전달을 + // 하지 않는다. 창의 순서가 중요하다. // return true; } @@ -1378,10 +1378,10 @@ bool CEtUIDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) #ifdef MOUSEOVER_CONTROL_OUTSIDE_DLG else { - // 콺 ߿ óǴ Ʈ ִٸ, - // (ؽó Ʈ ϱ ߴ. 2 ¼ ߴ Ͷ ̾α ° . - // ׸ Ϸ, GetControlAtPoint Լ pControl ؽóƮ ˻ؾϴµ, - // ̷Ա ϴ° ΰ Ƽ 켱 ׳ Ʒó óϱ ϰڴ.) + // 마우스무브 중에 처리되는 컨트롤이 있다면, + // (텍스처 컨트롤은 제외하기로 했다. 2의 승수 맞추는 것때문에 다이얼로그 영역 벗어나는게 많기 때문에. + // 그리고 제대로 하려면, GetControlAtPoint 이 함수로 pControl얻을때부터 텍스처컨트롤 빼고 검사해야하는데, + // 이렇게까지 하는건 좀 오버인거 같아서 우선은 그냥 아래처럼 처리하기로 하겠다.) if( uMsg == WM_MOUSEMOVE && pControl && pControl->GetProperty()->UIType != UI_CONTROL_TEXTURECONTROL ) return true; } @@ -1405,7 +1405,7 @@ bool CEtUIDialog::OnMouseMove( float fX, float fY ) { m_bMouseInDialog = true; - // Note : 콺 Ʈ ġ Ʈ ´. + // Note : 마우스 포인트에 위치한 컨트롤을 얻는다. // CEtUIControl *pControl = GetControlAtPoint( m_fMouseX, m_fMouseY ); if( pControl == NULL ) @@ -1471,7 +1471,7 @@ void CEtUIDialog::ProcessCommand( UINT nCommand, bool bTriggeredByUser, CEtUICon { if( m_pCallback ) { - // ε 극ũ ⼭ ũ..m_pCallBack ̹ . + // 로딩시 브레이크시 여기서 크래쉬..m_pCallBack 이미 지워짐. m_pCallback->OnUICallbackProc( m_nDialogID, nCommand, pControl, uMsg ); } } @@ -1501,7 +1501,7 @@ void CEtUIDialog::Process( float fElapsedTime ) { if( *iter == NULL ) { - _ASSERT(0&&"CEtUIDialog::ProcessԼ iterator ߿ NULL ֽϴ!"); + _ASSERT(0&&"CEtUIDialog::Process함수 안 iterator 중에 NULL 있습니다!"); continue; } @@ -1568,8 +1568,8 @@ void CEtUIDialog::FreeDialogTexture() void CEtUIDialog::LoadDialogTexture() { if( m_bLoadedTexture ) return; - // ø ؽó 鼭 ʿ. ڵ ĥ ʿ ̰ ּóϸ . - // ҽ ȭ Ŀ ؾ߰ڴ. + // 템플릿 텍스처 쓰면서 이제 필요없다. 코드는 다 고칠 필요없이 이거 한줄 주석처리하면 끝. + // 소스 정리는 안정화된 후에 해야겠다. //m_hTexture = LoadResource( m_DlgInfo.szUITexturename, RT_TEXTURE, true ); if( m_hTexture && m_hTexture->GetRefCount() == 1 ) s_nDialogTextureSize += m_hTexture->GetFileSize(); @@ -1665,11 +1665,11 @@ void CEtUIDialog::Render( float fElapsedTime ) DrawRect( DlgCoord, m_renderDlgColor.dwCurrentColor ); } - // Note : Ҷ ^^ + // Note : 디버깅 할때 쓰세요^^ // // DrawRect( DlgCoord, EtInterface::debug::BLUE ); - // Note : ڽ Ʈѵ Ѵ. + // Note : 자신의 컨트롤들을 랜더한다. // CEtUIControl *pControl(NULL); int nVecCtlSize = ( int )m_vecControl.size(); @@ -1680,7 +1680,7 @@ void CEtUIDialog::Render( float fElapsedTime ) pControl->Render( fElapsedTime ); } - // ڽ Ѵ. + // 자식 윈도우들을 랜더한다. // bool bRenderMostFocusDlg = false; std::list::iterator iter = m_listChildDialog.begin(); @@ -1688,7 +1688,7 @@ void CEtUIDialog::Render( float fElapsedTime ) { if( *iter == NULL ) { - //_ASSERT(0&&"CEtUIDialog::RenderԼ iterator ߿ NULL ֽϴ!"); + //_ASSERT(0&&"CEtUIDialog::Render함수 안 iterator 중에 NULL 있습니다!"); continue; } (*iter)->Render( fElapsedTime ); @@ -1899,7 +1899,7 @@ void CEtUIDialog::ProcessChangeResolution() for each( CEtUIDialog *pDialog in s_plistDialogModal ) pDialog->OnChangeResolution(); for each( CEtUIDialog *pDialog in s_plistDialogMostTop ) pDialog->OnChangeResolution(); - // Self ִ° ´° .(Self dz̾αϸ鼭 ִ° ´ ..) + // Self라도 해주는게 맞는거 같다.(Self로 만든 말풍선다이얼로그하면서 해주는게 맞는 듯..) for each( CEtUIDialog *pDialog in s_plistDialogSelf ) pDialog->OnChangeResolution(); } @@ -1997,10 +1997,10 @@ void CEtUIDialog::GetScreenMouseMovePoints( float &fMouseX, float &fMouseY ) void CEtUIDialog::UpdateScreen() { - // ̷ óұ ߴµ, ũ ΰ ɸ. - // ϳ Ʈ ó, ϳ ũѹٰ · ̴. - // ΰ ó ϴ. - // from blondy ׳ ׷ ͵鿡 ó ̽ ̽ ؾ ɵ + // 이런 방법으로 처리할까 했는데, 크게 두가지가 걸린다. + // 하나는 폰트 처리고, 하나는 스크롤바같이 서브형태로 가지는 것이다. + // 이 두가지에 대한 처리가 끝나야 제대로 사용할 수 있을 듯 하다. + // from blondy 그냥 그런 것들에 대한 처리를 케이스 바이 케이스로 해야 될듯 if( m_DlgInfo.bLockScalingByResolution ) { @@ -2023,7 +2023,7 @@ void CEtUIDialog::UpdateScreen() //if( (fWidth/fHeight) >= DEFAULT_UI_SCREEN_RATIO ) //{ - // // Note : ȭ ⺻ 4:3 ũٸ ̵ Ѵ. + // // Note : 화면 비율이 기본 4:3 비율보다 크다면 와이드로 적용한다. // // // m_fScreenWidth = fHeight * DEFAULT_UI_SCREEN_RATIO * s_fDialogScale; //} @@ -2049,7 +2049,7 @@ void CEtUIDialog::CalcDialogScaleByResolution( int nWidth, int nHeight ) s_fDialogScaleValueHori = 0.0f; } - // ػ ٲ UISize ٽ óؾѴ. + // 해상도 바뀌면 UISize 다시 처리해야한다. SetDialogSize( s_nUISize, nWidth, nHeight ); } @@ -2128,17 +2128,17 @@ void CEtUIDialog::ShowChildDialog( std::list &listDialog, CEtUIDia { pChildDialog = (*iter); listDialog.erase( iter ); - break; // Note : ڽ ̵ ϴٰ Ѵ. + break; // Note : 자식 윈도우의 아이디는 유일하다고 가정한다. } } - // Note : ڽ ShowҶ Ʈ ٲش. - // ᱹ ޼ ó ٲ. + // Note : 자식 윈도우들은 Show할때 리스트에서 순서를 바꿔준다. + // 결국 랜더와 메세지 처리 순서가 바뀐다. // if( pChildDialog ) { - // content ̾αװ ųƮó Է ޽ ̾α׿ ʱ - // CEtUIDialog::ShowChildDialog() Լ ȣ ÿ üũؼ Ŀ óÿ ڿ մϴ. + // content 다이얼로그가 스킬트리처럼 겹쳐있으면 입력 메시지가 작은 다이얼로그에 오지 않기 때문에 + // CEtUIDialog::ShowChildDialog() 함수 호출 시에 체크해서 포커싱 처리시에 가장 뒤에 오도록 셋팅합니다. vector vlpContentDialogs; pChildDialog->GetContentDialog( vlpContentDialogs ); if( false == vlpContentDialogs.empty() ) @@ -2153,8 +2153,8 @@ void CEtUIDialog::ShowChildDialog( std::list &listDialog, CEtUIDia } } - // ޽ Ųٷ ǹǷ Ŀ Ǵ 쿣 ڷ, - // 쿣 Ű ̾α ٷ ڷ. + // 메시지 전달은 거꾸로 되므로 포커싱 되는 경우엔 맨 뒤로, + // 숨겨지는 경우엔 맨 앞으로 옮겨지는 메인 다이얼로그의 바로 뒤로. if( bShow ) { listDialog.push_back( pChildDialog ); @@ -2266,9 +2266,9 @@ void CEtUIDialog::DownDialogSize() void CEtUIDialog::CalcDialogScaleValue( int nWidth, int nHeight ) { - // Ʈػ󵵺 ػ ڲ ϷѴ. - // ׷ ̷ Ʈػ󵵺 ػ UISize Ұϵ - // ⺻ ״ Ѵ. + // 디폴트해상도보다 작은 해상도 자꾸 지원하려한다. + // 그래서 이렇게 디폴트해상도보다 작은 해상도 오면 별도의 UISize조절이 불가능하도록 + // 계산된 기본 스케일 그대로 사용한다. if( nWidth < DEFAULT_UI_SCREEN_WIDTH || nHeight < DEFAULT_UI_SCREEN_HEIGHT ) { s_fMaxDialogScale = s_fDialogScale; @@ -2289,11 +2289,11 @@ void CEtUIDialog::CalcDialogScaleValue( int nWidth, int nHeight ) s_fMinDialogScale = 2.0f - s_fMaxDialogScale; s_fDialogScaleValueVert = (s_fMaxDialogScale - 1.0f) / 2.0f; - // ʹ ۾ . + // 너무 작아지게 하지 말자. s_fMinDialogScale = (s_fMinDialogScale + 3.0f) / 4.0f; } -// ִȭư ػ󵵸 ڷ ʿ Ѵ. +// 윈도우의 최대화버튼때문에 해상도를 인자로 필요로 한다. void CEtUIDialog::SetDialogSize( int nStep, int nWidth, int nHeight ) { if( nStep < 1 || nStep > 4 ) @@ -2305,8 +2305,8 @@ void CEtUIDialog::SetDialogSize( int nStep, int nWidth, int nHeight ) nHeight = GetEtDevice()->Height(); } - // ̾α ϴ° ϵ ־ ̷ óؾѴ. - // 㿡 ѹ ؾϴ..ؾ߰ڴ. + // 다이얼로그 사이즈 계산하는게 하도 흩어져있어서 이렇게 일일이 다 처리해야한다. + // 담에 한번 싹 정리를 해야하던지..해야겠다. static int s_nWidthInFunc = -1; static int s_nHeightInFunc = -1; if( s_nWidthInFunc == nWidth && s_nHeightInFunc == nHeight && s_nUISize == nStep ) @@ -2314,7 +2314,7 @@ void CEtUIDialog::SetDialogSize( int nStep, int nWidth, int nHeight ) s_nWidthInFunc = nWidth; s_nHeightInFunc = nHeight; - // ذ . + // 기준값 재계산. float fHR = float(nHeight) / DEFAULT_UI_SCREEN_HEIGHT; float fWR = float(nWidth) / DEFAULT_UI_SCREEN_WIDTH; @@ -2365,7 +2365,7 @@ void CEtUIDialog::SetDialogSize( int nStep, int nWidth, int nHeight ) } } - // Ʈ ũκ ϴ Ʈѵ ֱ⶧ Ʈ Ŵ ϰ ProcessChangeResolution ȣؾѴ. + // 폰트 크기로부터 영역을 구하는 컨트롤들이 있기때문에 폰트 매니저 먼저 리셋하고 ProcessChangeResolution를 호출해야한다. if( CEtFontMng::IsActive() ) { CEtFontMng::GetInstance().OnLostDevice(); CEtFontMng::GetInstance().OnResetDevice(); @@ -2392,14 +2392,14 @@ void CEtUIDialog::SetMouseEnterControl( CEtUIControl *pControl ) ReleaseMouseEnterControl(); - // Note : ο Ʈ ϰ ǥѴ. + // Note : 새로운 컨트롤을 등록하고 툴팁을 표시한다. // s_pMouseEnterControl = pControl; s_pMouseEnterControl->MouseEnter( true ); if( drag::IsValid() ) { - // Note : 巡 Ǵ ǥ ʴ´. + // Note : 드래그 되는 아이템이 있으면 툴팁은 표시하지 않는다. // return; } @@ -2465,7 +2465,7 @@ void CEtUIDialog::MakeStringWithEllipsis(SUIElement* pElement, float lineWidth, if( sTextCoord.fHeight < (height - fTextCoordHeight) ) { - // ؽƮ ٿ ٸ... + // 텍스트가 다음줄에 계속 찍힌다면... if( sSubTextCoord.fWidth > width ) { nStartPos += i-1; @@ -2475,7 +2475,7 @@ void CEtUIDialog::MakeStringWithEllipsis(SUIElement* pElement, float lineWidth, } else { - // ˻Ѵ. + // 마지막 라인을 검사한다. if( sSubTextCoord.fWidth > fRemainWidth ) { i--; diff --git a/Common/EtInterface/EtUIDialog.h b/Common/EtInterface/EtUIDialog.h index 3bc96024..6acb9b8a 100644 --- a/Common/EtInterface/EtUIDialog.h +++ b/Common/EtInterface/EtUIDialog.h @@ -57,7 +57,7 @@ public: protected: bool m_bShow; - bool m_bAcceptInputMsgWhenHide; // show ´ ƴϴ ޽ ְ ִ ÷. ִ ̾α׸ hide Ű ϴ ųƮ ޽ óϱ . + bool m_bAcceptInputMsgWhenHide; // show 상태던 아니던 메시지를 받을 수 있게 해주는 플래그. 엮여있는 다이얼로그를 hide 시키고 따로 렌더링하는 스킬트리에서 메시지 처리하기 위해 사용함. HWND m_hWnd; std::vector< CEtUIControl * > m_vecControl; std::vector< CEtUITemplate * > m_vecUITemplate; @@ -81,7 +81,7 @@ protected: float m_fScreenHeightRatio; float m_fScreenHeightBorder; - std::string m_strCmdControlName; // Note : ProcessCommandȿ Ʈ ̸ + std::string m_strCmdControlName; // Note : ProcessCommand안에서 사용될 컨트롤 이름 SUIColorEx m_renderDlgColor; bool m_bFadeOut; @@ -95,9 +95,9 @@ protected: SHORT m_HotKeyState; int m_nHotKey; - CEtUIDialog *m_pParentDialog; // Note : ڽ θ . - std::list m_listChildDialog; // Note : ڽ . - std::list m_listChildModalDialog; // Note : ڽε ޷ . + CEtUIDialog *m_pParentDialog; // Note : 자신의 부모 윈도우. + std::list m_listChildDialog; // Note : 자식 윈도우들. + std::list m_listChildModalDialog; // Note : 자식인데 모달로 생성된 윈도우들. std::string m_strDialogFileName; SUICoord m_BaseDlgCoord; @@ -107,7 +107,7 @@ protected: bool m_bAutoCursor; bool m_bCursor; - // Ʈڽ ̳, Ʈ Ϲ ̾α׿ üũ صӴϴ. + // 리스트박스 아이템이나, 엘리먼트 아이템일 경우 일반 다이얼로그와 구분을 위해 체크를 해둡니다. bool m_bElementDialog; bool m_bElementDialogShowState; @@ -115,13 +115,13 @@ protected: std::vector< std::pair > m_vecChildRenderPriorityInfo; public: - // ϴ̾α ϶ Ʈڽ ij ȸ´ ߻߽ϴ. - // ¿ ִ ٸ ּ. + // 마켓다이얼로그의 강제스케일때문에 에디트박스 캐럿이 안맞는 문제가 발생했습니다. + // 어쩔 수 없는 경우 빼고는 최대한 다른 곳에서는 사용하지 말아주세요. // - // , - // FontMng ʾ 콺 巡 ó Ѵ. - // ̾α(,κ,) ϴ ̶ s_fDialogScale ǵ帮° . - // ̹Ƿ, s_fDialogScale ٲٴ ϰ Ǿϴ. + // 기존의 강제스케일 방식의 단점은, + // FontMng와 연동되지 않아 마우스 드래그 및 렌더링에 별도처리를 해줘야한다. + // 어차피 보여질 다이얼로그(마켓,인벤,툴팁)에 대해 스케일을 셋팅하는 방식이라면 s_fDialogScale을 건드리는게 낫다. + // 이므로, s_fDialogScale값을 강제로 바꾸는 방식으로 변경하게 되었습니다. static void SetForceDialogScale( float fScale ); public: @@ -129,9 +129,9 @@ public: static float s_fScreenMouseY; protected: - // Note : Ʒ õ ƽ . ѹ ϳ µǴ ̴. - // ̷ ѵ ϴ. ߿ ƽ ƴ϶ ̾α׸ - // Լ ° ڴ. + // Note : 아래는 툴팁에 관련된 스태틱 변수들. 지금은 툴팁이 한번에 하나만 출력되는 구조이다. + // 하지만 이런 구조는 별로 유연하지 못한듯 하다. 나중에는 스태틱이 아니라 다이얼로그마다 + // 이 변수들과 함수를 가지는게 좋겠다. // static int s_nTooltipStringIndex; static std::wstring s_strTooltipString; @@ -158,7 +158,7 @@ public: static void SetMouseEnterControl( CEtUIControl *pControl ); static void SetAutoCursorCallback( void (_stdcall *pFunc)( bool bShow ) ) { s_pAutoCursorPtr = pFunc; } - // FadeForBlow UI ¿ ؾѴٰ Ѵ. Ҽ . + // FadeForBlow는 UI숨긴 상태에서로 렌더해야한다고 한다. 할수없이 상위단으로 뺀다. static CEtUIDialog *s_pFadeDlg; public: @@ -168,12 +168,12 @@ public: void RefreshChildRenderPriority(); protected: - // EtUIListBoxEx ڽ ̾α׸ ߰ , - // ƿ ڽĴ̾α׸ Լü . - // ׷ EtUIListBoxEx ڽ ̾α׷ óϷ Ҷ ߰ Լ. - // (δ ڽ ̾α׷ ó ʱ⶧ ʴ´.) + // EtUIListBoxEx가 나오기전까지는 자식 다이얼로그를 중간에 지운적이 없어서인지, + // 아예 자식다이얼로그를 지우는 함수자체가 없었다. + // 그러다 EtUIListBoxEx의 아이템을 자식 다이얼로그로 처리하려 할때 추가한 함수다. + // (실제로는 자식 다이얼로그로 처리하지 않기때문에 사용하지는 않는다.) // - // EtUIDialog Ҹڿ ڽ ɶ θ𿡰 Ʈ 뵵 ȴ. + // 현재는 EtUIDialog의 소멸자에서 자신이 삭제될때 부모에게 리스트에서 빼라는 용도로 사용된다. void DelChildDialog( CEtUIDialog *pDialog ); void DelChildModalDialog( CEtUIDialog *pDialog ); @@ -183,7 +183,7 @@ public: CEtUIDialog* GetParentDialog() { return m_pParentDialog; } public: - // Note : ڽ Show() Ҷ Show() ȣ ʰ Ʒ Լ ȣѴ. + // Note : 자식 윈도우의 Show()를 할때는 그 윈도우의 Show()를 호출하지 않고 아래 함수를 호출한다. // void ShowChildDialog( CEtUIDialog *pDialog, bool bShow ); @@ -209,7 +209,7 @@ public: static void DownDialogSize(); static void CalcDialogScaleValue( int nWidth = 0, int nHeight = 0 ); - // ػ󵵿 ϰ ϱ. + // 해상도에 따른 스케일값 구해 적용하기. static void CalcDialogScaleByResolution( int nWidth, int nHeight ); static void SetDialogSize( int nStep, int nWidth = 0, int nHeight = 0 ); @@ -232,20 +232,20 @@ public: m_renderDlgColor.dwCurrentColor = dwColor; } void SetSoundEnable( bool bEnable ) { m_DlgInfo.bSound = bEnable; } - // Note : θ 찡 ʾƵ ڽ ޼ν  Ѵ. - // äâ äâ Ⱥ϶ 콺 Ŭ äâ Ŀ ϱ . + // Note : 부모 윈도우가 보이지 않아도 자식의 메세지프로시져에 들어가도록 한다. + // 예를 들면 채팅창에서 채팅창이 안보일때 마우스 클릭으로 채팅창에 포커스가 가도록 하기 위해 쓰였다. // void SetPassMessageToChild( bool bPass ) { m_bPassMessageToChild = bPass; } void SetShowModal( bool bShowModal ) { m_bShowModal = bShowModal; } void SetElementDialog( bool bElement ) { m_bElementDialog = bElement; } bool IsElementDialog() { return m_bElementDialog; } - // ElementDialog 쿣 UI_TYPE_SELF ؼ MsgProc RenderǴ 찡 ⶧ - // ִ ̾α IsShowԼ ˻ . ̶ ؼ ۿ . + // ElementDialog의 경우엔 보통 UI_TYPE_SELF로 생성해서 직접 MsgProc및 Render되는 경우가 많기때문에 + // 현재 보여지고 있는 다이얼로그인지를 IsShow함수로 검사할 수 없을때가 많다. 이땐 직접 설정해서 얻어오는 수밖에 없다. virtual void SetElementDialogShowState( bool bShow ) { m_bElementDialogShowState = bShow; } bool IsShowElementDialog() { return m_bElementDialogShowState; } - // Ű׶ ¿ Լ. + // 핫키버그때문에 어쩔 수 없이 만든 함수. void SetHotKeyState( SHORT HotKeyState ) { m_HotKeyState = HotKeyState; } bool IsCmdControl( const char *szCmdCtlName ); @@ -291,9 +291,9 @@ public: void ReloadDlgTexture(); void DeleteDlgTexture(); - // Note : ⺻ Ʈ ػ󵵴 1024x768. - // Border ũ ũ⿡ Ʈ ũ ũ⸦ κ Դϴ. - // Ratio Ʈ ũ ũ ũ Դϴ. + // Note : 게임의 기본 디폴트 해상도는 1024x768. + // Border는 현재 스크린의 크기에서 디폴트 스크린의 크기를 뺀 부분의 사이즈입니다. + // Ratio는 디폴트 크기와 현재 스크린의 크기의 비율입니다. // float GetScreenWidth() { return m_fScreenWidth; } float GetScreenWidthBorderSize() { return m_fScreenWidthBorder; } @@ -339,7 +339,7 @@ public: EtTextureHandle GetUITexture() { return m_hTexture; } void SetUITexture( EtTextureHandle hTexture ) { SAFE_RELEASE_SPTR( m_hTexture ); m_hTexture = hTexture; } - // Note : Ŭ Ÿ Ʈ Ʈ ȯѴ. + // Note : 같은 클래스 타입의 컨트롤 리스트를 반환한다. // ex) std::vector vector // template < typename T > void GetGontrolList( std::vector< T* > &vecControl ); @@ -384,7 +384,7 @@ public: void MakeStringWithEllipsis(SUIElement* pElement, float lineWidth, std::wstring& text, const std::wstring& symbol); #endif - // Note : Ʒ Լ UITool δ. + // Note : 아래 함수들은 UITool에서 쓰인다. // void ShowAllControl( bool bShow ); void EnableAllControl( bool bEnable ); @@ -412,9 +412,9 @@ public: virtual void UpdateDlgCoord( float fX, float fY, float fWidth, float fHeight ); virtual void UpdateRects(); virtual void OnCloseCompletely() {} - // ųƮ . ̾α ͸ . - // content ̾αװ ųƮó Է ޽ ̾α׿ ʱ - // CEtUIDialog::ShowChildDialog() Լ ȣ ÿ üũؼ Ŀ óÿ ڿ մϴ. + // 스킬트리에서 사용함. 형제 다이얼로그의 포인터를 리턴. + // content 다이얼로그가 스킬트리처럼 겹쳐있으면 입력 메시지가 작은 다이얼로그에 오지 않기 때문에 + // CEtUIDialog::ShowChildDialog() 함수 호출 시에 체크해서 포커싱 처리시에 가장 뒤에 오도록 셋팅합니다. virtual void GetContentDialog( /*IN OUT*/ std::vector& vlpContentDialogs ) {}; virtual void OnChangeResolution(); @@ -442,7 +442,7 @@ void CEtUIDialog::GetGontrolList( std::vector< T* > &vecControl ) #define CONTROL( cls, name ) _GC(#name) #define DN_CONTROL( cls, name ) _GC(#name) -// ȭ +// 최적화 버전 template < typename T > T* CEtUIDialog::_GC( const char *pszControlName ) { @@ -452,7 +452,7 @@ T* CEtUIDialog::_GC( const char *pszControlName ) } bool bExistControl = false; T *pResult = GetControl( pszControlName, &bExistControl); - if( bExistControl ) { // ʴ 쿣 ޼ ֵ Ѵ.. + if( bExistControl ) { // 존재하지 않는 경우엔 계속 경고메세지가 떠서 알 수 있도록 한다.. m_cachedControls[ pszControlName ] = (CEtUIDialog*)pResult; } else { @@ -472,10 +472,10 @@ T* CEtUIDialog::GetControl( const char *pszControlName, bool *pExistControl ) { if( strcmp( pszControlName, m_vecControl[ i ]->GetControlName() ) == 0 ) { -#if defined(_DEBUG) || defined(_RDEBUG) // Ȥ Ǽ ÿ Ÿüũ ش. +#if defined(_DEBUG) || defined(_RDEBUG) // 혹시 모를 실수에 대비해 디버깅 시에만 타입체크를 해준다. T* pResult = dynamic_cast(m_vecControl[ i ]); if( !pResult ) { - ASSERT( 0 && "UI Control ij !!"); + ASSERT( 0 && "UI Control 캐스팅 실패!!"); T* pTempControl = new T( 0 ); m_TempControlList.push_back( pTempControl ); if( pExistControl ) *pExistControl = false; @@ -490,13 +490,13 @@ T* CEtUIDialog::GetControl( const char *pszControlName, bool *pExistControl ) } //#if defined(_DEBUG) || defined(_RDEBUG) - //assert( 0 && "UI Control ã ϴ! ڼ EtUIDialog.h 374"); + //assert( 0 && "UI Control 을 찾을 수 없습니다! 자세한 정보는 EtUIDialog.h의 374라인으로"); char szFileName[256]; _GetFullFileName(szFileName, _countof(szFileName), m_strDialogFileName.c_str()); - OutputDebug(" [UI Error] \"%s\" %s Control ã ϴ!\n", szFileName, pszControlName); + OutputDebug(" [UI Error] \"%s\" 파일의 %s Control 을 찾을 수 없습니다!\n", szFileName, pszControlName); //#endif - // Ͽ Ҷ ѹ Ѱ dzʶٰ ϱ , string ʿ ־ΰ . + // 파일에 출력할때는 한번 출력한거 건너뛰게 하기 위해, string 맵에 넣어두고 없을때만 출력. if( s_bUITest ) { std::string szKey = szFileName; @@ -508,13 +508,13 @@ T* CEtUIDialog::GetControl( const char *pszControlName, bool *pExistControl ) { FILE *fp = NULL; fopen_s( &fp, "uitest.txt", "at" ); - fprintf_s( fp, "[UI Error] \"%s\" %s Control ã ϴ!\n", szFileName, pszControlName ); + fprintf_s( fp, "[UI Error] \"%s\" 파일의 %s Control 을 찾을 수 없습니다!\n", szFileName, pszControlName ); fclose( fp ); s_mapUITest.insert( make_pair( szKey, 1 ) ); } } - // Ʈ  ʴ´. .. + // 컨트롤이 없어도 뻑은 나지 않는다. 대신 동작은 제대로 하지 않음.. for( DWORD i=0; iGetControlName(), pszControlName ) == NULL ) return static_cast(m_TempControlList[i]); } diff --git a/GameCommon/DNNotifierCommon.h b/GameCommon/DNNotifierCommon.h index 675c7691..da2bd078 100644 --- a/GameCommon/DNNotifierCommon.h +++ b/GameCommon/DNNotifierCommon.h @@ -4,7 +4,7 @@ namespace DNNotifier { - // ˸ Ÿ + // 알림이 타입 struct Type { enum eType @@ -30,7 +30,7 @@ namespace DNNotifier }; }; - // ִ + // 최대 등록 개수 struct RegisterCount { enum eRegisterCount @@ -112,7 +112,7 @@ namespace DNNotifier bool RegisterMainQuest( const int iIndex ) { - // ߺ˻ + // 중복검사 if( data[0].IsEqual( Type::MainQuest, iIndex ) ) return false; return data[0].Register( Type::MainQuest, iIndex ); @@ -123,7 +123,7 @@ namespace DNNotifier if( iSlotIndex < RegisterCount::MainQuest || iSlotIndex >= RegisterCount::TotalQuest ) return false; - // ߺ˻ + // 중복검사 if( data[iSlotIndex].IsEqual( Type::SubQuest, iIndex ) ) return false; return data[iSlotIndex].Register( Type::SubQuest, iIndex ); @@ -135,7 +135,7 @@ namespace DNNotifier if( iSlotIndex < RegisterCount::TotalQuest -1 || iSlotIndex >= RegisterCount::Total ) return false; - // ߺ˻ + // 중복검사 if( data[iSlotIndex].IsEqual( eType, iIndex ) ) return false; return data[iSlotIndex].Register( eType, iIndex ); @@ -144,7 +144,7 @@ namespace DNNotifier bool RegisterDailyMission( const int iIndex ) { Data* pData = &data[ RegisterCount::TotalQuest ]; - // ߺ˻ + // 중복검사 if( pData->IsEqual( Type::DailyMission, iIndex ) ) return false; return pData->Register( Type::DailyMission, iIndex ); @@ -153,7 +153,7 @@ namespace DNNotifier bool RegisterWeeklyMission( const int iIndex ) { Data* pData = &data[ RegisterCount::TotalQuest + RegisterCount::DailyMission ]; - // ߺ˻ + // 중복검사 if( pData->IsEqual( Type::WeeklyMission, iIndex ) ) return false; return pData->Register( Type::WeeklyMission, iIndex );