Files
Leviathan/Client/Game/engine/Ui/KUIWndManager.h
T
2026-06-01 12:46:52 +02:00

278 lines
7.5 KiB
C++

#pragma once
#include <list>
//#include <vector>
#include "KObject.h"
#include "K3DTypes.h"
namespace
{
enum KMSGBOXTIMER
{
KMB_DEFAULT_TIMER = 15000,
};
enum KMSGBOXTYPE
{
KMB_OK = MB_OK,
KMB_OKCANCEL = MB_OKCANCEL,
KMB_YESNO = MB_YESNO,
KMB_YESNOCANCEL = MB_YESNOCANCEL,
KMB_ABORTRETRYIGNORE = MB_ABORTRETRYIGNORE,
KMB_RETRYCANCEL = MB_RETRYCANCEL,
KMB_NO,
};
enum KMSGBOXMSG
{
KMB_OK_MSG = 0,
KMB_CANCEL_MSG = 1,
KMB_YES_MSG = 2,
KMB_NO_MSG = 3,
KMB_ABORT_MSG = 4,
KMB_RETRY_MSG = 5,
KMB_IGNORE_MSG = 6,
KMB_MAX_MSG_NUMBER,
};
}
struct MSGBOX_BTN_INFO_ITEM
{
MSGBOX_BTN_INFO_ITEM(bool _bUseSprCaption, LPCSTR _lpszID, LPCSTR _lpszCaption, DWORD _dwWidth )
: bUseSprCaption( _bUseSprCaption), sID(_lpszID),sCaption(_lpszCaption), dwWidth( _dwWidth )
{
}
std::string sID;
bool bUseSprCaption;
std::string sCaption;
DWORD dwWidth;
};
class KMsgBoxBtnInfo
{
public:
void SetDefaultItemIndex( int nIndex)
{
m_nDefaultItemIndex = nIndex;
}
int GetDefaultItemIndex() const
{
return m_nDefaultItemIndex;
}
void AddBtn(bool bUseSprCaption, LPCSTR lpszID, LPCSTR lpszCaption, DWORD dwWidth = 0)
{
AddBtn( MSGBOX_BTN_INFO_ITEM( bUseSprCaption, lpszID, lpszCaption, dwWidth ) );
}
void AddBtn(const MSGBOX_BTN_INFO_ITEM& info)
{
m_vtBtnItem.push_back( info );
}
DWORD GetBtnItemSize() const
{
return static_cast<DWORD>( m_vtBtnItem.size() );
}
const MSGBOX_BTN_INFO_ITEM& GetBtnItemByIndex(int nIndex) const
{
return m_vtBtnItem.at( nIndex );
}
protected:
std::vector<MSGBOX_BTN_INFO_ITEM> m_vtBtnItem;
int m_nDefaultItemIndex;
};
class KUIMsgControl;
class KViewportObject;
class KUIWnd;
class KUIIMEObject;
struct KUIWND_CREATE_ARG;
class KUIDragAndDropObject;
class KUIDragAndDropRenderer;
#ifdef _KUI_INVALIDATION
class KSpritePrimitive;
namespace {
struct SmartInvalidator;
}
#endif
class KUIWndManager : public KObject
{
public:
KUIWndManager();
virtual ~KUIWndManager();
void Clear();
void AddWnd( KUIWnd *pWnd, bool bSetFocus = true,bool bBack = false );
/// 2012.06.22 AddWnd함수는 엔터채팅일 경우에 제대로 front가 되지 않아서 AddWnd를 참고로 해서 새로 만듬 - prodongi
void addWndForceBack(KUIWnd* wnd);
void RemoveWnd( KUIWnd *pWnd );
/// Dynamic Wnd 때문에 필요
void MouseFocusWndRemoveCheck( KUIWnd *pWnd );
void AddModalWnd(KUIWnd* pWnd);
void RemoveModalWnd(KUIWnd* pWnd);
void onChangeSortValue( KUIWnd* pWnd, int nOldValue );
void SetFocus( KUIWnd *pWnd );
KUIWnd* GetFocusWnd();
void SetCapture( KUIWnd *pWnd )
{
m_pCaptureWnd = pWnd;
}
void ReleaseCapture( KUIWnd *pWnd )
{
if ( m_pCaptureWnd == pWnd )
m_pCaptureWnd = NULL;
}
KUIMsgControl* MessageBox( LPCSTR lpszID, LPCSTR lpszTitle, LPCSTR lpszMessage, const KMsgBoxBtnInfo& info,
KObject* pCallback = NULL, DWORD dwTimer = KMB_DEFAULT_TIMER, bool bModal = true, LPCSTR lpszReqValue=NULL, int nX=0, int nY=0 );
void FocusWindowOff();
bool IsExistMessageBox(LPCSTR lpszboxID) ;
bool IsOpenModalWnd();
KUIWnd* GetModalWnd(LPCSTR lpszboxID);
KUIWnd* GetModalessWnd(LPCSTR lpszboxID);
bool CloseMessageBox(KUIWnd* pWnd);
bool CloseMessageBox(LPCSTR lpszboxID);
bool CloseAllMessageBox();
bool CloseRebirthMessageBox();
bool CloseRebirth_PVP_MessageBox();
void SetRenderFlag( bool bFlag ) { m_bRenderFlag = bFlag; }
KUIWnd *CreateControl(KUIWND_CREATE_ARG& CREATE_ARG);
// find wnd
KUIWnd *FindWnd( const char *szWndID);
KUIWnd *FindWnd( const char *szWndID, const char *szControlID );
KUIWnd *FindWndWithChild( const char *szWndID);
// Setting Drag Object
void SetDragObject( KUIDragAndDropObject *pDragObject, const KPoint& ptOffset);
KUIDragAndDropObject* GetDragObject() { return m_pDragObject; }
void SetDragIconRenderer(KUIDragAndDropRenderer* pDragRenderer )
{
m_pDragIconRenderer = pDragRenderer;
}
KUIDragAndDropRenderer* GetDragIconRenderer() { return m_pDragIconRenderer; }
//
virtual void *Perform( KID _id, KArg& msg );
void Render( KViewportObject *viewport,bool isFront = false );
void Process( DWORD time );
// 2010.06.11 백그라운드 이미지 이후에 그려져야될 윈도우들 출력 - prodongi
void renderPostWnd(KViewportObject *viewport,bool isFront = false );
// 2010.06.11 현재 모달/모달리스 다이알로그가 있는지/없는지 - prodongi
bool isExistPostWnd() const;
void KillFocus();
static void SetResolution(const KSize& size)
{
m_sizeResolution = size;
}
static const KSize& GetResolution()
{
return m_sizeResolution;
}
KUIIMEObject *GetIME()
{
return m_pImeObject;
}
// MJ 2004/12/01 // alpha
void DestroyWnd( KUIWnd* pWnd );
KUIWnd* GetMouseFocusWnd() { return m_pMouseFocusWnd; };
KUIWnd* GetMouseClickWnd() { return m_pMouseClickWnd; };
void SetMouseClickWnd(KUIWnd* pWnd); //servantes 2010.12.06 수입력기를 ESC를 눌렀을 때, 맨위의 포커스 창이 닫히도록 수정
/// 201.09.30 srcId가 destId보다 위에 출력되는지 - prodongi
bool isTop(char const* srcId, char const* destId) const;
// { [sonador]
#ifdef _KUI_INVALIDATION
void SetViewportObject( KViewportObject* viewport );
KViewportObject* GetViewportObject() { return m_pUIViewport; }
//K3DRenderTarget* GetRenderTarget();
//void InitRenderTarget();
void InvalidateAllWnd();
void ValidateAllWnd();
//void InvalidateWnd( KUIWnd* pWnd );
//bool IsLockedToInvalidate() const { return m_bLockedToInvalidate; }
#endif
// }
private:
void _ProcMouseMessage( KUIWnd *pWnd, DWORD & dwMessage, KUIWnd * & pMouseWnd, bool & bFindFocusPanel, bool & bGetMouseMessage, DWORD &dwRet, int x, int y );
DWORD _SendMessage(DWORD dwMessage, DWORD dwWParam, DWORD dwlParam);
DWORD _SendMouseMessage(DWORD dwMessageType, int x, int y);
DWORD _SendKeyMessage(DWORD dwMessageType, DWORD dwKeyCode);
DWORD _SendKeyModalMessage(DWORD dwMessage, DWORD dwKeyCode);
KUIWnd* _procWndList( std::list< KUIWnd* >& Origin_List, DWORD dwMessage, int x, int y, bool bFindFocusPanel, bool bGetMouseMessage, DWORD& dwRet );
// static functions
public:
static void SetHandle( HWND hWnd, HINSTANCE hInst ) { m_sHWnd = hWnd; m_sInstance = hInst; }
static HWND GetHWnd() { return m_sHWnd; }
static HINSTANCE GetInstance() { return m_sInstance; }
static void SetEnterChatMode( bool bValue ) { s_bIsEnterChatMode = bValue; }
static bool IsEnterChatMode() { return s_bIsEnterChatMode; }
private:
static KSize m_sizeResolution;
static HWND m_sHWnd;
static HINSTANCE m_sInstance;
static bool s_bIsEnterChatMode;
private:
DWORD m_dwTime;
std::list< KUIWnd* > m_listDeletedWnd;
std::list< KUIWnd* > m_listSortedWnd; ///< KUIWnd::GetSortValue() 가 0이 아닌 녀석들에 대한 정보. (소트해서 따로 그리기 위함)
std::list< KUIWnd* > m_listWnd;
std::list< KUIWnd* > m_listModal;
std::list< KUIWnd* > m_listModaless;
/// 2011.06.14 mantis 13132 - prodongi
std::list< KUIWnd*> m_listWebWnd;
bool m_bInputDisable;
KUIWnd* m_pCaptureWnd;
// 포커스 윈도우
KUIWnd* m_pMouseFocusWnd;
KUIWnd* m_pMouseClickWnd; ///< 클릭한 윈도우를 항상 가장 위로 랜더링하기 위해 추가한 맴버
// Drag And Drop
KUIDragAndDropObject* m_pDragObject;
KUIDragAndDropRenderer* m_pDragIconRenderer;
KPoint m_ptDragRendererOffset;
bool m_bRenderFlag;
KUIIMEObject* m_pImeObject;
// { [sonador]
#ifdef _KUI_INVALIDATION
KViewportObject* m_pUIViewport;
//KSpritePrimitive* m_pUISpritePrimitive;
//K3DRenderTargetSPtr m_spRenderTarget;
//SmartInvalidator* m_pSmartInvalidator;
//bool m_bValidation;
//bool m_bLockedToInvalidate;
#endif
// }
};