태그 보관물: vc

Debug Console class

// h
[cpp]
class CDebugConsole : public CSingleton<CDebugConsole>
{
friend class CSingleton<CDebugConsole>;

private:
HANDLE m_hOut;
HWND m_hWnd;

public:
enum { CSL_TR = 0, CSL_TL, CSL_BR, CSL_BL }; // Edge

private:
CDebugConsole()
{
this->Initialize();
}
virtual ~CDebugConsole()
{
this->Release();
}

VOID Initialize();
VOID Release();

VOID GetConsoleHwnd( HWND& _hWnd );
VOID GetEdgePosition( DWORD _Edge );

public:
// CDebugConsole::m_Console().Message( " " );
VOID Message( LPWSTR str );
VOID Message( LPSTR str );

// CDebugConsole::m_Console().Messagef( "%s %d %f", char, int, float );
VOID Messagef( LPWSTR str, … );
VOID Messagef( LPSTR str, … );

// 모니터가 수평 배치가 아닌 수직 배치일때는 지원하지 않음
VOID SetPosition( DWORD _dEdge, BOOL _bTopMost );
};
[/cpp]

// cpp
[cpp]
#include "stdafx.h"
#include "DebugConsole.h"

VOID CDebugConsole::Initialize()
{
if( !AllocConsole() )
{
MessageBox( NULL, L"CDebugConsole::AllocConsole()", NULL, MB_OK );
return;
}

if( ( m_hOut = CreateFile(
L"CONOUT$",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
0) ) == INVALID_HANDLE_VALUE )
{
MessageBox( NULL, L"CDebugConsole::Initialize() failed", NULL, MB_OK );
return;
}

SetConsoleTitle( L"1.0v" );
}

VOID CDebugConsole::Release()
{
CloseHandle( m_hOut );
FreeConsole();
}

VOID CDebugConsole::GetConsoleHwnd( HWND& _hWnd )
{
const INT BUFSIZE = 1024;

TCHAR pszNewWindowTitle[ BUFSIZE ]; // Contains fabricated
TCHAR pszOldWindowTitle[ BUFSIZE ]; // Contains original

// Fetch current window title.
GetConsoleTitle(pszOldWindowTitle, BUFSIZE);

wsprintf( pszNewWindowTitle, L"%d/%d", GetTickCount(), GetCurrentProcessId() );

// Change current window title.
SetConsoleTitle(pszNewWindowTitle);

// Ensure window title has been updated.
Sleep(40);

// Look for NewWindowTitle.
_hWnd = FindWindow(NULL, pszNewWindowTitle);

// Restore original window title.
SetConsoleTitle(pszOldWindowTitle);
}

VOID CDebugConsole::GetEdgePosition( DWORD _Edge )
{
// Get Display Impormation
HDC hDC;
hDC = CreateDC( TEXT("DISPLAY"), NULL, NULL, NULL );
INT iWidth = GetDeviceCaps( hDC, HORZRES );
INT iHeight = GetDeviceCaps( hDC, VERTRES );
INT iNumMonitor = GetSystemMetrics( SM_CMONITORS);
DeleteDC( hDC );

this->Messagef( L"모니터 갯수 : %dn 해상도 : %d * %dn", iNumMonitor, iWidth, iHeight );

iWidth *= iNumMonitor;

RECT rt;
GetClientRect( m_hWnd, &rt );
INT x = 0, y = 0;

switch( _Edge )
{
case CSL_TL:
x = 0;
y = 0;
break;
case CSL_TR:
x = iWidth – rt.right;
y = 0;
break;
case CSL_BL:
x = 0;
y = iHeight – rt.bottom;
break;
case CSL_BR:
x = iWidth – rt.right;
y = iHeight – rt.bottom;
break;
}

MoveWindow( m_hWnd, x, y, rt.right, rt.bottom, FALSE );
}
VOID CDebugConsole::Message( LPWSTR _str )
{
DWORD sz;

// 멀티바이트 -> 유니코드
CHAR str[ 256 ];
WideCharToMultiByte( CP_ACP, 0, _str, -1, str, 256, NULL, NULL );
// End

WriteFile( m_hOut, str, strlen( str ), &sz, NULL );
}

VOID CDebugConsole::Message( LPSTR _str )
{
DWORD sz;

WriteFile( m_hOut, _str, strlen( _str ), &sz, NULL );
}

VOID CDebugConsole::Messagef( LPWSTR _str, … )
{
// 멀티바이트 -> 유니코드
CHAR str[ 256 ];
WideCharToMultiByte( CP_ACP, 0, _str, -1, str, 256, NULL, NULL );
// End

va_list argp;
CHAR szBuf[ 1024 ];

va_start( argp, _str );
vsprintf_s( szBuf, str, argp );
va_end( argp );

DWORD sz;
WriteFile( m_hOut, szBuf, strlen( szBuf ), &sz, NULL );
}

VOID CDebugConsole::Messagef( LPSTR _str, … )
{
va_list argp;
CHAR szBuf[ 1024 ];

va_start( argp, _str );
vsprintf_s( szBuf, _str, argp );
va_end( argp );

DWORD sz;
WriteFile( m_hOut, szBuf, strlen( szBuf ), &sz, NULL );
}

VOID CDebugConsole::SetPosition( DWORD _dEdge, BOOL _bTopMost )
{
// Get HWND
GetConsoleHwnd( m_hWnd );

// Set Position
GetEdgePosition( _dEdge );

// Set TopMost
if( _bTopMost )
SetWindowPos( m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
else
SetWindowPos( m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );

}
[/cpp]

Win-base source

WinMain+Singleton(Main)

[cpp]
#pragma once

class CWndEx : public CSingleton< CWndEx >
{
private:
// ENUM

// PRE
friend class CSingleton;

// MEMBER
HWND m_hWnd;
HINSTANCE m_hInstance;

LPWSTR m_lpszTitle;

CWndEx();
~CWndEx();

//VOID Clear();
VOID Create();
VOID Destory();
VOID Render();
VOID Update();

// Method
ATOM RegisterClass( WNDPROC, LPTSTR, UINT );
BOOL InitInstance( INT );

static LRESULT CALLBACK FramWndProc( HWND, UINT, WPARAM, LPARAM );

VOID CreateStatusWindowEx( HWND );
VOID SetStatusRGB();

// MESSAGE
// Frame MESSAGE
VOID OnCommand( HWND, INT, HWND, UINT );
BOOL OnCreate( HWND, LPCREATESTRUCT );
VOID OnDestroy( HWND );

public:
static INT MessageLoop( HINSTANCE = NULL );
};
[/cpp]