/*//=============================================================== << CONSOLE OUTPUT >> PRGM : B4nFter FILE : CONSOLEOUTPUT.H DESC : Console Ãâ·Â(Àü¿ë) Ŭ·¡½º INIT BUILT DATE : 2001. 06. 16 LAST BUILT DATE : 2006. 01. 05 Copyright¨Ï 2002~2007 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved. *///=============================================================== #pragma once /////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// #include "COMMONMACROS.H" #include "BASESET.H" #include "DEBUGUTIL.H" #include "SAFESTRINGMACROS.H" #include "CRITICALSECTION.H" /////////////////////////////////////////////////////////////////// // DEFINE /////////////////////////////////////////////////////////////////// #define MAX_CONSOLE_OT_TITLE_CHAR (256) /////////////////////////////////////////////////////////////////// // DECLARATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CConsoleOutput //*--------------------------------------------------------------- // DESC : ÄÜ¼Ö Ãâ·Â Ŭ·¡½º // PRGM : B4nFter //*--------------------------------------------------------------- class CConsoleOutput { public: enum EF_FGCOLOR { EV_FGCL_BLACK = 0x0000, EV_FGCL_DARKBLUE = 0x0001, EV_FGCL_DARKGREEN = 0x0002, EV_FGCL_DARKCYAN = 0x0003, EV_FGCL_DARKRED = 0x0004, EV_FGCL_DARKMAGENTA = 0x0005, EV_FGCL_DARKYELLOW = 0x0006, EV_FGCL_GREY = 0x0007, EV_FGCL_DARKGREY = 0x0008, EV_FGCL_BLUE = 0x0009, EV_FGCL_GREEN = 0x000A, EV_FGCL_CYAN = 0x000B, EV_FGCL_RED = 0x000C, EV_FGCL_MAGENTA = 0x000D, EV_FGCL_YELLOW = 0x000E, EV_FGCL_WHITE = 0x000F, }; enum EF_BGCOLOR { EV_BGCL_BLACK = 0x0000, EV_BGCL_DARKBLUE = 0x0010, EV_BGCL_DARKGREEN = 0x0020, EV_BGCL_DARKCYAN = 0x0030, EV_BGCL_DARKRED = 0x0040, EV_BGCL_DARKMAGENTA = 0x0050, EV_BGCL_DARKYELLOW = 0x0060, EV_BGCL_GREY = 0x0070, EV_BGCL_DARKGREY = 0x0080, EV_BGCL_BLUE = 0x0090, EV_BGCL_GREEN = 0x00A0, EV_BGCL_CYAN = 0x00B0, EV_BGCL_RED = 0x00C0, EV_BGCL_MAGENTA = 0x00D0, EV_BGCL_YELLOW = 0x00E0, EV_BGCL_WHITE = 0x00F0, }; private: HANDLE m_hConsoleOutput; HWND m_hConsoleWindow; EF_FGCOLOR m_eConsoleFgColor; // ÄܼÖÀÇ Àü¸é»ö EF_BGCOLOR m_eConsoleBgColor; // ÄܼÖÀÇ Èĸé»ö TCHAR m_szConsoleTitle[MAX_CONSOLE_OT_TITLE_CHAR*sizeof(TCHAR)]; TCHAR m_szBuffer[1024]; CSyncLock m_Lock; public: inline CConsoleOutput(); inline ~CConsoleOutput(); inline BOOL Initialize(LPCTSTR lpszConsoleTitle = NULL); inline BOOL Finalize(); inline VOID Write(LPCTSTR lpszFormat, ...); inline VOID ShowWindow(BOOL bShow); inline VOID SetConsoleTitle(LPCTSTR lpszConsoleTitle); inline VOID SetColor(EF_FGCOLOR eFgColor, EF_BGCOLOR eBgColor); inline VOID SetFgColor(EF_FGCOLOR eFgColor); inline VOID SetBgColor(EF_BGCOLOR eBgColor); }; //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::CConsoleOutput //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- CConsoleOutput::CConsoleOutput() { m_hConsoleOutput = INVALID_HANDLE_VALUE; m_hConsoleWindow = NULL; m_eConsoleFgColor = EV_FGCL_GREY; m_eConsoleBgColor = EV_BGCL_BLACK; ::memset(m_szConsoleTitle, 0, sizeof(m_szConsoleTitle)); /* if (NOERROR != m_Lock.Open()) { // DN_ASSERT(0, "Failed!"); } */ } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::~CConsoleOutput //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- CConsoleOutput::~CConsoleOutput() { Finalize(); // m_Lock.Close(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::Initialize //*--------------------------------------------------------------- // DESC : °´Ã¼ÀÚ¿ø ÃʱâÈ­ // PARM : N/A // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- BOOL CConsoleOutput::Initialize(LPCTSTR lpszConsoleTitle) { if (m_hConsoleOutput != INVALID_HANDLE_VALUE) { DN_TRACE(_T("m_hConsoleOutput != INVALID_HANDLE_VALUE - CConsoleOutput::Initialize()")); return FALSE; } #if !defined(_CONSOLE) if (!::AllocConsole()) { // DN_MESSAGEBOX(HWND_DESKTOP, MB_ICONERROR, _T("ERROR"), _T("!AllocConsole() - CConsoleOutput::Initialize()")); return FALSE; } #endif // _CONSOLE m_hConsoleOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); if (m_hConsoleOutput == INVALID_HANDLE_VALUE) { // DN_MESSAGEBOX(HWND_DESKTOP, MB_ICONERROR, _T("ERROR"), _T("m_hConsoleOutput == INVALID_HANDLE_VALUE - CConsoleOutput::Initialize()")); return FALSE; } // ÄÜ¼Ö À©µµ¿ìÇÚµéÀ» ¾òÀ½ m_hConsoleWindow = ::GetConsoleWindow(); // ÄÜ¼Ö Á¦¸ñ ÁöÁ¤ if (lpszConsoleTitle) { ::SetConsoleTitle(lpszConsoleTitle); } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::Finalize //*--------------------------------------------------------------- // DESC : °´Ã¼ÀÚ¿ø ÇØÁ¦ // PARM : N/A // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- BOOL CConsoleOutput::Finalize() { if (m_hConsoleOutput != INVALID_HANDLE_VALUE) { #if !defined(_CONSOLE) if (!::FreeConsole()) { // DN_MESSAGEBOX(HWND_DESKTOP, MB_ICONERROR, _T("ERROR"), _T("!FreeConsole() - - CConsoleOutput::FreeConsole()")); return FALSE; } #endif // _CONSOLE m_hConsoleOutput = INVALID_HANDLE_VALUE; } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleUserInterface::Write //*--------------------------------------------------------------- // DESC : ÄܼÖÈ­¸é¿¡ ÅØ½ºÆ® Ãâ·Â // PARM : 1 . lpszFormat - ÄܼÖÈ­¸é¿¡ Ãâ·ÂÇÒ ÅØ½ºÆ®ÀÇ Æ÷¸Ë // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- VOID CConsoleOutput::Write(LPCTSTR lpszFormat, ...) { va_list szArgs; int iTextCount; DWORD dwWrittenBytes; ScopeLock aLockAuto(&m_Lock); va_start(szArgs, lpszFormat); #if (_MSC_VER >= 1400) // VS.NET 2005 ÀÌ»ó iTextCount = _vsntprintf_s(m_szBuffer, COUNT_OF(m_szBuffer), lpszFormat, szArgs); #else // #if (_MSC_VER >= 1400) #pragma warning (disable:4995) iTextCount = _vsntprintf(m_szBuffer, COUNT_OF(m_szBuffer), lpszFormat, szArgs); #pragma warning (default:4995) #endif // #if (_MSC_VER >= 1400) va_end(szArgs); ::WriteConsole(m_hConsoleOutput, m_szBuffer, iTextCount, &dwWrittenBytes, NULL); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::ShowWindow //*--------------------------------------------------------------- // DESC : show or hide console window // PARM : 1 . bShow - TRUE - ¼º°ø / FALSE - ½ÇÆÐ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- VOID CConsoleOutput::ShowWindow(BOOL bShow) { if (m_hConsoleWindow) { ::ShowWindow(m_hConsoleWindow, bShow); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::SetConsoleTitle //*--------------------------------------------------------------- // DESC : set or change title of console window // PARM : 1 . lpszConsoleTitle - title of console window // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- VOID CConsoleOutput::SetConsoleTitle(LPCTSTR lpszConsoleTitle) { if (lpszConsoleTitle != NULL && lstrcmp(lpszConsoleTitle, _T('\0'))) { // lstrcpyn() Àº TCHAR¸¦ ó¸®ÇϹǷΠÀ¯´ÏÄڵ忡¼­ ±ÛÀÚ1°³´Â 2¹ÙÀÌÆ®ÀÌ´Ù. STRNCPY(m_szConsoleTitle, _countof(m_szConsoleTitle), lpszConsoleTitle); // _tcsncpy(m_szConsoleTitle, lpszConsoleTitle, COUNT_OF(m_szConsoleTitle)); ::SetConsoleTitle(m_szConsoleTitle); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::SetColor //*--------------------------------------------------------------- // DESC : set or change console text color, foreground and background // PARM : 1 . eFgColor - foreground console text color // 2 . eBgColor - background console text color // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- VOID CConsoleOutput::SetColor(EF_FGCOLOR eFgColor, EF_BGCOLOR eBgColor) { m_eConsoleFgColor = eFgColor; m_eConsoleBgColor = eBgColor; if (m_hConsoleOutput != INVALID_HANDLE_VALUE) { ::SetConsoleTextAttribute(m_hConsoleOutput, (WORD)(eFgColor | eBgColor)); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::SetFgColor //*--------------------------------------------------------------- // DESC : set or change console text color, foreground // PARM : 1 . eFgColor - foreground console text color // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- VOID CConsoleOutput::SetFgColor(EF_FGCOLOR eFgColor) { m_eConsoleFgColor = eFgColor; if (m_hConsoleOutput != INVALID_HANDLE_VALUE) { ::SetConsoleTextAttribute(m_hConsoleOutput, (WORD)(eFgColor | m_eConsoleBgColor)); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CConsoleOutput::SetBgColor //*--------------------------------------------------------------- // DESC : set or change console text color, background // PARM : 1 . eBgColor - background console text color // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- VOID CConsoleOutput::SetBgColor(EF_BGCOLOR eBgColor) { m_eConsoleBgColor = eBgColor; if (m_hConsoleOutput != INVALID_HANDLE_VALUE) { ::SetConsoleTextAttribute(m_hConsoleOutput, (WORD)(m_eConsoleFgColor | eBgColor)); } }