gui程序调用控制台显示信息

头文件如下:

#define UseConsoleInGUI
#ifdef UseConsoleInGUI
class CS_Console  
{
public:
	HANDLE hConsole;
	
	void open()
	{
		if(!hConsole)
		{
			AllocConsole();		
			hConsole = GetStdHandle(STD_OUTPUT_HANDLE);		
			SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE|BACKGROUND_INTENSITY);
			SetConsoleMode(hConsole, ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT);
		}
	}
	void close()
	{
		FreeConsole();
	}
	void printf(char *fmt, ...)
	{
		char s[256] = {0};
		va_list argptr;
		int cnt;
		DWORD cCharsWritten;
		
		va_start(argptr, fmt);
		cnt = vsprintf(s, fmt, argptr);
		va_end(argptr);
		if(hConsole)
		{
			WriteConsole(hConsole, s, strlen(s), &cCharsWritten, NULL);
		}		
	}
	CS_Console &operator<<(const char * const s)
	{
		if(hConsole)
		{
			DWORD cCharsWritten;
			WriteConsole(hConsole, s, strlen(s), &cCharsWritten, NULL);
		}
		return *this;
	}
public:
	CS_Console()
		:hConsole(NULL)
	{
		open();
	}
	~CS_Console()
	{
		if(hConsole)
			close();
	}
};

namespace sword
{
	extern CS_Console cout;
}
#endif

cpp代码如下

#ifdef UseConsoleInGUI
namespace sword
{
	CS_Console cout;
}
#endif

使用示例:

	sword::cout << "hello world!\n";

另一个较复杂的版本,2006年的:
头文件

class ConsoleControl  
{
public:
	static void Output(char *fmt, ...);
	static BOOL PackCmd(LPCTSTR cmd, INPUT_RECORD** output, DWORD nSize);
	static void Op_DebugCmd(CString data);
	static void CreateConsole();
	static void CloseConsole();
private:
	static HANDLE m_hConsole;
private:
	ConsoleControl(){}
	~ConsoleControl(){}
};

cpp文件


#include "ConsoleControl.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

HANDLE ConsoleControl::m_hConsole = NULL;

//Debug command打包送往stdin,支持回车
BOOL ConsoleControl::PackCmd(LPCTSTR cmd, INPUT_RECORD** output, DWORD nSize)
{
	DWORD i=0;
	char ch=0;
	if (!cmd || !output) return FALSE;
	
	for(i=0;i<nSize;i++)
	{
		ch = *(cmd+i);
		if (ch == '\n') 
		{
			(*output)[i].EventType = KEY_EVENT;
			(*output)[i].Event.KeyEvent.bKeyDown = TRUE;
			(*output)[i].Event.KeyEvent.wRepeatCount=1;
			(*output)[i].Event.KeyEvent.uChar.AsciiChar = 0x0d;
		}else
		{
			(*output)[i].EventType = KEY_EVENT;
			(*output)[i].Event.KeyEvent.bKeyDown = TRUE;
			(*output)[i].Event.KeyEvent.wRepeatCount=1;
			(*output)[i].Event.KeyEvent.uChar.AsciiChar = ch;
		}
	}
	return TRUE;
}
void ConsoleControl::Op_DebugCmd(CString data)
{
	HANDLE hdl;
	DWORD num=(DWORD)strlen(data)+1;
	DWORD rslt=0;
	
	INPUT_RECORD* input = new INPUT_RECORD[num];
	hdl = GetStdHandle(STD_INPUT_HANDLE);
	SetConsoleMode(hdl,ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT);
	PackCmd(data+"\n", &input, num);
	WriteConsoleInput(hdl, input, num, &rslt);
	Sleep(500);
	delete[] input;
}

void ConsoleControl::CreateConsole()
{
	AllocConsole();	
	m_hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(m_hConsole, FOREGROUND_BLUE|BACKGROUND_INTENSITY);
	SetConsoleMode(m_hConsole, ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT);
}
void ConsoleControl::CloseConsole()
{
	FreeConsole();
}
void ConsoleControl::Output(char *fmt, ...)
{
	char s[300]="";
	va_list argptr;
	int cnt;
	DWORD cCharsWritten;
	
	va_start(argptr, fmt);
	cnt = vsprintf(s, fmt, argptr);
	va_end(argptr);
	if(m_hConsole)
	{
		WriteConsole(m_hConsole, s, strlen(s), &cCharsWritten, NULL);
	}	
}

猜你喜欢

转载自blog.csdn.net/weixin_43172531/article/details/103764826