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

📄 ansi.cpp

📁 CMUD源码 用来玩MUD游戏的 没开发完
💻 CPP
字号:
// Ansi.cpp: implementation of the CAnsi class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "g.h"
#include "Ansi.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

#define NOR  2

CAnsi::CAnsi(void)
{	
	m_state = as_normal;
}

CAnsi::~CAnsi(void)
{
}

void CAnsi::Dispaly(char* s, CString *ret)
{
	char *str;
	m_pRet = ret;
	while (*s)
	{
		switch(m_state)
		{
		case as_normal:
			str = strchr(s, 27);
			if (str == NULL)
			{
				WriteEdit(s);
				return;
			}
			else
			{
				*str = 0;
				WriteEdit(s);
				s = str;
				m_state = as_esc;
			}
			break;
		case as_esc:
			m_state = as_esc1;
			m_codeptr=0;
			m_codebuf[m_codeptr] = 0;
			break;
		case as_esc1:
			if(*s > 64)
			{
				m_codebuf[m_codeptr] = 0;
				AnsiSet(*s);
				m_state = as_normal;
			}
			else if (*s == 27)
				m_state = as_esc;
			else
				m_codebuf[m_codeptr++] = *s;
			break;
		}
		s++;
	}//while
}

void CAnsi::AnsiSet(char c)
{
	switch (c)
	{
	case 'm':    //ansi_set_screen_attribute
		SetScreen(m_codebuf);
		break;
	case 'J':    //ansi_erase_screen
		m_pEdit->SetWindowText("");
		break;
/*	case 'H':    //ansi_set_position
		break;
	case 'K':    //ansi_erase_line
		break;	
	case 'A':    //ansi_move_up
		break;*/
	}
}

void CAnsi::WriteEdit(LPCTSTR str)
{
	m_pEdit->SetSel(-1, -1);
	m_pEdit->ReplaceSel(str);
	if (m_pRet)
		*m_pRet += str;
}

void CAnsi::SetScreen(char* buffer)
{
	unsigned char sa;
	sa = 0;	
	while(*buffer)
	{
		switch(*buffer++)
		{
		case '0': //Normal
			sa = 0;
			break;
		case '1': //Hign Intensity
			sa += 12;
			break;
		case '3'://Foreground Colors
			if(*buffer)
			{
				sa += *buffer - '0';			
				buffer++;
			}
			break;
		case '4': //Background
			if(*buffer)
				buffer++;
			break;
		case '5': //Blink.
			break;
		case '7':
			break;
		case '6':			
			break;
		case '8':
			sa = 0;
			break;
		}
		if(*buffer && *buffer == ';')
			buffer++;
	}
	
	CHARFORMAT cf;
	cf.cbSize = sizeof(cf);
	cf.dwMask = CFM_COLOR;
	cf.dwEffects = 0;
	
	if (!sa)
		cf.crTextColor = m_color;
	else if(sa == 12)
		cf.crTextColor = RGB(255, 255, 255);
	else
	{
		CPalette* pPal = CPalette::FromHandle((HPALETTE) GetStockObject(DEFAULT_PALETTE));
		PALETTEENTRY pe;
		pPal->GetPaletteEntries(sa, 1, &pe);
		cf.crTextColor = RGB(pe.peRed, pe.peGreen, pe.peBlue);
	}	
	
	m_pEdit->SetWordCharFormat(cf);

}

void CAnsi::Init(CRichEditCtrl* pEdit)
{
	m_pEdit = pEdit;

	CHARFORMAT cf;
	CString strDefFont;
	strDefFont="宋体";
	cf.cbSize = sizeof(CHARFORMAT);
	cf.dwMask =  CFM_BOLD|CFM_SIZE|CFM_COLOR|CFM_OFFSET|CFM_PROTECTED|CFM_FACE|CFM_CHARSET;
	cf.dwEffects =0;
	cf.yHeight = 240; 
	cf.crTextColor = m_color;
	cf.yOffset = 0;
	cf.bCharSet = GB2312_CHARSET;
	cf.bPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
	ASSERT(strDefFont.GetLength() < LF_FACESIZE);
	lstrcpynA(cf.szFaceName, ((LPTSTR) (LPCTSTR) strDefFont), LF_FACESIZE);
	m_pEdit->SetDefaultCharFormat(cf);
	m_pEdit->SetReadOnly();
}

void CAnsi::Reset(void)
{
	m_state = as_normal;
	m_pEdit->SetWindowText("");
}

⌨️ 快捷键说明

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