This commit is contained in:
Cussrro 2024-12-20 15:10:08 +08:00
parent aac89f44fc
commit bc5361a42e
6 changed files with 205 additions and 212 deletions

View file

@ -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)될때 포커스를 리스트박스에 두라고 했는데도,
// 하나 다음으로 건너서 접속버튼이 포커스를 가지게 되었다.(리스트박스가 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를 누르면 캐릭스테이터스창 단축키가 작동하면서 스테이터스창이 열린다.
// 그런데 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<CEtUIDialog*>::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로 만든 말풍선다이얼로그하면서 해주는게 맞는 듯..)
// 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<CEtUIDialog*> &listDialog, CEtUIDia
{
pChildDialog = (*iter);
listDialog.erase( iter );
break; // Note : 자식 윈도우의 아이디는 유일하다고 가정한다.
break; // Note : 자식 윈도우의 아이디는 유일하다고 가정한다.
}
}
// Note : 자식 윈도우들은 Show할때 리스트에서 순서를 바꿔준다.
// 결국 랜더와 메세지 처리 순서가 바뀐다.
// Note : 자식 윈도우들은 Show할때 리스트에서 순서를 바꿔준다.
// 결국 랜더와 메세지 처리 순서가 바뀐다.
//
if( pChildDialog )
{
// content 다이얼로그가 스킬트리처럼 겹쳐있으면 입력 메시지가 작은 다이얼로그에 오지 않기 때문에
// CEtUIDialog::ShowChildDialog() 함수 호출 시에 체크해서 포커싱 처리시에 가장 뒤에 오도록 셋팅합니다.
// content 다이얼로그가 스킬트리처럼 겹쳐있으면 입력 메시지가 작은 다이얼로그에 오지 않기 때문에
// CEtUIDialog::ShowChildDialog() 함수 호출 시에 체크해서 포커싱 처리시에 가장 뒤에 오도록 셋팅합니다.
vector<CEtUIDialog*> vlpContentDialogs;
pChildDialog->GetContentDialog( vlpContentDialogs );
if( false == vlpContentDialogs.empty() )
@ -2153,8 +2153,8 @@ void CEtUIDialog::ShowChildDialog( std::list<CEtUIDialog*> &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--;