📄 cursor.cpp
字号:
#include "stdafx.h"
#include "cursor.h"
#include "screen.h"
#include "Vt100Disp.h"
extern int g_iArrPara[50]; //函数参数组 iParam[0] 存放参数个数,iParam[1],iParam[2]...为相应参数
extern struct struScreen struScrMsp;
struct struSaveCurStatus struSaveMsp;
extern HWND hOutWnd;
extern int iWidth;
//光标****************************************
//光标状态
//0---CSI ?25h 光标显示
int SetCursorDisplay()
{
//??
struScrMsp.iCursorDisplay = 0;
SetCursor(struScrMsp.iCursorState );
// pWnd->ShowCaret();
return 0;
}
//1---CSI ?25l 光标消隐
int SetCursorHide()
{
//??
struScrMsp.iCursorDisplay = 1;
HideCaret(hOutWnd);
return 0;
}
//光标类型
//0---CSI /0j 闪烁块光标
int SetCursorFlashBlock()
{
//??
// DisplayCursor();
struScrMsp.iCursorState = 0 ;
SetCursor(0);
return 0;
}
//1---CSI /1j 闪烁线光标
int SetCursorFlashLine()
{
//??
// DisplayCursor();
struScrMsp.iCursorState = 1;
SetCursor(1);
return 0;
}
//2---CSI /2j 稳态块光标
int SetCursorStaticBlock()
{
//??
// DisplayCursor();
struScrMsp.iCursorState = 2;
SetCursor(2);
return 0;
}
//3---CSI /3j 稳态线光标
int SetCursorStaticLine()
{
//??
// DisplayCursor();
struScrMsp.iCursorState = 3;
SetCursor(3);
return 0;
}
//TAB设置
//gTabState
//0---ESC H 在当前列上设置制表位
int SetCurrentTab()
{
struScrMsp.iArrTab[struScrMsp.iXPos] = 1;
return 0;
}
//1---CSI g或 CSI 0 g 清除当前列上的制表位
int ClearCurrentTab()
{
struScrMsp.iArrTab[struScrMsp.iXPos] = 0;
return 0;
}
//2---CSI 3 g 清除所有列上的制表位
int ClearAllTab()
{
int iLoop;
for(iLoop=0;iLoop<iWidth;iLoop++)
struScrMsp.iArrTab[struScrMsp.iXPos] = 0;
return 0;
}
//光标定位
//CSI Pl;Pc H或CSI Pl;Pc f 光标移动到Pl行Pc列
int SetCursorPositionH()
{
if (g_iArrPara[0] != 2)
{
if (g_iArrPara[0]==0)
{
CursorMoveTo(0,0);
return 0;
}
return 1;
}
CursorMoveTo(g_iArrPara[1]-1,g_iArrPara[2]-1);
return 0;
}
int SetCursorPositionF()
{
if (g_iArrPara[0] != 2)
return 1;
CursorMoveTo(g_iArrPara[1]-1,g_iArrPara[2]-1);
return 0;
}
//光标移动
// CSI Pn A 光标上移Pn行
int CursorMoveUp()
{
if (g_iArrPara[0] != 1)
return 1;
CursorMoveTo(struScrMsp.iYPos - g_iArrPara[1],struScrMsp.iXPos);
return 0;
}
// CSI Pn B 光标下移Pn行
int CursorMoveDown()
{
if (g_iArrPara[0] != 1)
return 1;
CursorMoveTo(struScrMsp.iYPos + g_iArrPara[1],struScrMsp.iXPos);
return 0;
}
// CSI Pn C 光标右移Pn列
int CursorMoveRight()
{
if (g_iArrPara[0] != 1)
return 1;
CursorMoveTo(struScrMsp.iYPos ,struScrMsp.iXPos + g_iArrPara[1]);
return 0;
}
// CSI Pn D 光标左移Pn列
int CursorMoveLeft()
{
if (g_iArrPara[0] != 1)
return 1;
if ((struScrMsp.iXPos - g_iArrPara[1]) < 0)
struScrMsp.iXPos = 0;
else
struScrMsp.iXPos = struScrMsp.iXPos - g_iArrPara[1];
//?
CursorMoveTo(struScrMsp.iYPos ,struScrMsp.iXPos );
return 0;
}
//ESC E或NEL 光标下移1行
int CursorMoveDownRow()
{
if (struScrMsp.iYPos <struScrMsp.iButtomRow)//光标下移
CursorMoveTo(struScrMsp.iYPos+1,struScrMsp.iXPos );
else//滚屏
ScreenRollUp();
return 0;
}
//ESC M 或RT 光标上移1行
int CursorMoveUpRow()
{
if (struScrMsp.iYPos >struScrMsp.iTopRow )
CursorMoveTo(struScrMsp.iYPos-1,struScrMsp.iXPos);
else
ScreenRollDown();
return 0;
}
// 状态保存
//ESC 7 保存终端当前状态:
int SaveState()
{
struSaveMsp.iXPosSave = struScrMsp.iXPos;//保存光标位置X
struSaveMsp.iYPosSave = struScrMsp.iYPos;//保存光标位置Y
struSaveMsp.iRowBackSave = struScrMsp.iRowBack ;//保存行反绕状态 iRowBack
struSaveMsp.iOriginModeSave = struScrMsp.iOriginMode ;//保存原点方式 iOriginMode
//选择清属性 暂无
return 0;
}
//ESC 8 恢复上述状态
int RestoreState()
{
struScrMsp.iXPos = struSaveMsp.iXPosSave;//恢复光标位置X
struScrMsp.iYPos = struSaveMsp.iYPosSave;//恢复光标位置Y
struScrMsp.iRowBack = struSaveMsp.iRowBackSave ;//恢复行反绕状态 iRowBack
struScrMsp.iOriginMode = struSaveMsp. iOriginModeSave;//恢复原点方式 iOriginMode
//选择清属性 暂无
return 0;
}
//"\x1b[C",向右光标键==光标右移1行
int CursorMoveRightCol()
{
CursorMoveTo(struScrMsp.iYPos ,struScrMsp.iXPos +1);
return 0;
}
//"\x1b[D",向左光标键==光标左移1行
int CursorMoveLeftCol()
{
CursorMoveTo(struScrMsp.iYPos ,struScrMsp.iXPos -1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -