태그 보관물: vc

Debug Console class

// h

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

#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 );

}

Win-base source

WinMain+Singleton(Main)

#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 );
};