⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameconsole.cpp

📁 3D游戏展示程序
💻 CPP
字号:
//--------------------------------------------------
//  Desc: 游戏控制台
//  Author: artsylee/2007.3.22
//--------------------------------------------------

#include "GameConsole.h"
#include "Common.h"

CGameConsole::CGameConsole()
{
	m_hConWnd = NULL;
	m_bCreate = false;
	m_bConActive = false;
}

CGameConsole::~CGameConsole()
{
	m_hConWnd = NULL;
	m_bCreate = false;
}

//--------------------------------------------------
// 创建一个控制台(是否即时激活)
//--------------------------------------------------
BOOL CGameConsole::CreateConsole(bool bActive /* = true */)
{
	if(m_bCreate)
	{
		Close();
	}
	if(AllocConsole())
	{
		m_hConWnd = GetConsoleWindow();
		SetConsoleTitle("ASE引擎控制台");
		m_bCreate = true;
		m_bConActive = bActive;
		m_hMainWnd = GetMainApp()->GetWndHandle();
		//--------------------------------------------------
		// 后台需要继续运行, 以获取输入信息
		//--------------------------------------------------
		GetMainApp()->SetNotSuspend(true);
		m_hInput = GetStdHandle(STD_INPUT_HANDLE);
		m_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
		if(!bActive)
		{
			SetForegroundWindow(m_hMainWnd);
			ShowWindow(m_hConWnd, SW_HIDE);
		}
		else
		{
			GetInput();
		}
		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------
// 显示控制台(后台显示, 用于查看输出, 不接受输入)
//--------------------------------------------------
void CGameConsole::ShowConsole(void)
{
	if(m_bCreate)
	{
		ShowWindow(m_hConWnd, SW_SHOWNORMAL);
		BringWindowToTop(m_hMainWnd);
		SetForegroundWindow(m_hMainWnd);
		m_bConActive = false;
	}
}

//--------------------------------------------------
// 隐藏控制台
//--------------------------------------------------
void CGameConsole::HideConsole(void)
{
	if(m_bCreate)
	{
		ShowWindow(m_hConWnd, SW_HIDE);
		BringWindowToTop(m_hMainWnd);
		SetForegroundWindow(m_hMainWnd);
		m_bConActive = false;
	}
}

//--------------------------------------------------
// 激活控制台(前台显示, 用于接受命令输入)
//--------------------------------------------------
void CGameConsole::ActiveConsole(void)
{
	if(m_bCreate && !m_bConActive)
	{	
		SetForegroundWindow(m_hConWnd);
		ShowWindow(m_hConWnd, SW_SHOWNORMAL);
		m_bConActive = true;
	}
	FlushConsoleInputBuffer(m_hInput);
	GetInput();
}

//--------------------------------------------------
// 激活主窗口并自动隐藏控制台(用于返回游戏状态)
//--------------------------------------------------
void CGameConsole::ActiveMainWindow(void)
{
	if(m_bCreate)
	{
		SetForegroundWindow(m_hMainWnd);
		ShowWindow(m_hMainWnd, SW_SHOWNORMAL);
		ShowWindow(m_hConWnd, SW_HIDE);
		m_bConActive = false;
	}
}

//--------------------------------------------------
// 在控制台输出一行信息
//--------------------------------------------------
void CGameConsole::Print(char *text, ...)
{
	if(m_bCreate)
	{
		char buffer[1024]; 
		va_list args;
		va_start(args, text);
		_vsnprintf(buffer, 1024, text, args);
		va_end(args);
		buffer[1023] = '\0';

		if(buffer[0] == 0)
			return;

		char *szEnd = "\r\n";
		strcat(buffer, szEnd);

		DWORD nlen;
		WriteConsole(m_hOutput, buffer, strlen(buffer), &nlen, NULL);
	}
}

bool CGameConsole::IsInput(void)
{
	return m_szInput[0] != 0;
}

void CGameConsole::GetInput(char *szInput)
{
	strcpy(szInput, m_szInput);
}

void CGameConsole::ClearInput(void)
{
	m_szInput[0] = 0;
}

//--------------------------------------------------
// 关闭控制台
//--------------------------------------------------
void CGameConsole::Close()
{
	FreeConsole();
	m_hConWnd = NULL;
	m_bCreate = false;
	m_bConActive = false;
	GetMainApp()->SetNotSuspend(false);
}

//--------------------------------------------------
// 获取控制台输入字符串
//--------------------------------------------------
void CGameConsole::GetInput(void)
{
	if(m_bCreate)
	{
		//--------------------------------------------------
		// ReadConsole会阻塞当前进程运行, 只能输入字符串返回
		//--------------------------------------------------
		DWORD nlen;
		memset(m_szInput, 0, sizeof(m_szInput));
		ReadConsole(m_hInput, m_szInput, sizeof(m_szInput), &nlen, NULL);
		for(int i=strlen(m_szInput)-1; i>=0; i--)
		{
			if(m_szInput[i]=='\r' && i!=0)
			{
				m_szInput[i] = 0;
				break;
			}
		}
		_strlwr(m_szInput);
		m_szInput[255] = 0;
	}
}

void CGameConsole::SaveToLogFile(char *file)
{
	/*
	char outname[256];
	if(file==NULL)
	{
		strcpy(outname, "Console_log.html");
	}
	else
	{
		strcpy(outname, file);
		strcat(outname, ".html");
	}

	ofstream f;
	f.open(outname);
	f<<"<HTML>"<<endl;
	f<<"<HEAD>"<<endl;
	f<<"<TITLE>Console Log </TITLE>"<<endl;
	for(unsigned i=0; i<m_buffer.size(); i++)
	{
		f<<m_buffer[i].c_str();
		f<<"<br>";
	}
	f<<"</HEAD>"<<endl;
	f<<"</HTML>"<<endl;
	f.close();
	*/
}

void CGameConsole::Log(char *format, ...)
{
	/*
	char buffer[1024]; 
	va_list args;
	va_start(args, format);
	_vsnprintf(buffer, 1024, format, args);
	va_end(args);
	buffer[1023] = '\0';
	string s = buffer;
	m_buffer.push_back(s);
	*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -