📄 ansi.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 + -