📄 vt100disp.cpp
字号:
#include "stdAfx.h"
#include "Vt100Disp.h"
#include "screen.h"
#include "font.h"
#include "cursor.h"
#include "codeconvert.h"
extern struct struScreen struScrMsp;
extern struct CharRowProp struCharProp;
extern HWND hOutWnd;
CharStru ScreenBuf[24][132];
extern RECT TextRect;
extern int G0,G1;
extern HFONT testFont4,testUlineFont4;
extern int iWidth;
//extern HFONT AscFont4,AscUlineFont4;
CCodeConvert csCodeConv;
int bHz=0;//汉字标志
///设置光标
int SetCursor(int CursorType)
{
int m_iColPos,m_iRowPos;
// iRow=struScrMsp.iYPos ;
// iXPoint=struScrMsp.iXPos;
m_iColPos=struScrMsp.iXPos*struScrMsp.iChrWidth;
m_iRowPos=(struScrMsp.iYPos+2)*struScrMsp.iChrHigh; //修改起始行
struScrMsp.iCursorState=CursorType;
switch (CursorType)
{
case 0: ///闪烁块状光标
CreateCaret(hOutWnd,NULL,struScrMsp.iChrWidth,struScrMsp.iChrHigh);
SetCaretPos(m_iColPos,m_iRowPos);
// pWnd->ShowCaret();
break;
case 1: ////闪烁线状光标
CreateCaret(hOutWnd,NULL,struScrMsp.iChrWidth,1);
SetCaretPos(m_iColPos,m_iRowPos+struScrMsp.iChrHigh);
// pWnd->ShowCaret();
break;
case 2: ////
CreateCaret(hOutWnd,NULL,struScrMsp.iChrWidth,struScrMsp.iChrHigh);
SetCaretPos(m_iColPos,m_iRowPos);
// pWnd->ShowCaret();
break;
case 3:
CreateCaret(hOutWnd,NULL,struScrMsp.iChrWidth,1);
SetCaretPos(m_iColPos,m_iRowPos+struScrMsp.iChrHigh);
// pWnd->ShowCaret();
break;
default:///闪烁块状光标
CreateCaret(hOutWnd,NULL,struScrMsp.iChrWidth,struScrMsp.iChrHigh);
SetCaretPos(m_iColPos,m_iRowPos);
// pWnd->ShowCaret();
break;
}
if (struScrMsp.iCursorDisplay ==0)
ShowCaret(hOutWnd);
return 0;
}
///清空屏幕
int ClearScreen(int ClearType)
{
int iStartRow, iStartCol;
int iEndRow,iEndCol;
int m_iColPos,m_iRowPos;
switch (ClearType)
{
case 2://清全屏
iStartRow=0;
iStartCol=0;
iEndRow=23;
iEndCol=iWidth-1;
struScrMsp.iXPos =0;
struScrMsp.iYPos =0;
struScrMsp.iBaseRow=0;
break;
case 1://清光标前字符
iStartRow=0;
iStartCol=0;
iEndRow=struScrMsp.iYPos;
iEndCol=struScrMsp.iXPos;
break;
case 0://清光标后字符
iStartRow=struScrMsp.iYPos;
iStartCol=struScrMsp.iXPos;
iEndRow=23;
iEndCol=iWidth-1;
break;
default:
return 1;
}
ClearBuf(iStartRow,iStartCol,iEndRow,iEndCol);
Refresh(iStartRow,iStartCol,iEndRow,iEndCol);
if (struScrMsp.iCursorDisplay==0)
{
m_iColPos=struScrMsp.iXPos*struScrMsp.iChrWidth;
m_iRowPos=(struScrMsp.iYPos+2)*struScrMsp.iChrHigh; //修改起始行
if (struScrMsp.iCursorState ==0 || struScrMsp.iCursorState ==2)
SetCaretPos(m_iColPos,m_iRowPos);
else
SetCaretPos(m_iColPos,m_iRowPos+struScrMsp.iChrHigh);
ShowCaret(hOutWnd);
}
return 0;
}
int ClearBuf(int iStartRow, int iStartCol, int iEndRow, int iEndCol)
{
int i,j;//循环变量
int iColB,iColE;//每行的起始列、结束列
int iTrueRow;
for (i=iStartRow;i<=iEndRow;i++)
{
if (i!=iStartRow || i!=iEndCol)
{
iColB=0;
iColE=iWidth-1;
}
if (i==iStartRow) iColB=iStartCol;
if (i==iEndRow) iColE=iEndCol;
iTrueRow=(i+struScrMsp.iBaseRow)%24;
for (j=iColB;j<=iColE;j++)
{
ScreenBuf[iTrueRow][j].ch =0x20;
ScreenBuf[iTrueRow][j].iFan =0;
ScreenBuf[iTrueRow][j].iType =0;
ScreenBuf[iTrueRow][j].iHighLight =0;
ScreenBuf[iTrueRow][j].iULine =0;
}
}
return 0;
}
///光标移动到指定位
int CursorMoveTo(int iRow, int iCol)
{
// int iTrueRow;
int m_iColPos,m_iRowPos;
if (iCol>iWidth-1) iCol=iWidth-1;
if (iCol<0) iCol=0;
struScrMsp.iXPos =iCol;
if (iRow>23) iRow=23;
if (iRow<0) iRow=0;
struScrMsp.iYPos =iRow;
if (struScrMsp.iCursorDisplay==0)
{
m_iColPos=(struScrMsp.iXPos)*struScrMsp.iChrWidth;
m_iRowPos=(struScrMsp.iYPos+2)*struScrMsp.iChrHigh; //修改起始行
if (struScrMsp.iCursorState ==0 || struScrMsp.iCursorState ==2)
SetCaretPos(m_iColPos,m_iRowPos);
else
SetCaretPos(m_iColPos,m_iRowPos+struScrMsp.iChrHigh);
ShowCaret(hOutWnd);
}
/* if (struScrMsp.iYPos<0)
struScrMsp.iYPos=0;
if (struScrMsp.iYPos>24)
struScrMsp.iYPos=24;
DisplayCursor();*/
return 0;
}
////重新输出指定屏幕缓冲区的内容
int Refresh(int iStartRow, int iStartCol, int iEndRow, int iEndCol)
{
int i,j;//循环变量
int iColB,iColE;//每行的起始列、结束列
CharStru CurrChar;//当前字符
char OutputBuf[133];//输出缓冲区
int iType;//输出缓冲区字符属性
int iFan;//输出缓冲区反向显示
int iHighLight;//高亮度
int iUnderLine;//下划线
int iStart,iTrueRow;//缓冲区起始列
for (i=iStartRow;i<=iEndRow;i++)
{
memset(OutputBuf,0x00,sizeof(OutputBuf));
// memset(OutputBuf,0x20,sizeof(OutputBuf)-1);
if (i!=iStartRow || i!=iEndCol)
{
iColB=0;
iColE=iWidth-1;
}
if (i==iStartRow) iColB=iStartCol;
if (i==iEndRow) iColE=iEndCol;
iStart=iColB;
iType=0;
iFan=0;
iUnderLine=0;
iHighLight=0;
iTrueRow=(i+struScrMsp.iBaseRow) % 24;
for (j=iColB;j<=iColE;j++)
{
CurrChar=ScreenBuf[iTrueRow][j];
if (CurrChar.iType !=iType || CurrChar.iFan !=iFan || CurrChar.iULine!=iUnderLine || CurrChar.iHighLight!=iHighLight)
{
ShowText(i,iStart,iType,iFan,iUnderLine,iHighLight,OutputBuf);
memset(OutputBuf,0x00,sizeof(OutputBuf));
// memset(OutputBuf,0x20,sizeof(OutputBuf)-1);
iStart=j;
iType=CurrChar.iType ;
iFan=CurrChar.iFan ;
iHighLight=CurrChar.iHighLight;
iUnderLine=CurrChar.iULine;
OutputBuf[strlen(OutputBuf)]=CurrChar.ch;
}
else
OutputBuf[strlen(OutputBuf)]=CurrChar.ch;
}
ShowText(i,iStart,iType,iFan,iUnderLine,iHighLight,OutputBuf);
}
return 0;
}
//////////////////////////////////////////////////////////////////////////
//显示字符串
int ShowText(int iRow,int iCol,int iType,int iFan,int iUnderLine, int iHighLight, char * szText)
{
HDC hDC;
int iXpos, iYpos;//点阵坐标
int i;
int iHalfWidth;
int iHalfHigh;
char CurrChinese[3];
int CStart,CEnd;//汉字起始结束列
int CRow;//汉字所在行
POINT arrEndPoint[4];
if (strlen(szText)==0) return 0;
////////////////////////////////////////////////////
hDC=GetDC(hOutWnd);
// HFONT testFont4;
SetROP2(hDC,R2_WHITE); //显示方式
// testFont4=CreateFont(22, 11, 0,0, 400, FALSE, FALSE, 0,
// ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
// DEFAULT_QUALITY, DEFAULT_PITCH|FF_MODERN, _T("line printer"));//创建等宽字体
if (iUnderLine==0)
{
// if (iType!=0)
SelectObject(hDC,testFont4);
// else
// SelectObject(hDC,AscFont4);
}
else
{
// if (iType!=0)
SelectObject(hDC,testUlineFont4);
// else
// SelectObject(hDC,AscUlineFont4);
}
// SelectObject(hDC,testFont4);
SetBkColor(hDC,RGB(0,0,0));
// pDC->UpdateColors();
// SetTextColor(hDC,RGB(0,255,0));///设置字体颜色
if (iHighLight==0)
SetTextColor(hDC,RGB(208,208,208));///设置字体颜色 0 255 0
else
SetTextColor(hDC,RGB(255,255,255)); // 0 255 255
SetBkMode(hDC,OPAQUE);
///////////////////////////////////////////////////////*/
iXpos=iCol*struScrMsp.iChrWidth;
iYpos=(iRow+2)*struScrMsp.iChrHigh; //修改起始行
if (iFan==1)
{
SetBkColor(hDC,RGB(208,208,208));
// pDC->UpdateColors();
SetTextColor(hDC,RGB(0,0,0));
if (iUnderLine==0)
SetTextColor(hDC,RGB(0,0,0));
else
SetTextColor(hDC,RGB(0,0,0)); // 255 0 0
}
switch (iType)
{
case 0://普通字符
// TextRect.left=iXpos;
// TextRect.top=iYpos;
// TextRect.right=iXpos+strlen(szText)*struScrMsp.iChrWidth;
// TextRect.bottom=iYpos+struScrMsp.iChrHigh;
#ifdef UNICODE
int iLen;
TCHAR wcText[133];
iLen=strlen(szText);
mbstowcs(wcText,szText,iLen);
// for (i=0;i<iLen;i++)
// {
// ExtTextOut(hDC,iXpos,iYpos,ETO_CLIPPED,&TextRect,wcText+i,1,NULL);
// iXpos=iXpos+struScrMsp.iChrWidth;
// }
ExtTextOut(hDC,iXpos,iYpos,ETO_CLIPPED,&TextRect,wcText,iLen,NULL);
#else
TextOut(hDC,iXpos,iYpos,szText,strlen(szText));
#endif
break;
case 1://汉字
CRow=(iRow+struScrMsp.iBaseRow)%24;
CStart=iCol ;
CEnd=iCol;
while (ScreenBuf[CRow][CStart].iType ==1 && CStart>=0) CStart--;
while (ScreenBuf[CRow][CEnd].iType ==1 && CEnd<=iWidth-1) CEnd++;
CStart++;
iXpos=CStart*struScrMsp.iChrWidth;
for (i=0;i<(CEnd-CStart)/2;i++)
{
memset(CurrChinese,0x00,sizeof(CurrChinese));
//memcpy(CurrChinese,szText+2*i,2);
CurrChinese[0]=ScreenBuf[CRow][i*2+CStart].ch ;
CurrChinese[1]=ScreenBuf[CRow][i*2+CStart+1].ch ;
#ifdef UNICODE
ExtTextOut(hDC,iXpos,iYpos,ETO_CLIPPED,&TextRect,_T(" "),2,NULL);
memset(wcText,0,sizeof(wcText));
// MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,CurrChinese,2,wcText,2);
WORD wGB;
wGB=MAKEWORD(CurrChinese[0],CurrChinese[1]);
csCodeConv.GBToUnicode(wGB,(WORD *)wcText);
ExtTextOut(hDC,iXpos,iYpos,ETO_CLIPPED,&TextRect,wcText,1,NULL);
#else
TextOut(hDC,iXpos,iYpos," ",2);
TextOut(hDC,iXpos,iYpos,CurrChinese,2);
#endif
iXpos=iXpos+struScrMsp.iChrWidth*2;
}
break;
case 2://制表符
// pDC->TextOut(iXpos,iYpos,szText,strlen(szText));
// break;
for (i=0;(unsigned int)i<strlen(szText);i++)
{
ExtTextOut(hDC,iXpos,iYpos,ETO_CLIPPED,&TextRect,_T(" "),1,NULL);
// TextOut(hDC,iXpos,iYpos," ",1);
iHalfWidth=struScrMsp.iChrWidth/2;
iHalfHigh=struScrMsp.iChrHigh/2;
switch(szText[i])
{
case '\x6a': //'j'
/*
MoveToEx(hDC,iXpos,iYpos+iHalfHigh,NULL);
LineTo(hDC,iXpos+iHalfWidth,iYpos+iHalfHigh);
LineTo(hDC,iXpos+iHalfWidth,iYpos);
*/
arrEndPoint[0].x=iXpos;
arrEndPoint[0].y=iYpos+iHalfHigh;
arrEndPoint[1].x=iXpos+iHalfWidth;
arrEndPoint[1].y=iYpos+iHalfHigh;
arrEndPoint[2].x=iXpos+iHalfWidth;
arrEndPoint[2].y=iYpos;
Polyline(hDC,arrEndPoint,3);
break;
case '\x6b'://'k'
/*
MoveToEx(hDC,iXpos,iYpos+iHalfHigh,NULL);
LineTo(hDC,iXpos+iHalfWidth,iYpos+iHalfHigh);
LineTo(hDC,iXpos+iHalfWidth,iYpos+struScrMsp.iChrHigh);
*/
arrEndPoint[0].x=iXpos;
arrEndPoint[0].y=iYpos+iHalfHigh;
arrEndPoint[1].x=iXpos+iHalfWidth;
arrEndPoint[1].y=iYpos+iHalfHigh;
arrEndPoint[2].x=iXpos+iHalfWidth;
arrEndPoint[2].y=iYpos+struScrMsp.iChrHigh;
Polyline(hDC,arrEndPoint,3);
break;
case '\x6c'://'l'
/*
MoveToEx(hDC,iXpos+struScrMsp.iChrWidth,iYpos+iHalfHigh,NULL);
LineTo(hDC,iXpos+iHalfWidth,iYpos+iHalfHigh);
LineTo(hDC,iXpos+iHalfWidth,iYpos+struScrMsp.iChrHigh);
*/
arrEndPoint[0].x=iXpos+struScrMsp.iChrWidth;
arrEndPoint[0].y=iYpos+iHalfHigh;
arrEndPoint[1].x=iXpos+iHalfWidth;
arrEndPoint[1].y=iYpos+iHalfHigh;
arrEndPoint[2].x=iXpos+iHalfWidth;
arrEndPoint[2].y=iYpos+struScrMsp.iChrHigh;
Polyline(hDC,arrEndPoint,3);
break;
case '\x6d'://'m'
/*
MoveToEx(hDC,iXpos+struScrMsp.iChrWidth,iYpos+iHalfHigh,NULL);
LineTo(hDC,iXpos+iHalfWidth,iYpos+iHalfHigh);
LineTo(hDC,iXpos+iHalfWidth,iYpos);
*/
arrEndPoint[0].x=iXpos+struScrMsp.iChrWidth;
arrEndPoint[0].y=iYpos+iHalfHigh;
arrEndPoint[1].x=iXpos+iHalfWidth;
arrEndPoint[1].y=iYpos+iHalfHigh;
arrEndPoint[2].x=iXpos+iHalfWidth;
arrEndPoint[2].y=iYpos;
Polyline(hDC,arrEndPoint,3);
break;
case '\x6f'://'o'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -