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

📄 vt100disp.cpp

📁 vt100终端仿真程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#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 + -